ESP32-S3 WEB+LCD 显示摄像头

一、硬件准备

这里用到Kevincoooool的硬件,这里我贴出来,需要的可以去买支持一下这位大佬
https://item.taobao.com/item.htm?spm=a230r.1.14.16.1ca2390ezPeKek&id=655913924680&ns=1&abbucket=17#detail

二、流程

这里我采用直接拉官方的例子,不采用店家的demo(下面一些基本操作就不贴命令了)

  1. 拉取ESP-WHO ,拉取ESP-IDF 4.4

  2. 进入例子esp-who/examples/human_face_detection/web

  3. 设置芯片为ESP32-S3

  4. menuconfig 配置 ,摄像头用到的是OV2640,LCD控制器是ILI9341

    1.配置串口打印输出,这里默认的是USB,改回UART0
       Channel for console output (Default: UART0)  --->
    2.配置LCD驱动ILI9341 (这个配置可以全打开,后面程序会对LCD自动匹配)
    		→ Component config → LCD Drivers → Select Screen Controller
    	     Espressif IoT Development Framework Configuration
    	[*] ILI9341
    3.配置OV2640 这里默认是全部支持
    		(Top) → Component config → Camera configuration
    	     Espressif IoT Development Framework Configuration
    	[*] Support OV7670 VGA
    	[*] Support OV7725 VGA
    	[*] Support NT99141 HD
    	[*] Support OV2640 2MP
    	[*] Support OV3660 3MP
    	[*] Support OV5640 5MP
    	[*] Support GC2145 2MP
    	[*] Support GC032A VGA
    	[*] Support GC0308 VGA
    	[*] Support BF3005(BYD3005) VGA
    	[*] Support BF20A6(BYD20A6) VGA
    	    I2C peripheral to use for SCCB (I2C1)  --->
    
    
    
  5. 修改程序 (这里只贴修改部分)
    (1).app_main.cpp
    摄像头格式:PIXFORMAT_JPEG
    使用VGA格式
    不使用AI算法
    fb_count = 6 (多给缓冲,默认放到SRAM)

    extern "C" void app_main()
    {
        app_wifi_main();
        app_mdns_main();
    
        xQueueAIFrame = xQueueCreate(2, sizeof(camera_fb_t *));
        xQueueHttpFrame = xQueueCreate(2, sizeof(camera_fb_t *));
        //FRAMESIZE_UXGA FRAMESIZE_VGA FRAMESIZE_QVGA
        register_camera(PIXFORMAT_JPEG, FRAMESIZE_VGA, 6, xQueueAIFrame);
    
        
        //register_human_face_detection(xQueueAIFrame, NULL, NULL, xQueueHttpFrame);
       // register_cat_face_detection(xQueueAIFrame, NULL, NULL, xQueueHttpFrame);
        register_httpd(xQueueAIFrame, NULL, true);
        register_lcd(xQueueAIFrame, NULL, true);
    
        i2s_driver_init();
    }
    
    

    (2).esp-who\components\modules\lcd\who_lcd.h

    修改引脚,H V 改成320 x 240

    #define BOARD_LCD_MOSI 11
    #define BOARD_LCD_MISO -1
    #define BOARD_LCD_SCK 12
    #define BOARD_LCD_CS 10
    #define BOARD_LCD_DC 9
    #define BOARD_LCD_RST -1
    #define BOARD_LCD_BL -1
    #define BOARD_LCD_PIXEL_CLOCK_HZ (40 * 1000 * 1000)
    #define BOARD_LCD_BK_LIGHT_ON_LEVEL 0
    #define BOARD_LCD_BK_LIGHT_OFF_LEVEL !BOARD_LCD_BK_LIGHT_ON_LEVEL
    #define BOARD_LCD_H_RES 320
    #define BOARD_LCD_V_RES 240
    #define BOARD_LCD_CMD_BITS 8
    #define BOARD_LCD_PARAM_BITS 8
    #define LCD_HOST SPI2_HOST
    

    (3).esp-who\components\modules\lcd\who_lcd.c
    使用RGB565解码,并且2X压缩给到显示屏
    该改成320x240都需要改
    .swap_data = 1
    .rotate = 4

    esp_err_t register_lcd(const QueueHandle_t frame_i, const QueueHandle_t frame_o, const bool return_fb)
    {
        spi_config_t bus_conf = {
            .miso_io_num = BOARD_LCD_MISO,
            .mosi_io_num = BOARD_LCD_MOSI,
            .sclk_io_num = BOARD_LCD_SCK,
            .max_transfer_sz = 2 * 320 * 240 + 10,
        };
        spi_bus_handle_t spi_bus = spi_bus_create(SPI2_HOST, &bus_conf);
    
        scr_interface_spi_config_t spi_lcd_cfg = {
            .spi_bus = spi_bus,
            .pin_num_cs = BOARD_LCD_CS,
            .pin_num_dc = BOARD_LCD_DC,
            .clk_freq = 40 * 1000000,
            .swap_data = 1,
        };
    
        scr_interface_driver_t *iface_drv;
        scr_interface_create(SCREEN_IFACE_SPI, &spi_lcd_cfg, &iface_drv);
        esp_err_t ret = scr_find_driver(SCREEN_CONTROLLER_ILI9341, &g_lcd);
        if (ESP_OK != ret)
        {
            return ret;
            ESP_LOGE(TAG, "screen find failed");
        }
    
        scr_controller_config_t lcd_cfg = {
            .interface_drv = iface_drv,
            .pin_num_rst = BOARD_LCD_RST,
            .pin_num_bckl = BOARD_LCD_BL,
            .rst_active_level = 0,
            .bckl_active_level = 0,
            .offset_hor = 0,
            .offset_ver = 0,
            .width = 240,
            .height = 320,
            .rotate = 4,
        };
        ret = g_lcd.init(&lcd_cfg);
        if (ESP_OK != ret)
        {
            return ESP_FAIL;
            ESP_LOGE(TAG, "screen initialize failed");
        }
    
        g_lcd.get_info(&g_lcd_info);
        ESP_LOGI(TAG, "Screen name:%s | width:%d | height:%d", g_lcd_info.name, g_lcd_info.width, g_lcd_info.height);
    
        app_lcd_set_color(0x000000);
        vTaskDelay(pdMS_TO_TICKS(200));
        app_lcd_draw_wallpaper();
        vTaskDelay(pdMS_TO_TICKS(200));
    
        
        xQueueFrameI = frame_i;
        xQueueFrameO = frame_o;
        gReturnFB = return_fb;
        //下面暂时不运行了
        xTaskCreatePinnedToCore(task_process_handler, TAG, 4 * 1024, NULL, 5, NULL, 0);
    
        return ESP_OK;
    }
    

    (4).esp-who\components\modules\camera\who_camera.h

    频率改成20M,按照店家说,这里不会影响,但我实测,这里使用原本的15M,WEB端会有卡顿情况出现

    #define XCLK_FREQ_HZ 20000000
    

    (5).esp-who\components\modules\camera\who_camera.c
    不需要修改,这里可以关注一下这些参数
    config.jpeg_quality = 12; 越大,则图片质量越差,数据量小,速度快
    config.fb_location = CAMERA_FB_IN_PSRAM; FB放到SRAM

三、结果在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值