【DigiKey好物畅享】Seeed Studio SenseCAP Indicator D1 基于Arduino的开发

之前提到过使用SquareLine Studio设计UI的展示界面,然后再配合使用ESP-IDF的编译烧录工具进行实际的开发工作,但对于很多人来说,可能刚开始使用或者实际确实不用对界面有过多需求,这时候就可以利用Arduino IDE进行开发。根据官方提供的原理图,也可以发现,Indicator 有两个 MCU,分别是 RP2040 和 ESP32S3,基于之前的esp-idf工具也只能对esp32芯片进行开发编程,因此要开发RP2040的话,也确实只能通过Arduino实现。

不难注意到,所有传感器都通过I2C协议连接到RP2040,而屏幕连接到 ESP32S3同时RP2040通过ESP32S3的引脚20和引脚19使用UART接口连接到 ESP32S3。基于这些理解,后续开发就有了大概的框架,即通过RP2040收发传感器信号,RP2040通过UART协议与ESP32交互通信,传递一些传感器的数据,最后ESP32将数据展示到屏幕上,完成整个的工作流程。

在此之前,首先要安装Arduino IDE,然后配置一些基本的库,这里使用的esp32的库由乐鑫提供而不是Arduino官方,版本选择3.1.2,Raspberry Pi Pico Arduino使用4.4.3,其他的库比如Adafruit TinyUSB、lvgl等可以根据实际开发需求安装。

在实际开发中,首先引入基本的库,Arduino_GFX图形库用于控制显示屏,PCA95x5库用于控制GPIO扩展芯片,定义GFX_BL为默认背光引脚。

#include <Arduino_GFX_Library.h>
#include <PCA95x5.h>
#define GFX_BL DF_GFX_BL

然后声明一下显示设备,并且调整一下显示的配置,这里我定义设备类型为ESP32_S3_RGB,重新定义背光引脚为45号引脚,并且创建一个软件SPI总线,配置了一下其中使用的引脚。

#if defined(DISPLAY_DEV_KIT)
Arduino_GFX *gfx = create_default_Arduino_GFX();
#else /* !defined(DISPLAY_DEV_KIT) */
#define GFX_DEV_DEVICE ESP32_S3_RGB
#define GFX_BL 45
Arduino_DataBus *bus = new Arduino_SWSPI(
    GFX_NOT_DEFINED /* DC */, PCA95x5::Port::P04 /* CS */,
    41 /* SCK */, 48 /* MOSI */, GFX_NOT_DEFINED /* MISO */);

然后创建RGB面板对象,配置各个控制信号引脚:

DE(数据使能):18

VSYNC(垂直同步):17

HSYNC(水平同步):16

PCLK(像素时钟):21

R0-R4:红色数据位0-4(共5位)

G0-G5:绿色数据位0-5(共6位)

B0-B4:蓝色数据位0-4(共5位)

配置时序参数:

水平同步极性、前廊、脉冲宽度、后廊

垂直同步极性、前廊、脉冲宽度、后廊

代码如下:

Arduino_ESP32RGBPanel *rgbpanel = new Arduino_ESP32RGBPanel(
    18 /* DE */, 17 /* VSYNC */, 16 /* HSYNC */, 21 /* PCLK */,
    4 /* R0 */, 3 /* R1 */, 2 /* R2 */, 1 /* R3 */, 0 /* R4 */,
    10 /* G0 */, 9 /* G1 */, 8 /* G2 */, 7 /* G3 */, 6 /* G4 */, 5 /* G5 */,
    15 /* B0 */, 14 /* B1 */, 13 /* B2 */, 12 /* B3 */, 11 /* B4 */,
    1 /* hsync_polarity */, 10 /* hsync_front_porch */, 8 /* hsync_pulse_width */, 50 /* hsync_back_porch */,
    1 /* vsync_polarity */, 10 /* vsync_front_porch */, 8 /* vsync_pulse_width */, 20 /* vsync_back_porch */);

然后创建一下显示设备,并且在setup和loop里基于之前lvgl代码修改编写自己想要的样式,就大致完成了基础demo的创建,可以继续后续的开发工作了。

Arduino_RGB_Display *gfx = new Arduino_RGB_Display(
    480 /* width */, 480 /* height */, rgbpanel, 2 /* rotation */, true /* auto_flush */,
    bus, GFX_NOT_DEFINED /* RST */, st7701_type1_init_operations, sizeof(st7701_type1_init_operations));
#endif /* !defined(DISPLAY_DEV_KIT) */