ESP32-S3-RLCD-4.2 使用教程

ESP32-S3-RLCD-4.2


本产品是一款基于 ESP32-S3 的全反射屏 AIoT 开发板,支持 Wi-Fi 与 BLE 双模通信,搭载 4.2 英寸全反射显示屏 (RLCD),低功耗,显示效果接近墨水屏,更快的刷新响应。板载音频编解码电路、双麦克风、喇叭、SHTC3 高精度温湿度传感器、Micro SD 卡槽,RTC 接口以及电池充放电管理电路等,并预留 USB、UART、I2C 和多路 GPIO 接口,方便扩展。支持 AI 语音、温湿度监测与物联网控制,适用于 DIY 桌面智能摆件、电子日历、AI 智能体等,也可用于产品原型开发。

产品特性

  • 搭载高性能 Xtensa 32 位 LX7 双核处理器,主频高达 240MHz
  • 支持 2.4GHz Wi-Fi 和 Bluetooth 5 (LE),内置天线
  • 内置 512KB SRAM 和 384KB ROM,同时叠封集成 16MB Flash 与 8MB PSRAM
  • 搭载 4.2 英寸全反光屏,分辨率 300 × 400,具有反射成像、无需背光等特性
  • 配备双麦克风阵列,可实现降噪和回声消除等音频算法,适合精准的语音识别和近场 / 远场语音唤醒应用
  • 板载 PCF85063 RTC 实时时钟与 SHTC3 温湿度传感器,可实现精准 RTC 时间管理及温湿度监测
  • 板载 18650 锂电池座及 RTC 备用电池座 (需要使用可充电 RTC 电池),支持主供电与 RTC 独立续航双模式
  • 板载 Micro SD 卡槽,可外接 Micro SD 卡存储图片或文件
  • 板载 KEY、BOOT 两个可自定义功能的侧边按钮,方便使用按钮进行自定义功能开发
  • 预留 2 × 8 排母接口 (2.54mm 间距),方便客户外接扩展使用

资源简介

  1. ESP32-S3-WROOM-1-N16R8 Wi-Fi 和蓝牙 SoC,240MHz 运行频率,叠封 16MB Flash 和 8MB PSRAM
  2. ES7210 ADC 芯片实现回声消除电路
  3. ES8311 低功耗音频编解码芯片
  4. BOOT 按键 按住 BOOT 键,重新上电可强制进入下载模式
  5. PWR 按键 长按下电,单击上电
  6. KEY 按键 自定义功能按键
  7. SHTC3 温湿度传感器 提供环境温湿度测量,便于实现环境监测功能
  8. PCF85063 RTC 时钟芯片,支持时间保持功能
  9. MX1.25 2PIN 扬声器接口 音频输出信号,外接扬声器
  10. RTC 独立电源接口 仅支持 PH1.0 可充电的 RTC 电池
  11. 2 × 8PIN 2.54mm 间距排母
  12. 18650 电池座
  13. 双麦克风阵列设计 双麦克风阵列,搭配 ES7210 可实现回声消除
  14. CHG 充电指示灯 电池充满指示灯熄灭
  15. WRN 警告指示灯 电池反接指示灯常亮
  16. Type-C 接口 用于烧录程序和日志打印
  17. Micro SD 卡槽 支持 FAT32 格式的 SD 卡,用于数据扩展

接口介绍

产品尺寸

Arduino 开发

配置开发环境

1. 安装和配置 Arduino IDE

请参考 安装和配置 Arduino IDE 教程 下载安装 Arduino IDE 并添加 ESP32 支持。

2. 安装库

  • 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
  • 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
  • 可从 该处 下载 ESP32-S3-RLCD-4.2 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
库或文件名称说明版本安装方式
LVGL图形库v8.3.11/v9.3.0"离线安装"
SensorLib传感器库v0.3.1"离线/在线 安装"
版本兼容性说明

LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。

3. Arduino 工程参数设置

示例程序

Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。

示例程序基础例程说明依赖库
01_WIFI_AP设置为 AP 模式,可获取接入设备的 IP 地址-
02_WIFI_STA设置为 STA 模式,可接入 WiFi 获取 IP 地址-
03_ADC_Test获取锂电池的电压值-
04_I2C_PCF85063打印 RTC 芯片的实时时间SensorLib
05_I2C_SHTC3打印温湿度传感器的数据-
06_SD_Card加载显示 SD 卡的信息-
07_Audio_Test扬声器播放麦克风录到的声音LVGL V8.3.11
08_LVGL_V8_TestLVGLV8 例程LVGL V8.3.11
09_LVGL_V9_TestLVGLV9 例程LVGL V9.3.0

01_WIFI_AP

【程序说明】

  • 该示例可将开发板设置为热点,允许手机或其他处于 STA 模式的设备连接到开发板。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • 在 01_WIFI_AP.ino 文件找到 ssid 和 password,然后手机或其他处于 STA 模式的设备即可使用该 ssid 和 password 连接到开发板。

    const char *ssid = "ESP32_AP";
    const char *password = "12345678";

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到打印输出的 ADC 的值和电压,如下图所示:

02_WIFI_STA

【程序说明】

  • 该示例可将开发板配置为 STA 设备,以连接路由器,从而接入系统网络。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • 在 02_WIFI_STA.ino 文件找到 ssid 和 password,然后将其修改为当前环境中可用路由器的 SSID 和 Password。

    const char *ssid = "you_ssid";
    const char *password = "you_password";

【运行效果】

  • 烧录完程序,打开串口终端,如果设备连接成功热点之后,会输出所获取的 IP 地址,如图:

03_ADC_Test

【程序说明】

  • 通过 GPIO 连接的模拟量电压经过 ADC 转换成数字量,然后通过计算得到实际的锂电池电压,并打印到终端。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • Adc_PortInit(void):初始化 ADC1,包括创建 ADC 单次触发单元并配置 ADC1 的通道 3。
  • float Adc_GetBatteryVoltage(int *data):读取 ADC1 通道 3 的值,返回实际的电压值。
  • uint8_t Adc_GetBatteryLevel(void):返回电池的百分比。
  • void Adc_LoopTask(void *arg):创建一个 ADC 任务,该任务每隔 1 秒读取一次 ADC 的值并打印到串口。

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到打印输出的 ADC 的值和电压,如下图所示:

04_I2C_PCF85063

【程序说明】

  • 通过 I2C 协议,分别对 PCF85063 芯片进行初始化、设置时间、间隔读取时间,然后打印到终端。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

I2cMasterBus I2cbus(14,13,0);          //I2C 总线初始化
void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("rtc-example run \n");
Rtc_Setup(&I2cbus, 0x51); //初始化 RTC RTC 从机地址 0x51
Rtc_SetTime(2025, 9, 9, 20, 15, 30); //设置 RTC 时间
}

void loop() {
rtcTimeStruct_t rtcData;
Rtc_GetTime(&rtcData); //获取 RTC 实时时间
Serial.printf("%d/%d/%d %02d:%02d:%02d \n",
rtcData.year, rtcData.month, rtcData.day, rtcData.hour, rtcData.minute,
rtcData.second);
delay(1000);
}

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到打印输出的 RTC 时间,如下图所示:

05_I2C_SHTC3

【程序说明】

  • 通过 I2C 协议,对 SHTC3 芯片进行初始化设置,然后每隔 1 秒读取的温湿度信息打印到终端。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

I2cMasterBus I2cbus(14,13,0);
Shtc3Port *shtc3port = NULL;

void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("shtc3-example run \n");
shtc3port = new Shtc3Port(I2cbus); //初始化 SHTC3
}

void loop() {
float rh,temp;
shtc3port->Shtc3_ReadTempHumi(&temp,&rh); //获取温湿度数据
Serial.printf("RH:%.2f%%,Temp:%.2f° \n",rh,temp);
delay(1000);
}

【运行效果】

  • 打开串口监控,可以看到打印输出的温湿度数据,如下图所示:

06_SD_Card

【程序说明】

  • 通过 SDMMC 方式驱动 SD 卡,成功挂载之后把 SD 卡信息打印到终端。

【硬件连接】

  • 上电之前先给板子装上 FatFs 格式的 SD 卡

【代码分析】

#define sdcard_write_Test                  

CustomSDPort *sdcardPort = NULL;

void setup()
{
Serial.begin(115200);
delay(2000);
sdcardPort = new CustomSDPort("/sdcard"); //初始化 SDMMC 驱动
}

uint32_t value = 1;
char sdcard_read[45] = {""};
char sdcard_write[45] = {""};

void loop()
{
#ifdef sdcard_write_Test //测试 SD 卡读写功能
snprintf(sdcard_write,45,"sdcard_writeTest : %ld \n",value);
sdcardPort->SDPort_WriteFile("/sdcard/writeTest.txt",sdcard_write,strlen(sdcard_write));
vTaskDelay(pdMS_TO_TICKS(500));
sdcardPort->SDPort_ReadFile("/sdcard/writeTest.txt",(uint8_t *)sdcard_read,NULL);
Serial.printf("read data:%s\n",sdcard_read);
vTaskDelay(pdMS_TO_TICKS(500));
value++;
#endif
}

【运行效果】

  • 点击串口监控设备,可以看到输出的 SD 卡的信息,如下图所示:

07_Audio_Test

【程序说明】

  • 演示如何获取麦克风的数据,然后再通过扬声器播放。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • CodecPort_SetInfo("es8311 & es7210",1,16000,2,16):设置 Codec 芯片的采样率、通道数、位深。
  • CodecPort_SetSpeakerVol(100):设置播放增益 100 。
  • CodecPort_SetMicGain(35):设置麦克风增益 35 。
  • Codec_LoopTask(void *arg):Codec 任务,实现录音、播放等功能。

【运行效果】

  • 程序烧录完成后,如图:

    提示
    1. 双击 BOOT 按键即可进入录音模式,对着 MIC 说话,3 秒后自动结束
    2. 单击 BOOT 按键,播放刚刚录的声音
    3. 双击 KEY 按键,可以播放一段音乐
    4. 单击 KEY 按键,可以打断音乐播放

08_LVGL_V8_Test

【程序说明】

  • 演示如何通过 LVGL V8 显示图片,帮助用户快速上手 LVGL V8 。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

/*创建一个 IMG1 控件*/
ui->screen_img_1 = lv_img_create(ui->screen);
lv_obj_add_flag(ui->screen_img_1, LV_OBJ_FLAG_CLICKABLE);
lv_img_set_src(ui->screen_img_1, &_ein_alpha_400x300);
lv_img_set_pivot(ui->screen_img_1, 50,50);
lv_img_set_angle(ui->screen_img_1, 0);
lv_obj_set_pos(ui->screen_img_1, 0, 0);
lv_obj_set_size(ui->screen_img_1, 400, 300);
/*创建一个 IMG2 控件*/
ui->screen_img_2 = lv_img_create(ui->screen);
lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_CLICKABLE);
lv_img_set_src(ui->screen_img_2, &_2_alpha_400x300);
lv_img_set_pivot(ui->screen_img_2, 50,50);
lv_img_set_angle(ui->screen_img_2, 0);
lv_obj_set_pos(ui->screen_img_2, 0, 0);
lv_obj_set_size(ui->screen_img_2, 400, 300);
lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_HIDDEN);

【运行效果】

  • 程序烧录完成后,间隔 1.5 秒交替显示,如图:

09_LVGL_V9_Test

【程序说明】

  • 演示如何通过 LVGL V9 显示图片,帮助用户快速上手 LVGL V9。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

/*创建一个 IMG1 控件*/
ui->screen_img_1 = lv_image_create(ui->screen);
lv_obj_set_pos(ui->screen_img_1, 0, 0);
lv_obj_set_size(ui->screen_img_1, 400, 300);
lv_obj_add_flag(ui->screen_img_1, LV_OBJ_FLAG_CLICKABLE);
lv_image_set_src(ui->screen_img_1, &_ein_RGB565A8_400x300);
lv_image_set_pivot(ui->screen_img_1, 50,50);
lv_image_set_rotation(ui->screen_img_1, 0);
/*创建一个 IMG2 控件*/
ui->screen_img_2 = lv_image_create(ui->screen);
lv_obj_set_pos(ui->screen_img_2, 0, 0);
lv_obj_set_size(ui->screen_img_2, 400, 300);
lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_CLICKABLE);
lv_image_set_src(ui->screen_img_2, &_2_RGB565A8_400x300);
lv_image_set_pivot(ui->screen_img_2, 50,50);
lv_image_set_rotation(ui->screen_img_2, 0);

【运行效果】

  • 程序烧录完成后,间隔 1.5 秒交替显示,如图:

    ESP-IDF

    配置开发环境

    请参考 安装 ESP-IDF 开发环境

    示例程序

    ESP-IDF 示例程序位于 示例程序包 的 ESP-IDF 目录中。

    示例程序基础例程说明依赖库
    01_WIFI_AP设置为 AP 模式,可获取接入设备的 IP 地址-
    02_WIFI_STA设置为 STA 模式,可接入 WiFi 获取 IP 地址-
    03_ADC_Test获取锂电池的电压值-
    04_I2C_PCF85063打印 RTC 芯片的实时时间SensorLib
    05_I2C_SHTC3打印温湿度传感器的数据-
    06_SD_Card加载显示 SD 卡的信息-
    07_Audio_Test扬声器播放麦克风录到的声音LVGL V8.3.11
    08_LVGL_V8_TestLVGLV8 例程LVGL V8.3.11
    09_LVGL_V9_TestLVGLV9 例程LVGL V9.3.0
    10_FactoryProgram综合示例LVGL V8.3.11

    01_WIFI_AP

    【程序说明】

    • 该示例可将开发板设置为热点,允许手机或其他处于 STA 模式的设备连接到开发板。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    • 在 softap_example_main.c 文件找到 SSID 和 PASSWORD,然后手机或其他处于 STA 模式的设备即可使用该 SSID 和 PASSWORD 连接到开发板。

      #define EXAMPLE_ESP_WIFI_SSID      "waveshare_esp32"
      #define EXAMPLE_ESP_WIFI_PASSWORD "wav123456"

    【运行效果】

    • 烧录完程序,打开串口终端,如果设备连接成功热点之后,会输出该设备的 MAC 地址和 IP 地址,如图:

    02_WIFI_STA

    【程序说明】

    • 该示例可将开发板配置为 STA 设备,以连接路由器,从而接入系统网络。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    • 在 esp_wifi_bsp.c 文件找到 ssid 和 password,然后将其修改为当前环境中可用路由器的 SSID 和 Password。

      wifi_config_t wifi_config = {
      .sta = {
      .ssid = "PDCN",
      .password = "1234567890",
      },
      };

    【运行效果】

    • 烧录完程序,打开串口终端,如果设备连接成功热点之后,会输出所获取的 IP 地址,如图:

    03_ADC_Test

    【程序说明】

    • 通过 GPIO 连接的模拟量电压经过 ADC 转换成数字量,然后通过计算得到实际的锂电池电压,并打印到终端。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    • Adc_PortInit(void):初始化 ADC1,包括创建 ADC 单次触发单元并配置 ADC1 的通道 3。
    • float Adc_GetBatteryVoltage(int *data):读取 ADC1 通道 3 的值,返回实际的电压值。
    • uint8_t Adc_GetBatteryLevel(void):返回电池的百分比。
    • void Adc_LoopTask(void *arg):创建一个 ADC 任务,该任务每隔 1 秒读取一次 ADC 的值并打印到串口。

    【运行效果】

    • 程序编译下载完成,打开串口监控可以看到打印输出的 ADC 的值和电压,如下图所示:

    04_I2C_PCF85063

    【程序说明】

    • 通过 I2C 协议,分别对 PCF85063 芯片进行初始化、设置时间、间隔读取时间,然后打印到终端。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    • void Rtc_LoopTask(void *arg):创建一个 RTC 任务来实现 RTC 功能,每隔 1 秒读取一次 RTC 芯片的时钟,然后输出到终端。

    【运行效果】

    • 程序编译下载完成,打开串口监控可以看到打印输出的 RTC 时间,如下图所示:

    05_I2C_STHC3

    【程序说明】

    • 通过 I2C 协议,对 SHTC3 芯片进行初始化设置,然后每隔 1 秒读取的温湿度信息打印到终端。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    • void Shtc3_LoopTask(void *arg):创建一个 SHTC3 传感器任务,间隔 1 秒定时获取温湿度。

    【运行效果】

    • 打开串口监控,可以看到打印输出的温湿度数据,如下图所示:

    06_SD_Card

    【程序说明】

    • 通过 SDMMC 方式驱动 SD 卡,成功挂载之后把 SD 卡信息打印到终端。

    【硬件连接】

    • 上电之前先给板子装上 FatFs 格式的 SD 卡

    【代码分析】

    • Fatfs_LoopTask(void *arg):测试 SD 卡读写功能的任务,需要取消 #define sdcard_write_Test 宏定义的注释。

    【运行效果】

    • 点击串口监控设备,可以看到输出的 SD 卡的信息,如下图所示:

    07_Audio_Test

    【程序说明】

    • 演示如何获取麦克风的数据,然后再通过扬声器播放。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    • CodecPort_SetInfo("es8311 & es7210",1,16000,2,16):设置 Codec 芯片的采样率、通道数、位深。
    • CodecPort_SetSpeakerVol(100):设置播放增益 100 。
    • CodecPort_SetMicGain(35):设置麦克风增益 35 。
    • Codec_LoopTask(void *arg):Codec 任务,实现录音、播放等功能。

    【运行效果】

    • 程序烧录完成后,如图:

      提示
      1. 双击 BOOT 按键即可进入录音模式,对着 MIC 说话,3 秒后自动结束
      2. 单击 BOOT 按键,播放刚刚录的声音
      3. 双击 KEY 按键,可以播放一段音乐
      4. 单击 KEY 按键,可以打断音乐播放

    08_LVGL_V8_Test

    【程序说明】

    • 演示如何通过 LVGL V8 显示图片,帮助用户快速上手 LVGL V8 。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    /*创建一个 IMG1 控件*/
    ui->screen_img_1 = lv_img_create(ui->screen);
    lv_obj_add_flag(ui->screen_img_1, LV_OBJ_FLAG_CLICKABLE);
    lv_img_set_src(ui->screen_img_1, &_ein_alpha_400x300);
    lv_img_set_pivot(ui->screen_img_1, 50,50);
    lv_img_set_angle(ui->screen_img_1, 0);
    lv_obj_set_pos(ui->screen_img_1, 0, 0);
    lv_obj_set_size(ui->screen_img_1, 400, 300);
    /*创建一个 IMG2 控件*/
    ui->screen_img_2 = lv_img_create(ui->screen);
    lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_CLICKABLE);
    lv_img_set_src(ui->screen_img_2, &_2_alpha_400x300);
    lv_img_set_pivot(ui->screen_img_2, 50,50);
    lv_img_set_angle(ui->screen_img_2, 0);
    lv_obj_set_pos(ui->screen_img_2, 0, 0);
    lv_obj_set_size(ui->screen_img_2, 400, 300);
    lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_HIDDEN);

    【运行效果】

    • 程序烧录完成后,间隔 1.5 秒交替显示,如图:

    09_LVGL_V9_Test

    【程序说明】

    • 演示如何通过 LVGL V9 显示图片,帮助用户快速上手 LVGL V9。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    /*创建一个 IMG1 控件*/
    ui->screen_img_1 = lv_image_create(ui->screen);
    lv_obj_set_pos(ui->screen_img_1, 0, 0);
    lv_obj_set_size(ui->screen_img_1, 400, 300);
    lv_obj_add_flag(ui->screen_img_1, LV_OBJ_FLAG_CLICKABLE);
    lv_image_set_src(ui->screen_img_1, &_ein_RGB565A8_400x300);
    lv_image_set_pivot(ui->screen_img_1, 50,50);
    lv_image_set_rotation(ui->screen_img_1, 0);
    /*创建一个 IMG2 控件*/
    ui->screen_img_2 = lv_image_create(ui->screen);
    lv_obj_set_pos(ui->screen_img_2, 0, 0);
    lv_obj_set_size(ui->screen_img_2, 400, 300);
    lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(ui->screen_img_2, LV_OBJ_FLAG_CLICKABLE);
    lv_image_set_src(ui->screen_img_2, &_2_RGB565A8_400x300);
    lv_image_set_pivot(ui->screen_img_2, 50,50);
    lv_image_set_rotation(ui->screen_img_2, 0);

    【运行效果】

    • 程序烧录完成后,间隔 1.5 秒交替显示,如图:

    10_FactoryProgram

    【程序说明】

    • 驱动板载所有硬件,综合性示例,让用户可以快速了解产品。

    【硬件连接】

    • 使用 USB 线把板子接入电脑

    【代码分析】

    sdcardPort = new CustomSDPort("/sdcard"); //sdcard 初始化
    Adc_PortInit(); //Adc 初始化
    Custom_ButtonInit(); //按键初始化
    Rtc_Setup(&I2cbus,0x51); //Rtc 初始化
    Rtc_SetTime(2026,1,5,14,30,30); //设置 Rtc 时间
    shtc3port = new Shtc3Port(I2cbus); //shtc3 初始化
    espwifi_init(); //wifi sta 模式初始化
    CodecGroups = xEventGroupCreate();
    codecport = new CodecPort(I2cbus,"S3_RLCD_4_2"); //Codec 初始化
    codecport->CodecPort_SetInfo("es8311 & es7210",1,16000,2,16);
    codecport->CodecPort_SetSpeakerVol(100); //设置扬声器增益
    codecport->CodecPort_SetMicGain(35); //设置麦克风增益

    【运行效果】