之前提到过使用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) */

