• 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)  --->
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    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();
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      (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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15

      (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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63

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

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

      #define XCLK_FREQ_HZ 20000000
      
      • 1

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

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

    在这里插入图片描述

  • 相关阅读:
    垃圾回收的知识点
    Pandas数据分析:快速图表可视化各类操作详解+实例代码(三)
    Linux·设备
    占据财富管理数字化转型高地,「双录+可回溯」齐护航!
    心理学综述类期刊介绍|《New Ideas In Psychology》
    Redis 3.2.3 crashed by signal: 11 服务宕机问题排查
    C++二叉树实验
    关联容器(字典)map
    数据宝荣获“2021-2022年度最具影响力数字化转型服务商”称号
    科学并不等于实验 南瓜科学给出全新答案
  • 原文地址:https://blog.csdn.net/xuan530482366/article/details/126889181