ESP32-CAM之ST7789图像显示

ESP32-CAM之ST7789

最近笔者在学习使用安信可的ESP32-CAM开发板,该开发板自带一个OV2640摄像头。
官方提供的例程可以将摄像头视频通过WIFI传输到网页显示,而笔者手里正好有一块240x240像素的屏幕,便想将摄像头的图像显示到该屏幕上。

从esp32-camera\sensor.h 头文件中可以找到

#define OV9650_PID     (0x96)
#define OV2640_PID     (0x26)
#define OV7725_PID     (0x77)
#define OV3660_PID     (0x36)
图像分辨率
typedef enum {
    FRAMESIZE_QQVGA,    // 160x120
    FRAMESIZE_QQVGA2,   // 128x160
    FRAMESIZE_QCIF,     // 176x144
    FRAMESIZE_HQVGA,    // 240x176
    FRAMESIZE_QVGA,     // 320x240
    FRAMESIZE_CIF,      // 400x296
    FRAMESIZE_VGA,      // 640x480
    FRAMESIZE_SVGA,     // 800x600
    FRAMESIZE_XGA,      // 1024x768
    FRAMESIZE_SXGA,     // 1280x1024
    FRAMESIZE_UXGA,     // 1600x1200
    FRAMESIZE_QXGA,     // 2048*1536
    FRAMESIZE_INVALID
} framesize_t;
图像格式
typedef enum {
    PIXFORMAT_RGB565,    // 2BPP/RGB565
    PIXFORMAT_YUV422,    // 2BPP/YUV422
    PIXFORMAT_GRAYSCALE, // 1BPP/GRAYSCALE
    PIXFORMAT_JPEG,      // JPEG/COMPRESSED
    PIXFORMAT_RGB888,    // 3BPP/RGB888
    PIXFORMAT_RAW,       // RAW
    PIXFORMAT_RGB444,    // 3BP2P/RGB444
    PIXFORMAT_RGB555,    // 3BP2P/RGB555
} pixformat_t;

可以看到Arduino core for the ESP32库支持4种摄像头,ESP32-CAM开发板搭载的是OV2640,而IPS屏幕像素为240x240,所以选FRAMESIZE_HQVGA(240x176)格式。
查看 <Arduino_ST7789.h> 库文件

// Color definitions
#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

void Arduino_ST7789::drawPixel(int16_t x, int16_t y, uint16_t color) {
  if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
  setAddrWindow(x,y,x+1,y+1);
  SPI_BEGIN_TRANSACTION();
  DC_HIGH();
  CS_LOW();
  spiwrite(color >> 8);
  spiwrite(color);
  CS_HIGH();
  SPI_END_TRANSACTION();
}

可以看到该驱动库采用RGB颜色空间,比如
RED=0xF800=11111_000000_00000,
GREEN=0x07E0=00000_111111_00000,BLUE=0x001F=00000_000000_11111,所以每个像素点为16位数据,即RGB565格式。

使用以下函数将OV2640图像格式设置为RGB565,分辨率设置为240x176。

  .pixel_format = PIXFORMAT_RGB565,
  .frame_size = FRAMESIZE_HQVGA,

使用以下函数将单帧图像数据通过串口输出到串口调试助手

Serial.write(fb->buf, fb->len);

接收数据为下图所示,单帧RGB565格式图像数据为84480字节,刚好等于 240 x 176 x 2,该帧图像数据并不像JPEG图像输出数据那样有头部格式字节,所以当笔者将该图像数据存到内存卡里时,在电脑端会显示无法打开该图像。
在这里插入图片描述
下图为单帧JPEG格式图像数据:
这个单帧数据数据量有点问题,且每次接收到的都不太一样,可能传输过程中出了点错误。
但是数据前面的FF DB FF E0 是正确的JPEG格式。
而且每帧的数据量比RGB565格式少很多,后面有时间再研究图像格式。
在这里插入图片描述
好了。根据上面的内容我们就可以写程序了。
直接根据ESP32官方camera例程修改。
主要的函数为:
每一个像素点数据为RGB565单帧数据的每两个字节组合而成。

void camera_show(void)
{
    unsigned long i=0;
    camera_fb_t *fb = esp_camera_fb_get();
    //单帧图像数据输出
//    delay(2000);
//    delay(2000);
//    delay(2000);
//    Serial.write(fb->buf, fb->len);
//    delay(2000);
//    delay(2000);
//    delay(2000);
    for(uint8_t y = 0; y <SCREEN_HEIGHT; y ++)
    {
      for(uint8_t x = 0; x <SCREEN_WIDTH; x ++)
      {
        //RGB565格式 240X176
        tft.drawPixel(x,60+y,((fb->buf[2*i])<<8)|(fb->buf[2*i+1]));
        i++;
       }
    }
    esp_camera_fb_return(fb);
}

图像显示效果:

在这里插入图片描述
这个屏幕正常的显示效果是有目共睹的好,但是测试显示效果不太清晰,可能还需要设置一下OV2640的一些参数才能达到更清晰的效果,然后笔者在屏幕的左上角显示了帧率,可以看到平均两秒一帧(真是有够慢的)。由于是arduino开发,不太好改速率,后面有时间慢慢深入库文件再来提高速度吧。

完整程序及相关驱动库链接

  • 20
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
### 回答1: 首先,ESP32-S3是一款强大的微控制器,它可以通过GPIO引脚来驱动各种外设,包括LCD显示屏。ST7789是一款高速SPI接口驱动的彩色LCD控制器芯片,它可以驱动各种类型的彩色LCD显示屏。 要驱动ST7789显示屏,首先需要连接ESP32-S3的SPI接口和ST7789芯片,然后需要编写SPI通信程序。这个程序需要使用SPI库来控制SPI总线,同时通过GPIO引脚来控制ST7789芯片的复位、片选等引脚。接下来,需要编写初始化程序来设置ST7789芯片的显示模式和显示参数,如分辨率、字体大小等等。最后,可以编写显示程序来在LCD显示屏上显示想要的图形、文字等内容。 在驱动ST7789时需要注意几点。首先,需要根据ST7789的数据手册设置正确的初始化参数,以确保LCD显示效果正常。其次,在数据传输过程中需要注意时序控制,否则会导致传输数据出错。最后,需要注意LCD显示带宽的限制,以避免传输速度过慢或数据传输错误。 总之,驱动ST7789需要同时注意ESP32-S3和ST7789的特性和要求,编写合适的程序来完成SPI通信和LCD显示。不仅需要掌握SPI接口的编程技能,还需要熟悉ST7789芯片的工作原理和各种参数设置,才能保证LCD显示效果的稳定性和精准度。 ### 回答2: ESP32-S3是一款集成了WiFi和蓝牙功能的微控制器,可用于IoT和无线通信应用。st7789是一款常用的TFT-LCD显示屏驱动器,可用于控制显示分辨率为240x320的彩色屏幕。 要驱动st7789显示屏,需要将SPI总线与ESP32-S3的I/O口连接。使用SPI总线可以更快地传输数据,增加显示屏刷新速度。要驱动视觉效果,我们可以使用Adafruit GFX库或其他类似库。这些库提供了绘制各种形状和文本的函数,可动态呈现图形而无需逐个像素地写入。 在编写代码时,需要将st7789的初始化和配置放在setup函数中。这包括设置databit和频率以及其他控制参数。然后,将渲染过程放在主循环中,以确保显示屏持续更新。 总的来说,驱动st7789显示屏与ESP32-S3并不困难,只需要连接正确的SPI信号和使用适当的库即可。在实际应用中,可以根据需要进行优化和调整以获得更好的性能和视觉效果。 ### 回答3: ESP32-S3是一款高性能、高集成度、低功耗的Wi-Fi SoC芯片,具有强大的硬件支持和易于开发的软件API。ST7789是一款早期的SPI接口驱动的彩色液晶显示器,可以用于显示文本和图像,并具有高亮度和广泛的工作温度范围。 要驱动ST7789液晶屏幕,首先需要连接ESP32-S3芯片和ST7789显示器。可以通过SPI接口来实现连接。在接线完成后,需要正确配置ESP32-S3芯片的SPI引脚。配置后,通过SPI接口向ST7789发送一系列命令和数据,从而控制液晶屏幕的显示。 为了方便驱动ST7789液晶屏幕,可以使用现有的驱动程序库。例如,Adafruit_ST7789库(https://github.com/adafruit/Adafruit-ST7789-Library)可以用于驱动ST7789液晶屏幕,支持SPI接口和多种显示模式,如全彩色、红色、黑色和白色。可以根据具体的需求进行配置。 在使用ESP32-S3驱动ST7789液晶屏幕时应该注意一些问题。尽可能避免长时间运行高亮度显示,以防止液晶屏幕老化。在发送命令和数据时,应该根据液晶屏幕的规格进行配置。如果具有多个SPI设备,则应注意选择正确的设备。为了提高显示效果,可以使用外部电源供电以提高工作电压。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值