本产品是一款微雪 (Waveshare) 设计的高性能、高集成的微控制器开发板。板载了 3.5 英寸电容高清 IPS 屏、高度集成的电源管理芯片、RTC、低功耗音频编解码芯片等外设,方便开发并嵌入应用到产品中。无需组装接线,轻松畅玩小智 AI。

LCD 及其控制器
SPI 通信协议:

注:此处的 SPI 接口专为屏幕显示设计,因此省略了从机到主机的数据线 (MISO)。
RESX 为复位,模块上电时拉低,通常情况下置 1;
CSX 为从机片选, 仅当 CS 为低电平时,芯片才会被使能。
D/CX 为芯片的数据/命令控制引脚,当 DC = 0 时写命令,当 DC = 1 时写数据
SDA 为传输的数据,即 RGB 数据;
SCL 为 SPI 通信时钟。
对于 SPI 通信而言,数据是有传输时序的,即时钟相位(CPHA)与时钟极性(CPOL)的组合:
CPHA 的高低决定串行同步时钟是在第一时钟跳变沿还是第二个时钟跳变沿数据被采集,当 CPHA = 0,在第一个跳变沿进行数据采集;
CPOL 的高低决定串行同步时钟的空闲状态电平,CPOL = 0,为低电平。
从图中可以看出,当 SCL 第一个下降沿时开始传输数据,一个时钟周期传输 1 bit 数据,使用 SPI0,按位传输,高位在前,低位在后。
ESP32-Touch-LCD-3.5 板上预留的 GPIO 端子时需注意接线颜色和对应功能,避免接线惯性导致烧坏开发板


请参考 安装和配置 Arduino IDE 教程 下载安装 Arduino IDE 并添加 ESP32 支持。
可从 此链接 的 Arduino 目录中,下载 ESP32-Touch-LCD-3.5 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| ESP32-audioI2S-master | 音频处理库 | v3.4.0 | 通过库管理器或手动安装 |
| GFX_Library_for_Arduino | GFX图形库 | v1.6.0 | 通过库管理器或手动安装 |
| lvgl | LVGL图形库 | v8.4.0 | 通过库管理器或手动安装 |
| OneButton | 按键库 | v2.6.1 | 通过库管理器或手动安装 |
| SensorLib | 传感器驱动库 | v0.3.1 | 通过库管理器或手动安装 |
| TCA9554 | 扩展IO库 | v0.1.2 | 通过库管理器或手动安装 |
| XPowersLib | 电源管理库 | v0.2.9 | 通过库管理器或手动安装 |
| ESP32-A2DP | 蓝牙音频处理 | —— | 手动安装 |
LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。
安装步骤:
1.下载 示例程序包。 2. 将其 Arduino\libraries 目录下的所有文件夹(GFX_Library_for_Arduino 、ESP32-audioI2S-master等)复制到 Arduino 的库文件夹中。
Arduino 库文件夹的路径通常是:c:\Users\<用户名>\Documents\Arduino\libraries。
也可以在 Arduino IDE 中通过 文件 > 首选项,查看“项目文件夹位置”来定位。库文件夹就是此路径下的 libraries 文件夹。
ESP32-Touch-LCD-3.5 Arduino 工程参数设置,需要选择ESP32 Dev Module。

Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。
| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_i2s_audio | 读取SD卡的音频文件,并播放 | ESP32-audioI2S-master |
| 02_axp2101_example | 打印电源管理芯片的数据 | XPowersLib |
| 03_button_example | 按键测试 | OneButton |
| 04_es8311_example | 录音一段时间,并播放 | es8311 |
| 05_pcf85063_example | 打印RTC获取的数据 | SensorLib |
| 06_tca9554_example | 扩展io测试 | TCA9554 |
| 07_sd_card_test | 测试SD卡的读写 | - |
| 08_gfx_helloworld | 屏幕上显示HelloWorld | GFX_Library_for_Arduino、TCA9554 |
| 09_lvgl_arduino_v8 | lvgl v8.4.0 示例程序 | GFX_Library_for_Arduino、TCA9554、lvgl、SensorLib |
| 10_lvgl_arduino_v9 | lvgl v9.3.0 示例程序 | GFX_Library_for_Arduino、TCA9554、lvgl、SensorLib |
| 11_bt_music_receiver_arduino_i2s | 蓝牙音乐播放示例 | ESP32-A2DP、GFX_Library_for_Arduino、TCA9554、OneButton |
本示例演示ESP32-Touch-LCD-3.5读取SD卡的音频文件并使用喇叭播放,支持MP3、AAC、WAV等格式。
播放音频文件,屏幕无现象
初始化I2C外设,配置es8311解码器,同时使能功放管脚PA_CTRL:
Wire.begin(I2C_SDA, I2C_SCL);
TCA.begin();
TCA.pinMode1(2,OUTPUT);
TCA.write1(2, 1);
es8311_codec_init();
初始化I2S外设,挂载TF卡,设置播放音量,播放路径为music/1.mp3的MP3文件:
SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI, SD_CS);
if (!SD.begin(SD_CS)) {
esp_rom_printf("Card Mount Failed\n");
while (1) {
};
}
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(21); // 0...21
audio.connecttoFS(SD, "music/1.mp3");
本示例演示使用XPowers驱动AXP2101,并通过串口打印数据
初始化I2C外设,初始化AXP2101电池管理IC:
bool result = power.begin(Wire, AXP2101_SLAVE_ADDRESS, i2c_sda, i2c_scl);
if (result == false) {
Serial.println("power is not online...");
while (1) delay(50);
}
本示例演示如何使用 OneButton 库读取 BOOT、PWR、PLUS按键的单击、双击和长按等状态,并通过串口打印。
绑定按键事件回调函数 :
button1.attachClick(click1);
button1.attachDoubleClick(doubleclick1);
button1.attachLongPressStart(longPressStart1);
button1.attachLongPressStop(longPressStop1);
button1.attachDuringLongPress(longPress1);
本示例演示使用ESP32-Touch-LCD-3.5驱动ES8311音频编解码器,实现音频录制及回放功能。。
初始化I2C,ES8311,I2S :
Wire.begin(I2C_SDA, I2C_SCL);
es8311_codec_init();
setupI2S();
音频录制5s,并播放录制的内容 :
wav_buffer = i2s.recordWAV(5, &wav_size);
delay(1000);
Serial.println("I2S playWAV");
i2s.playWAV(wav_buffer, wav_size);
本实例演示ESP32-Touch-LCD-3.5驱动PCF85063,时间和日期的设置与获取。

初始化 :
// Try to initialize the RTC module using I2C with specified SDA and SCL pins
if (!rtc.begin(Wire, SENSOR_SDA, SENSOR_SCL)) {
Serial.println("Failed to find PCF85063 - check your wiring!");
// Enter an infinite loop to halt the program
while (1) {
delay(1000);
}
}
设置时间、日期 :
rtc.setDateTime(year, month, day, hour, minute, second);
获取时间、日期 :
RTC_DateTime datetime = rtc.getDateTime();
本实例演示ESP32-Touch-LCD-3.5驱动TCA9554,对扩展IO的引脚进行读写操作。。
设置引脚模式 :
TCA.pinMode1(pin, OUTPUT);
设置引脚电平 :
TCA.write1(pin, LOW);
读取引脚电平 :
int val = TCA.read1(pin);
本示例演示使用 ESP32-Touch-LCD-3.5 测试SD卡的读写功能

初始化 :
if(!SD_MMC.setPins(clk, cmd, d0)){
Serial.println("Pin change failed!");
return;
}
if (!SD_MMC.begin( "/sdcard", true)) {
Serial.println("Card Mount Failed");
return;
}
本示例演示 ESP32-Touch-LCD-3.5 使用GFX_Library_for_Arduino库驱动屏幕并在屏幕上显示HelloWorld

Arduino_DataBus *bus = new Arduino_ESP32SPI(27 /* DC */, 5 /* CS */, 18 /* SCK */, 23 /* MOSI */, 19 /* MISO */);
Arduino_GFX *gfx = new Arduino_ST7796(bus, GFX_NOT_DEFINED /* RST */, 0 /* rotation */, true /* IPS */);
本示例演示了使用 ESP32-Touch-LCD-3.5 运行lvgl( v8.4.0)示例程序。
setup() :
loop() :
lv_timer_handler 让 LVGL 处理图形界面的任务;本示例演示了使用 ESP32-Touch-LCD-3.5 运行lvgl( v9.3.0)示例程序
my_disp_flush() :
gfx 对象的相应函数来绘制位图到特定的区域;loop() :
lv_timer_handler 让 LVGL 处理图形界面的任务;delay(5) 增加数据轮询的频率,以确保及时获取传感器数据并更新显示。本示例演示了使用 ESP32-Touch-LCD-3.5 连接蓝牙播放音乐,屏幕显示歌曲信息。

下载并安装 Visual Studio Code。
在 VS Code 中,通过点击 VS Code 侧边活动栏中的 或使用快捷键(Ctrl+Shift+X)来打开 扩展 视图。然后,搜索 ESP-IDF 扩展并安装。

安装扩展后,VS Code 左侧活动栏中会出现 图标,点击该图标可查看 ESP-IDF 扩展的基本命令列表,在 Advanced 中选择 配置 ESP-IDF 扩展。

选择 Express 进入快速配置模式:

根据需要修改以下选项。

点击 Install 开始安装。你将看到一个显示安装进度的页面,包括 ESP-IDF 下载、ESP-IDF 工具下载安装以及 Python 虚拟环境创建的进度状态。

如果安装正确,你会看到所有设置已配置完成的提示,即可开始使用该扩展程序。

注意:如果 ESP-IDF 安装失败或需要重新安装,可以尝试删除 C:\Users\%Username%\esp 和 C:\Users\%Username%\.espressif 文件夹后重试。
ESP-IDF 示例程序位于 示例程序包 的 ESP-IDF 目录中。
本示例演示是ESP32-Touch-LCD-3.5的综合示例,也是出厂默认烧录的示例。
![]() | ![]() | ![]() | ![]() | ![]() |
|---|
代码解释
初始化系统各种外设,加载LVGL显示demo
esp_i2c_port_init(&i2c_bus_handle);
esp_spi_port_init(LCD_BUFFER_SIZE);
esp_sdcard_port_init();
io_expander_init();
esp_3inch5_display_port_init(&io_handle, &panel_handle, LCD_BUFFER_SIZE);
esp_3inch5_touch_port_init(&touch_handle, i2c_bus_handle, EXAMPLE_LCD_H_RES, EXAMPLE_LCD_V_RES, EXAMPLE_DISPLAY_ROTATION);
esp_axp2101_port_init(i2c_bus_handle);
vTaskDelay(pdMS_TO_TICKS(200));
esp_es8311_port_init(i2c_bus_handle);
esp_pcf85063_port_init(i2c_bus_handle);
esp_wifi_port_init("WSTEST", "waveshare0755");
esp_3inch5_brightness_port_init();
esp_3inch5_brightness_port_set(80);
lv_port_init();
本示例演示了 ESP32-Touch-LCD-3.5 使用 XPowersLib 库驱动AXP2101,并通过串口打印电池信息

本示例演示了 ESP32-Touch-LCD-3.5 使用 espressif/button 库驱动按键,并通过BOOT按键实现对睡眠模式的唤醒。

本示例演示了 ESP32-Touch-LCD-3.5 使用 sensorlib 库驱动pcf85063,并通过串口打印其数据。

本示例演示了 ESP32-Touch-LCD-3.5 使用 espressif/esp_io_expander_tca9554 库驱动tca9554,可对扩展IO进行输入输出操作。

本示例演示了 ESP32-Touch-LCD-3.5 测试SD卡的读写功能

SPI初始化 :
spi_bus_config_t bus_cfg = {
.mosi_io_num = PIN_NUM_MOSI,
.miso_io_num = PIN_NUM_MISO,
.sclk_io_num = PIN_NUM_CLK,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 4000,
};
ret = spi_bus_initialize(host.slot, &bus_cfg, SDSPI_DEFAULT_DMA);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to initialize bus.");
return;
}
SD卡初始化,并挂载 :
sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
slot_config.gpio_cs = PIN_NUM_CS;
slot_config.host_id = host.slot;
ESP_LOGI(TAG, "Mounting filesystem");
ret = esp_vfs_fat_sdspi_mount(mount_point, &host, &slot_config, &mount_config, &card);
本示例演示了 ESP32-Touch-LCD-3.5 运行lvgl示例程序

初始化LCD,屏幕触摸以及LVGL :
app_i2c_init();
app_io_expander_init();
/* LCD HW initialization */
ESP_ERROR_CHECK(app_lcd_init());
/* Touch initialization */
ESP_ERROR_CHECK(app_touch_init());
/* LVGL initialization */
ESP_ERROR_CHECK(app_lvgl_init());
本示例使用lvgl实现MP3播放器,该例程扫描内存卡根目录下的MP3文件进行播放

app_i2c_init();
app_io_expander_init();
ESP_ERROR_CHECK(esp_board_init(16000, 2, 16));
/* LCD HW initialization */
ESP_ERROR_CHECK(app_lcd_init());
esp_sdcard_init("/sdcard", 5);
Audio_Play_Init();
Search_mp3_Music();
/* Touch initialization */
ESP_ERROR_CHECK(app_touch_init());
/* LVGL initialization */
ESP_ERROR_CHECK(app_lvgl_init());
lvgl_port_lock(0);
lv_app_music_init();
lvgl_port_unlock();
本示例使用lvgl显示图片,可以左右滑动手势切换图片

开发板设计文件