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 支持。
| 板名称 | 板安装要求 | 版本号要求 |
|---|---|---|
| esp32 by Espressif Systems | “离线”安装/“在线”安装 | 3.1.0 |
2. 安装库
- 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
- 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
- 可从 该处 下载 ESP32-S3-Touch-AMOLED-1.75 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| GFX_Library_for_Arduino | 适配 CO5300 的 GFX 图形化库 | —— | "离线安装" |
| ESP32_IO_Expander | TCA9554 拓展芯片驱动库 | v0.0.3 | 可“在线”或“离线”安装 |
| LVGL | LVGL 图形化库 | v8.4.0 | “在线”安装后需复制 demos 文件夹至 src,建议使用“离线”安装 |
| SensorLib | PCF85063、QMI8658、CST9217 传感器驱动库 | v0.3.1 | 可“在线”或“离线”安装 |
| XPowersLib | AXP2101 电源管理芯片驱动库 | v0.2.6 | 可“在线”或“离线”安装 |
| Mylibrary | 开发板引脚宏定义 | —— | "离线安装" |
| lv_conf.h | LVGL 配置文件 | —— | "离线安装" |
版本兼容性说明
LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。
3. Arduino 工程参数设置
示例程序
Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。
01_HelloWorld
【程序说明】
- 本示例演示了如何使用 Arduino GFX 库控制 CO5300 显示屏,通过动态变化的文本展示了基本的图形库功能。该代码也可以用于测试显示屏的基础性能以及随机文本显示效果
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
- 显示初始化
if (!gfx->begin()) {
USBSerial.println("gfx->begin() failed!");
} - 清屏并显示文本:
gfx->fillScreen(BLACK);
gfx->setCursor(10, 10);
gfx->setTextColor(RED);
gfx->println("Hello World!"); - 动图显示:
gfx->setCursor(random(gfx->width()), random(gfx->height()));
gfx->setTextColor(random(0xffff), random(0xffff));
gfx->setTextSize(random(6), random(6), random(2));
gfx->println("Hello World!");
【运行效果】

02_LVGL_PCF85063_simpleTime
【程序说明】
- 本示例演示了在 LVGL 下使用 PCF85063 RTC 模块在 CO5300 显示屏上显示当前时间,每秒检索时间并仅在时间发生变化时更新显示,对比时间刷新效果更佳
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
setup:负责初始化各种硬件设备和 LVGL 图形库环境- 串口初始化:
USBSerial.begin(115200)为串口调试做准备 - 实时时钟初始化:尝试初始化实时时钟
rtc,如果失败则进入死循环。设置日期和时间 - 触摸控制器初始化:不断尝试初始化触摸控制器
CST9217,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息 - 图形显示初始化:初始化图形显示设备
gfx,设置亮度,并打印 LVGL 和 Arduino 的版本信息。接着初始化 LVGL,包括注册打印回调函数用于调试,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,最后创建一个标签并设置初始文本为 “Initializing...”
- 串口初始化:
looplv_timer_handler():这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作- 时间更新和显示:每秒钟获取一次实时时钟的时间,并通过串口打印出来。然后将时间格式化为字符串,并更新标签的文本显示当前时间。同时设置标签的字体为特定字体。最后添加一个小的延迟
【运行效果】

03_LVGL_QMI8658_ui
【程序说明】
- 本示例演示了使用 LVGL 进行图形显示,与 QMI8658 IMU 通信以获取加速度计和陀螺仪数据
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
setup:负责初始化各种硬件设备和 LVGL 图形库环境- 串口初始化:
USBSerial.begin(115200)为串口调试做准备 - 触摸控制器初始化:不断尝试初始化触摸控制器
CST9217,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息 - 图形显示初始化:初始化图形显示设备
gfx,设置亮度,并打印 LVGL 和 Arduino 的版本信息。接着初始化 LVGL,包括注册打印回调函数用于调试,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,最后创建一个标签并设置初始文本为 “Initializing...” - 创建图表:创建一个图表对象
chart,设置图表的类型、范围、数据点数量等属性,并为加速度的三个轴添加数据系列 - 加速度传感器初始化:初始化加速度传感器
qmi,配置加速度计和陀螺仪的参数,启用它们,并打印芯片 ID 和控制寄存器信息
- 串口初始化:
looplv_timer_handler():这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作- 读取加速度传感器数据:如果加速度传感器数据准备好,读取加速度数据并通过串口打印出来,同时更新图表显示加速度数据。如果陀螺仪数据准备好,读取陀螺仪数据并通过串口打印出来。最后添加一个小的延迟,增加数据 polling 的频率
【运行效果】

04_LVGL_AXP2101_ADC_Data
【程序说明】
- 本示例演示了 LVGL 下使用 XPowers 库进行电源管理,并且提供 PWR 自定义按钮控制亮屏、熄屏动作
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
- 亮屏熄屏实现函数
void toggleBacklight() {
USBSerial.println(backlight_on);
if (backlight_on) {
for (int i = 255; i >= 0; i--) {
gfx->Display_Brightness(i);
delay(3);
}
} else {
for (int i = 0; i <= 255; i++) {
gfx->Display_Brightness(i);
delay(3);
}
}
backlight_on = !backlight_on;
}
【运行效果】
- 显示参数:芯片温度,是否正在充电,是否放电,是否待机状态,Vbus 是否连接,Vbus 是否良好,充电器状态,电池电压,Vbus 电压,系统电压,电池百分比

05_LVGL_Widgets
【程序说明】
- 本示例演示了 LVGL Widgets 示例,动态状态下帧率可达 50~60 帧,通过优化 CO5300 显示库可实现更佳流畅的帧率,实际可对比 ESP-IDF 环境下启用双缓存、双加速的场景
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
setup:负责初始化各种硬件设备和 LVGL 图形库环境- 串口初始化:
USBSerial.begin(115200)为串口调试做准备 - I²C 总线初始化:
Wire.begin(IIC_SDA, IIC_SCL);初始化 I²C 总线,用于与其他 I²C 设备通信 - 扩展芯片初始化:创建并初始化扩展芯片
expander,设置引脚模式为输出,并进行一些初始的引脚状态设置 - 触摸控制器初始化:不断尝试初始化触摸控制器
CST9217,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息 - 图形显示初始化:初始化图形显示设备
gfx,设置亮度,并获取屏幕的宽度和高度。然后初始化 LVGL,包括注册打印回调函数用于调试,设置触摸控制器的电源模式为监控模式,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,创建一个标签并设置文本,最后调用lv_demo_widgets()展示 LVGL 的示例小部件
- 串口初始化:
looplv_timer_handler():这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作delay(5);:添加一个小的延迟,避免过度占用 CPU 资源
【运行效果】
06_LVGL_SD_Test
【程序说明】
- 本示例演示了使用 SDMMC 驱动 SD 卡,并输出其内容到显示屏上
【硬件连接】
- 使用 USB 线把板子接入电脑
- 将 SD 卡装入开发板
【代码分析】
setup:负责初始化各种硬件设备和 LVGL 图形库环境- 串口初始化:
USBSerial.begin(115200)为串口调试做准备 - I²C 总线和扩展芯片初始化:初始化 I²C 总线,创建并初始化扩展芯片,设置其引脚模式为输出,并打印初始状态和新的状态
- 图形显示初始化:初始化图形显示设备,设置亮度,初始化 LVGL,设置显示驱动和输入设备驱动,创建并启动 LVGL 的定时器
- SD 卡初始化和信息显示:设置 SD 卡的引脚,尝试挂载 SD 卡。如果挂载失败,在串口和屏幕上显示错误信息。如果成功挂载,检测 SD 卡类型并显示,获取 SD 卡大小并显示。然后调用
listDir函数列出 SD 卡根目录的内容,并将 SD 卡的类型、大小和目录列表信息显示在屏幕上的标签中 listDir:递归地列出指定目录下的文件和子目录信息- 首先打印正在列出的目录名称。然后打开指定目录,如果打开失败,返回错误信息。如果打开的不是目录,也返回错误信息。如果是目录,则遍历其中的文件和子目录。对于子目录,递归调用 listDir 函数继续列出其内容。对于文件,打印文件名和文件大小。最后将所有收集到的信息作为字符串返回
【运行效果】

07_ES8311
【程序说明】
- 本示例演示了使用 I2S 驱动 ES8311 芯片,将转换的二进制音频文件进行播放
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
es8311_codec_init:初始化 ES8311 音频编解码器- 创建一个 ES8311 编解码器的句柄
es_handle - 配置 ES8311 的时钟参数,包括主时钟和采样时钟的频率、时钟极性等
- 初始化编解码器,设置音频分辨率为 16 位
- 配置采样频率
- 配置麦克风相关参数,如关闭麦克风、设置音量和麦克风增益
- 创建一个 ES8311 编解码器的句柄
setup:进行整体的初始化设置,包括串口、引脚、I2S 和 ES8311 编解码器- 初始化串口用于调试输出
- 设置特定引脚为输出并置高
- 配置 I2S 总线,设置引脚、工作模式、采样率、数据位宽、声道模式等
- 初始化 I²C 总线
- 调用
es8311_codec_init函数初始化 ES8311 编解码器 - 通过 I2S 总线播放一段预先定义的音频数据(
canon_pcm)
【运行效果】
- 播放音频文件,屏幕无现象
08_ESP32-S3-LCD76G-I2C
【程序说明】
- 本示例演示了使用 I2C 主动查询 LC76G 的 NMEA 数据,通过传输打印到串口上可以直接使用 NMEA 解析工具获取经纬度等信息
- 使用时需要开启“USB CDC On Boot”使能
【硬件连接】
- 使用 USB 线把板子接入电脑
- 连接 GPS 陶瓷天线
【运行效果】
