Arduino 开发
本章节包含以下部分,请按需阅读:
Arduino 入门教程
初次接触 Arduino ESP32 开发,想要快速上手?我们为您准备了一套通用的 入门教程。
- 第0节 认识 ESP32
- 第1节 安装和配置 Arduino IDE
- 第2节 Arduino 基础知识
- 第3节 数字输出/输入
- 第4节 模拟输入
- 第5节 脉冲宽度调制 (PWM)
- 第6节 串行通信 (UART)
- 第7节 I2C 通信
- 第8节 SPI 通信
- 第9节 Wi-Fi 基础用法
- 第10节 网页服务器
- 第11节 蓝牙 (Bluetooth)
- 第12节 LVGL 图形界面开发
- 第13节 综合项目
请注意:该教程使用 ESP32-S3-Zero 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。
配置开发环境
1. 安装和配置 Arduino IDE
请参考 安装和配置 Arduino IDE 教程 下载安装 Arduino IDE 并添加 ESP32 支持。
2. 安装库
要运行示例,需要安装对应的库。
可从 此链接 下载 ESP32-S3-Touch-LCD-4.3 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| ESP32_Display_Panel | ESP32 微控制器的特定显示面板控制库 | v0.1.4 以上 | 可“在线”或“离线”安装 |
| ESP32_IO_Expander | ESP32 的 I/O 扩展库 | v0.0.4 以上 | 可“在线”或“离线”安装 |
| lvgl | LVGL 图形库 | v8.4.0 | 通过库管理器或手动安装 |
| lv_conf.h | LVGL 配置文件 | —— | 手动安装 |
LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。
安装步骤:
-
解压已下载的 示例程序包。
-
将其
Arduino\libraries目录下的所有文件夹复制到 Arduino 的库文件夹中。信息Arduino 库文件夹的路径通常是:
c:\Users\<用户名>\Documents\Arduino\libraries。也可以在 Arduino IDE 中通过 文件 > 首选项,查看“项目文件夹位置”来定位。库文件夹就是此路径下的
libraries文件夹。 -
其他安装方式请参考:Arduino 库管理教程。
3. Arduino 工程参数设置

示例程序
Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。
| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_I2C_Test | 测试 I2C 座子 | - |
| 02_RS485_Test | 测试 RS485 座子 | - |
| 03_SD_Test | 测试 SD 卡座 | - |
| 04_Sensor_AD | 测试 ADC 座子 | - |
| 05_UART_Test | 测试 UART | - |
| 06_TWAItransmit | 测试 CAN 卡座 | - |
| 07_TWAIreceive | 测试 CAN 卡座 | - |
| 08_DrawColorBar | 测试 RGB 屏幕 | ESP32_Display_Panel |
| 09_lvgl_Porting | 测试 LVGL 移植 | LVGL,ESP32_Display_Panel |
01_I2C_Test
本示例用于测试 I2C 座子是否工作正常:扫描 I2C 总线上的设备地址并输出扫描结果。
硬件连接
- 使用 USB 线把板子接入电脑
代码分析
loop():loop()函数是程序的主要循环部分,其核心功能是扫描 I2C 总线上的设备。- 首先定义了用于存储错误代码、设备地址和记录找到设备数量的变量。
- 然后通过一个循环从地址
0x01到0x7F遍历可能的 I2C 设备地址。对于每个地址,先使用Wire.beginTransmission(address)开始向特定地址的设备发起传输,再使用Wire.endTransmission()结束传输并获取错误代码。 - 如果错误代码为
0,表示在该地址上找到了一个 I2C 设备,打印设备地址并增加设备数量的计数。如果错误代码不是2(表示设备未响应),则打印错误代码和对应的地址。 - 最后,如果没有找到任何 I2C 设备,打印相应的消息,并使用
delay(5000)使程序暂停 5 秒后再次进行扫描。
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
串口监视器打印 I2C 总线上的设备地址。

02_RS485_Test
本示例演示如何使用 RS485 进行串口回环测试(发送什么回什么)。
硬件连接
-
使用 USB 线把板子接入电脑

-
开发板连接 USB 转 RS485 转换器
代码分析
-
setup():- setup 函数主要用于初始化串口通信
- 使用 RS485.begin 函数初始化串口 Serial1 ,设置波特率、数据格式以及指定接收和发送引脚,然后通过循环检查确保串口初始化成功。
-
loop():- loop 函数是程序主循环部分,主要功能是实现简单的 485 通信数据回传
- 通过检查串口是否有数据可用,若有数据则读取一个字节并立即发送回去,实现将接收到的 485 数据原封不动地回传的功能。
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
打开串口调试助手向 ESP32-S3-Touch-LCD-4.3 发送消息,该设备会将收到的消息返回给串口调试助手。

03_SD_Test
本示例演示如何挂载 SD 卡并进行基础读写与遍历测试。
硬件连接
-
使用 USB 线把板子接入电脑
-
将 SD 卡插入板子
代码分析
setup():- setup 函数主要进行了一系列的初始化操作和对 SD 卡的测试。
- 首先,它初始化串口通信,设置波特率为 115200。然后创建一个
ESP_IOExpander_CH422G对象来管理扩展的 IO 引脚,初始化并设置多个引脚为输出模式,控制诸如触摸屏复位(TP_RST)、LCD 背光(LCD_BL)、LCD 复位(LCD_RST)、SD 卡片选(SD_CS)和 USB 选择(USB_SEL)等引脚的状态。 - 接着,使用扩展的 GPIO 引脚来处理 SD 卡,初始化 SPI 通信并尝试挂载 SD 卡。如果挂载失败,会输出错误信息并返回;如果成功挂载,会检测 SD 卡的类型并输出,还会输出 SD 卡的大小信息。
- 之后,进行一系列文件系统操作的测试,包括列出目录内容、创建目录、删除目录、写入文件、追加内容到文件、读取文件、删除文件、重命名文件以及测试文件输入输出等操作,并输出 SD 卡的总空间和已使用空间大小。
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
ESP32-S3-Touch-LCD-4.3 会识别 SD 卡的类型和大小,再对其进行文件的增删改查。

04_Sensor_AD
测试ADC座子
硬件连接
-
使用 USB 线把板子接入电脑
-
将 PH2.0 转 2.54mm 杜邦公头配件接入开发板的 Sensor AD 接口
代码分析
-
setup():- setup 函数首先初始化串口通信,然后初始化 ADC,设置 ADC 分辨率为 12 位(0-4096)。
-
loop():- loop 函数每 100ms 读取当前 AD 值,并打印当前 AD 值。
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
开发板会设置 ADC 分辨率,读取当前 AD 值,打印到串口终端。

05_UART_Test
本示例用于测试 UART:收到的数据会原样回传(回环)。
硬件连接
- 使用 USB 线连接板子的 UART 口,接入电脑
代码分析
-
setup():- setup 函数主要用于初始化串口通信。
- 使用 UART.begin 函数初始化串口 Serial,设置波特率、数据格式以及指定接收和发送引脚,然后通过循环检查确保串口初始化成功。
-
loop():- loop 函数是程序主循环部分,主要功能是实现简单的 UART 通信数据回传。
- 通过检查串口是否有数据可用,若有数据则读取一个字节并立即发送回去,实现将接收到的 UART 数据原封不动地回传的功能。
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
打开串口调试助手向 ESP32-S3-Touch-LCD-4.3 发送消息,该设备会将收到的消息返回给串口调试助手。

06_TWAItransmit
本示例用于测试 CAN 卡座:初始化 TWAI 驱动并周期性发送 CAN 帧。
硬件连接
-
使用 USB 线把板子接入电脑
-
开发板连接 USB-CAN-A

代码分析
waveshare_twai_transmit():- waveshare_twai_transmit() 函数主要负责处理 TWAI(类似于 CAN 总线的接口)的传输和警报处理。
- 首先,它检查是否有警报发生。通过调用
twai_read_alerts读取触发的警报,并获取 TWAI 的状态信息到twai_status_info_t结构体中。然后根据触发的不同警报进行相应的处理,例如如果触发了错误被动警报、总线错误警报、传输失败警报或传输成功警报,分别打印相应的消息并输出一些状态信息,如总线错误计数、待发送消息数量、传输错误计数器和传输失败计数等。 - 接着,它获取当前时间(以毫秒为单位),并检查是否到了发送消息的时间。如果当前时间与上一次发送消息的时间之差大于等于设定的传输时间间隔
TRANSMIT_RATE_MS,则更新上一次发送时间为当前时间,并调用send_message函数发送一条消息。send_message函数配置并排队一个包含特定标识符、数据长度和数据内容的消息进行传输,如果排队成功则打印成功消息,否则打印失败消息,并在发送后清空消息数据数组。
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
串口打印 CAN 消息发送成功,配置 USB-CAN-A_TOOL 后启动可看到 ESP32-S3-Touch-LCD-4.3 发送的 CAN 消息。


07_TWAIreceive
本示例用于测试 CAN 卡座:初始化 TWAI 驱动并接收 CAN 帧。

硬件连接
-
使用 USB 线把板子接入电脑
-
开发板连接 USB-CAN-A
代码分析
waveshare_twai_receive():- 首先读取触发的警报并获取状态信息,根据不同警报情况进行相应处理,如打印错误被动、总线错误、接收队列已满等警报信息及相关计数。
- 当接收数据警报触发时,循环接收消息并调用
handle_rx_message函数处理,该函数判断消息格式并打印消息标识符和数据内容(非远程传输请求时),实现了对 TWAI 总线上接收消息的有效处理和警报响应。
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
ESP32-S3-Touch-LCD-4.3 等待 USB-CAN-A_TOOL 发送消息,如果接收成功,会将其打印到串口上。



08_DrawColorBar
本示例用于测试 RGB 屏幕:初始化 LCD 并显示颜色条/测试画面。
硬件连接
- 使用 USB 线把板子接入电脑
代码分析
waveshare_lcd_init():- 首先,打印 “Initialize IO expander” 表示开始初始化 IO 扩展器。创建一个
ESP_IOExpander_CH422G实例,初始化并开始其操作。将 IO0 - IO7 引脚设置为输出模式,并将触摸屏复位引脚(TP_RST)和 LCD 复位引脚(LCD_RST)设置为高电平,同时关闭 LCD 背光(LCD_BL),等待 100 毫秒。 - 接着,打印 “Create RGB LCD bus”,创建一个 RGB 面板总线对象
ESP_PanelBus_RGB,配置其引脚、宽度、高度、RGB 时序频率和时序参数等,设置反弹缓冲区大小和显示活动低电平标志,然后开始面板总线操作。 - 然后,打印 “Create LCD device”,创建一个 LCD 对象
ESP_PanelLcd,传入面板总线对象、颜色位数和复位引脚等参数,进行初始化、复位和开始操作。如果定义了EXAMPLE_ENABLE_PRINT_LCD_FPS,则将 VSync 结束的回调函数附加到 LCD 对象上。 - 最后,打印 “Draw color bar from top left to bottom right, the order is B - G - R”,调用
colorBarTest函数在 LCD 上绘制颜色条,并打开 LCD 背光。
- 首先,打印 “Initialize IO expander” 表示开始初始化 IO 扩展器。创建一个
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
- 串口打印 log,屏幕亮起。

09_lvgl_Porting
本示例用于测试 LVGL 移植:初始化 ESP32_Display_Panel + LVGL,并运行 LVGL Demo。
硬件连接
- 使用 USB 线把板子接入电脑
代码分析
-
setup():- 以 115200 的波特率初始化串口通信。接着创建并初始化 IO 扩展器,设置引脚模式和状态,进行 GT911 触摸屏初始化。然后创建并初始化面板设备,根据需要对 RGB 总线进行配置。之后初始化 LVGL,创建一个简单标签或可选择调用 LVGL 的示例或演示函数,并在最后释放互斥锁。
-
loop():- 仅打印 “IDLE loop” 并等待 1 秒钟,没有其他实质性操作。总体目的是搭建一个基于 LVGL 的用户界面环境。
代码修改
在 ESP_Panel_Board_Custom.h 中有一宏定义用于选择是否打开触摸功能,值为 0 对应关闭触摸,值为 1 对应打开触摸,可依购买型号选择。
#define ESP_OPEN_TOUCH 0 // 1 initiates the touch, 0 closes the touch.
代码烧录
- 选择开发板型号 ESP32S3 Dev Module 与端口
- 设置开发板参数
- 烧录代码
运行效果
-
串口打印屏幕刷新率,屏幕亮起。
