ESP32-Touch-LCD-3.5 使用教程

ESP32-Touch-LCD-3.5

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

产品特性

  • 搭载 ESP32-D0WDR2-V3 高性能 Xtensa 32 位 LX6 双核处理器,主频高达 240MHz
  • 支持 2.4 GHz Wi-Fi (802.11 b/g/n)速度高达 150 Mbps
  • 蓝牙 v4.2 完整标准,包含传统蓝牙 (BR/EDR) 和低功耗蓝牙 (Bluetooth LE)
  • 内置 520 KB 的 SRAM 和 448 KB ROM,叠封 2 MB PSRAM 和外接 16 MB Flash
  • 采用 Type-C 接口,提高了用户的使用便捷性和设备的兼容性
  • 板载 3.5 英寸电容触摸高清 IPS 屏,320 × 480 分辨率,262K 彩色,能清晰地显示彩色图片
  • 内置 ST7796 驱动芯片和 FT6336 电容触控芯片,分别使用 SPI 和 I2C 接口通信,不占用过多接口引脚资源
  • 板载 PCF85063 RTC 芯片,接入电池后,关机走时。
  • 板载 PWR、BOOT 两个可自定义功能的侧边按钮,方便使用按钮进行自定义功能开发
  • 板载 3.7V MX1.25 锂电池充放电接口
  • 引出I2C、 UART 和多个 GPIO,可供外接设备和调试使用,灵活配置外设功能
  • 板载 Micro SD 卡槽,提供扩展存储、快速数据传输和灵活性,适用于数据记录和媒体播放,简化了电路设计
  • 使用 AXP2101 的好处包括高效的电源管理、支持多种输出电压、充电和电池管理功能以及对电池寿命的优化

板载资源

ESP32-S3-Touch-LCD-1.69 硬件资源 1
  1. ESP32-D0WDR2-V3 (背面) Wi-Fi 和蓝牙 SoC,240MHz 主频,2MB PSRAM
  2. 16MB NOR Flash (背面)
  3. IPEX 1 代座子 可通过拆焊电阻切换为使用外部天线
  4. 板载贴片天线
  5. Micro SD 卡槽
  6. MX1.25 喇叭接口
  7. BOOT 按键
  8. RESET 按键
  9. PWR 按键 默认长按 6s 关机,短按开机
  10. AXP2101 高集成度的电源管理芯片
  11. 充电指示灯
  12. 电源指示灯
  13. Type-C 接口
  14. 麦克风
  15. PCF85063
  16. RTC 时钟芯片
  17. ES8311 低功耗音频编解码芯片
  18. 2.54mm 排座接口 引出可用 IO 功能引脚,方便扩展使用
  19. MX1.25 锂电池接口 MX1.25 2PIN 连接器,可用于接入 3.7V 锂电池,支持充放电

LCD 及其控制器

  • 该款 LCD 使用的内置控制器为 ST7796S,是一款 320 (H) × 480 (V)(像素)的 LCD 控制器。
  • 同样支持 RGB444(12 位)、RGB565(16 位)、RGB666(18 位),推荐沿用 RGB565 格式(兼顾色彩表现和传输效率)。
  • 支持 四线 SPI 接口(SCL 时钟线、SDA 数据线、DC 数据 / 命令线、CS 片选线)
  • ST7796S 通常为矩形显示区域(具体需参考模组规格),该模组为圆角设计,需注意实际显示区域可能略小于 320×480,图像边缘需预留冗余

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 端子时需注意接线颜色和对应功能,避免接线惯性导致烧坏开发板

ESP32-Touch-LCD-3.5 引脚定义

产品尺寸

ESP32-Touch-LCD-3.5 产品尺寸

Arduino 开发

配置开发环境

1. 安装和配置 Arduino IDE

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

2. 安装库

可从 此链接 的 Arduino 目录中,下载 ESP32-Touch-LCD-3.5 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。

库或文件名称说明版本安装方式
ESP32-audioI2S-master音频处理库v3.4.0通过库管理器或手动安装
GFX_Library_for_ArduinoGFX图形库v1.6.0通过库管理器或手动安装
lvglLVGL图形库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 文件夹。

  1. 其他安装方式请参考:Arduino 库管理教程

3. 其他提示

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屏幕上显示HelloWorldGFX_Library_for_Arduino、TCA9554
09_lvgl_arduino_v8lvgl v8.4.0 示例程序GFX_Library_for_Arduino、TCA9554、lvgl、SensorLib
10_lvgl_arduino_v9lvgl v9.3.0 示例程序GFX_Library_for_Arduino、TCA9554、lvgl、SensorLib
11_bt_music_receiver_arduino_i2s蓝牙音乐播放示例ESP32-A2DP、GFX_Library_for_Arduino、TCA9554、OneButton

01_i2s_audio

本示例演示ESP32-Touch-LCD-3.5读取SD卡的音频文件并使用喇叭播放,支持MP3、AAC、WAV等格式。

准备工作

  • 将SD卡插入电脑
  • 在SD卡根目录新建文件夹 music
  • 把本工程下data文件夹里面的1.mp3拷贝到SD卡的music文件夹里
  • 将SD卡插入 ESP32-Touch-LCD-3.5

运行效果

播放音频文件,屏幕无现象

代码

01_i2s_audio.ino

代码解释

  • 初始化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");

02_axp2101_example

本示例演示使用XPowers驱动AXP2101,并通过串口打印数据

运行效果

代码

02_axp2101_example.ino

代码解释

  • 初始化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);
    }

03_button_example

本示例演示如何使用 OneButton 库读取 BOOT、PWR、PLUS按键的单击、双击和长按等状态,并通过串口打印。

运行效果

代码

03_button_example.ino

代码解释

  • 绑定按键事件回调函数 :

    button1.attachClick(click1);
    button1.attachDoubleClick(doubleclick1);
    button1.attachLongPressStart(longPressStart1);
    button1.attachLongPressStop(longPressStop1);
    button1.attachDuringLongPress(longPress1);

04_es8311_example

本示例演示使用ESP32-Touch-LCD-3.5驱动ES8311音频编解码器,实现音频录制及回放功能。。

运行效果

  • 屏幕无现象
  • 按下ESP32-Touch-LCD-3.5的RST按键进入音频录制状态,5s后播放录制的内容。

代码

04_es8311_example.ino

代码解释

  • 初始化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);

05_pcf85063_example

本实例演示ESP32-Touch-LCD-3.5驱动PCF85063,时间和日期的设置与获取。

运行效果

  • 屏幕无现象
  • 打开串口监视器

代码

05_pcf85063_example.ino

代码解释

  • 初始化 :

      // 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();

06_tca9554_example

本实例演示ESP32-Touch-LCD-3.5驱动TCA9554,对扩展IO的引脚进行读写操作。。

运行效果

  • 屏幕无现象
  • 打开串口监视器

代码

06_tca9554_example.ino

代码解释

  • 设置引脚模式 :

    TCA.pinMode1(pin, OUTPUT);
  • 设置引脚电平 :

    TCA.write1(pin, LOW);
  • 读取引脚电平 :

    int val = TCA.read1(pin);

07_sd_card_test

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

硬件连接

  • 将板子接入电脑
  • 将Micro SD卡插入卡槽(SD卡需要格式化为FAT32)

运行效果

  • 屏幕无现象
  • 打开串口监视器

代码

07_sd_card_test.ino

代码解释

  • 初始化 :

    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;
    }

08_gfx_helloworld

本示例演示 ESP32-Touch-LCD-3.5 使用GFX_Library_for_Arduino库驱动屏幕并在屏幕上显示HelloWorld

运行效果

代码

08_gfx_helloworld.ino

代码解释

  • 配置屏幕接口以及屏幕的分辨率等:
    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 */);

09_lvgl_arduino_v8

本示例演示了使用 ESP32-Touch-LCD-3.5 运行lvgl( v8.4.0)示例程序。

需要安装 lvgl v8.4.0 版本,如已安装其他版本,请重新安装。

运行效果

代码

09_lvgl_example_v8.ino

代码解释

  • setup() :

    • 初始化屏幕以及LVGL;
  • loop() :

    • 调用 lv_timer_handler 让 LVGL 处理图形界面的任务;

10_lvgl_arduino_v9

本示例演示了使用 ESP32-Touch-LCD-3.5 运行lvgl( v9.3.0)示例程序

需要安装 lvgl v9.3.0 版本,如已安装其他版本,请重新安装。

运行效果

代码

10_lvgl_example_v9.ino

代码解释

  • my_disp_flush() :

    • 这个函数是 LVGL 显示驱动的刷新函数。它负责将 LVGL 的绘图缓冲区内容刷新到显示屏上;
    • 根据不同的颜色格式设置,调用 gfx 对象的相应函数来绘制位图到特定的区域;
    • 最后通知 LVGL 显示刷新已完成。
  • loop() :

    • 调用 lv_timer_handler 让 LVGL 处理图形界面的任务;
    • 通过 delay(5) 增加数据轮询的频率,以确保及时获取传感器数据并更新显示。

11_bt_music_receiver_arduino_i2s

本示例演示了使用 ESP32-Touch-LCD-3.5 连接蓝牙播放音乐,屏幕显示歌曲信息。

设置 Partition Scheme 为 "Custom"

  • QQ音乐:设置->歌词->车载蓝牙歌词
  • 网易云音乐:设置->通用->外部设备->外接设备蓝牙歌词

运行效果

  • 手机或平板连接蓝牙。(名称:ESP32-Touch-LCD-3.5)
  • 屏幕上显示歌曲信息

ESP-IDF 开发

  1. 下载并安装 Visual Studio Code

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

    在 VS Code 中搜索并安装 ESP-IDF 扩展

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

    选择“配置 ESP-IDF 拓展”

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

    选择快速配置模式

  5. 根据需要修改以下选项。

    • 选择下载服务器
      • Espressif:使用乐鑫中国服务器,下载速度更快。
      • Github:使用 GitHub 官方发布链接。
    • ESP-IDF 版本:通常根据开发板要求选择对应版本,如无特殊要求建议使用最新的正式版本。对于 ESP32-Touch-LCD-3.5 ,建议 Espressif IDF 版本 ≥ v5.4.1。
    • ESP-IDF 容器安装地址:建议使用默认地址,或使用纯英文路径且路径中不包含空格。
    • ESP-IDF 所需的工具安装地址:建议使用默认地址,或使用纯英文路径且路径中不包含空格。

    ESP-IDF 拓展快速配置模式选项

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

    安装进度

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

    安装成功

注意

注意:如果 ESP-IDF 安装失败或需要重新安装,可以尝试删除 C:\Users\%Username%\esp 和 C:\Users\%Username%\.espressif 文件夹后重试。

示例程序

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

01_factory

本示例演示是ESP32-Touch-LCD-3.5的综合示例,也是出厂默认烧录的示例。

ESP32-Touch-LCD-3.5 ESP-IDF 示例1 图1
ESP32-Touch-LCD-3.5 ESP-IDF 示例1 图2
ESP32-Touch-LCD-3.5 ESP-IDF 示例1 图3
ESP32-Touch-LCD-3.5 ESP-IDF 示例1 图4
ESP32-Touch-LCD-3.5 ESP-IDF 示例1 图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();

02_axp2101_example

本示例演示了 ESP32-Touch-LCD-3.5 使用 XPowersLib 库驱动AXP2101,并通过串口打印电池信息

ESP32-Touch-LCD-3.5 ESP-IDF 示例2 图1

03_button_power_save

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

ESP32-Touch-LCD-3.5 ESP-IDF 示例3 图1

04_pcf85063_example

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

ESP32-Touch-LCD-3.5 ESP-IDF 示例4 图1

05_tca9554_example

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

ESP32-Touch-LCD-3.5 ESP-IDF 示例5 图1

06_sd_card_test

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

硬件连接

  • 将板子接入电脑
  • 将Micro SD卡插入卡槽(SD卡需要格式化为FAT32)
ESP32-Touch-LCD-3.5 ESP-IDF 示例6 图1

代码解释

  • 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);

07_lvgl_example

本示例演示了 ESP32-Touch-LCD-3.5 运行lvgl示例程序

ESP32-Touch-LCD-3.5 ESP-IDF 示例7 图1

代码解释

  • 初始化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());

08_lvgl_audio_play

本示例使用lvgl实现MP3播放器,该例程扫描内存卡根目录下的MP3文件进行播放

硬件连接

  • 将Micro SD卡插入卡槽(SD卡需要格式化为FAT32,并放置MP3文件在根目录下)
ESP32-Touch-LCD-3.5 ESP-IDF 示例8 图1

代码解释

  • 初始化I2C I2S,以及播音codec
      app_i2c_init();
    app_io_expander_init();
    ESP_ERROR_CHECK(esp_board_init(16000, 2, 16));
  • 初始化屏幕、内存卡以及播放器,并扫描内存卡的的MP3并保存到数组
      /* LCD HW initialization */
    ESP_ERROR_CHECK(app_lcd_init());
    esp_sdcard_init("/sdcard", 5);
    Audio_Play_Init();
    Search_mp3_Music();
  • 初始化触摸以及LVGL,加载播放器界面
      /* 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();

09_lvgl_image

本示例使用lvgl显示图片,可以左右滑动手势切换图片

ESP32-Touch-LCD-3.5 ESP-IDF 示例9 图1

相关资料

1. 硬件资料

开发板设计文件

2. 技术手册