Arduino 开发
本章介绍 Arduino 环境搭建,包括 Arduino IDE、ESP32 板管理、相关库的安装,程序编译下载及示例程序测试,帮助用户掌握开发板,便于二次开发。 本章节包含以下部分,请按需阅读:
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-S3-LCD-1.69 所需开发板安装说明
| 板名称 | 板安装要求 | 版本号要求 |
|---|---|---|
| esp32 by Espressif Systems | “离线”安装/“在线”安装 | ≥3.0.5 |
2. 安装库
- 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装 。若库安装要求离线安装,则必须使用提供的库文件
对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。 - 库安装教程,详见:Arduino 库管理教程
- ESP32-S3-LCD-1.69 库文件存放于示例程序中,点击此处跳转:ESP32-S3-LCD-1.69 示例程序
ESP32-S3-LCD-1.69 库文件安装说明
| 库名称 | 说明 | 版本 | 库安装要求 |
|---|---|---|---|
| GFX_Library_for_Arduino | ST7789 的 GFX 图形化库 | v1.4.9 | 可“在线”或“离线”安装 |
| lvgl | LVGL 图形化库 | v8.4.0 | “在线”安装后需复制 demos 文件夹至 src,建议使用“离线”安装 |
| Mylibrary | 开发板引脚宏定义 | —— | “离线”安装 |
| SensorLib | PCF85063、QMI8658 传感器驱动库 | v0.2.1 | 可“在线”或“离线”安装 |
| lv_conf.h | LVGL 配置文件 | —— | “离线”安装 |
示例程序
ESP32-S3-LCD-1.69 示例程序
| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_HelloWorld | 展示了基本的图形库功能,也可以用于测试显示屏的基础性能以及随机文本显示效果 | GFX_Library_for_Arduino |
| 02_GFX_AsciiTable | 根据屏幕尺寸,在显示屏上按行列打印 ASCII 字符 | GFX_Library_for_Arduino |
| 03_GFX_PCF85063_simpleTime | 显示当前时间 | SensorLib,GFX_Library_for_Arduino |
| 04_GFX_ESPWiFiAnalyzer | 在 ST7789 显示器上绘制 WiFi 频段信号强度 | GFX_Library_for_Arduino |
| 05_GFX_Clock | 一个简单的 ST7789 时钟示例,通过简单的标记指针和时间管理实现时钟 | GFX_Library_for_Arduino |
| 06_LVGL_Measuring_voltage | 板上预留分压测电压,使用 GPIO1 读取模拟量值并通过分压公式得出电池电压 | LVGL |
| 07_LVGL_PCF85063_simpleTime | 在 LVGL 下使用 PCF85063 RTC 模块在 ST7789 显示屏上显示当前时间 | LVGL,SensorLib |
| 08_LVGL_QMI8658_ui | 使用 LVGL 进行图形显示,与 QMI8658 IMU 通信以获取加速度计和陀螺仪数据 | LVGL,SensorLib |
| 09_LVGL_Keys_Bee | 多功能按钮使用 | LVGL |
| 10_LVGL_Arduino | LVGL 演示 | LVGL |
- ESP32-S3-LCD-1.69 支持直接选择型号

01_HelloWorld
【硬件连接】
- 使用 USB 线把板子接入电脑

- 使用 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_GFX_AsciiTable
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
初始化显示屏:
if (!gfx->begin()) {USBSerial.println("gfx->begin() failed!");} -
计算行列并标注编号:这里根据显示屏的尺寸计算出可以显示的列数和行数。然后分别使用两个循环,设置不同的文本颜色,在显示屏上打印出行和列的编号,以便在后续绘制 ASCII 字符时可以方便地确定字符的位置。
int numCols = LCD_WIDTH / 8;int numRows = LCD_HEIGHT / 10;// 标注行编号gfx->setTextColor(GREEN);for (int x = 0; x < numRows; x++) {gfx->setCursor(10 + x * 8, 2);gfx->print(x, 16);}// 标注列编号gfx->setTextColor(BLUE);for (int y = 0; y < numCols; y++) {gfx->setCursor(2, 12 + y * 10);gfx->print(y, 16);} -
绘制 ASCII 字符表:
char c = 0;for (int y = 0; y < numRows; y++) {for (int x = 0; x < numCols; x++) {gfx->drawChar(10 + x * 8, 12 + y * 10, c++, WHITE, BLACK);}}
【运行效果】

03_GFX_PCF85063_simpleTime
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
loop(): -
首先获取当前时间,如果当前时间与上一次显示的时间不同,则进行以下操作:
- 清除上一次显示时间的区域,通过填充一个矩形实现,以便更新时间显示时不会出现重叠。
- 设置文本颜色为黑色,并设置文本大小为 3。
- 调用 getCenteredX 函数计算当前时间字符串在屏幕上居中显示的 X 坐标。
- 设置光标位置并打印当前时间字符串,实现时间的更新显示。
- 将当前时间字符串复制到 previousTimeString,以便下次判断时间是否变化。
【运行效果】

04_GFX_ESPWiFiAnalyzer
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
setup():
初始化串口通信;
设置 WiFi 为站点模式并断开连接;
初始化显示屏,获取屏幕尺寸并计算各种绘图参数;
设置屏幕背景为黑色,绘制标题栏。
loop():
扫描 WiFi 网络并获取网络信息,包括信道、RSSI、BSSID 和 SSID;
统计每个信道上的网络数量、噪声水平和峰值信号强度;
清除旧的图形并根据扫描结果绘制新的图形,包括信号强度椭圆和网络信息文本;
打印扫描到的网络数量和噪声最小的信道;
绘制图形基线和信道编号;
根据条件进入低功耗模式。
【运行效果】
- 在 ST7789 显示器上绘制 WiFi 频段信号强度,实现了 WiFi 分析器的功能。如下图所示:

05_GFX_Clock
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
时针、分针、秒针的绘制:
void redraw_hands_cached_draw_and_erase() {gfx->startWrite();draw_and_erase_cached_line(center, center, nsx, nsy, SECOND_COLOR, cached_points, sHandLen + 1, false, false);draw_and_erase_cached_line(center, center, nhx, nhy, HOUR_COLOR, cached_points + ((sHandLen + 1) * 2), hHandLen + 1, true, false);draw_and_erase_cached_line(center, center, nmx, nmy, MINUTE_COLOR, cached_points + ((sHandLen + 1 + hHandLen + 1) * 2), mHandLen + 1, true, true);gfx->endWrite();}
【运行效果】

06_LVGL_Measuring_voltage
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
my_print():用于 LVGL 的日志输出,如果启用了 LVGL 的日志功能,这个函数会将日志信息打印到串口my_disp_flush():负责将 LVGL 的绘图缓冲区内容刷新到显示屏上example_increase_lvgl_tick():定时器回调函数,用于通知 LVGL 时间的流逝example_increase_reboot():另一个定时器回调函数,用于计数,达到一定次数后可能触发系统重启
【运行效果】
- 板上预留分压测电压,使用 GPIO1 读取模拟量值并通过分压公式得出电池电压

07_LVGL_PCF85063_simpleTime
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
setup():
初始化串口通信,以 115200 的波特率准备可能的串口调试;
尝试连接 PCF85063 实时时钟芯片,如果连接失败则进入死循环;
设置实时时钟的初始时间为 2024 年 9 月 24 日 11 时 9 分 41 秒;
初始化显示屏,设置屏幕亮度;
初始化 LVGL,并注册日志输出函数(如果启用了日志功能;
配置 LVGL 的显示驱动和绘图缓冲区,以及初始化输入设备驱动(虽然是一个虚拟的指针输入设备驱动)
创建定时器用于定期触发 LVGL 的时钟更新
创建一个标签并设置初始文本为“Initializing...”
loop():
调用 lv_timer_handler 让 LVGL 处理图形界面的任务;
每秒钟检查一次时间是否更新,如果是,则获取实时时钟的当前时间,通过串口输出,并将时间格式化为特定格式后更新标签的文本内容,同时设置标签的字体为 lv_font_montserrat_40。
【运行效果】

08_LVGL_QMI8658_ui
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
my_disp_flush():
这个函数是 LVGL 显示驱动的刷新函数。它负责将 LVGL 的绘图缓冲区内容刷新到显示屏上;
根据不同的颜色格式设置,调用 gfx 对象的相应函数来绘制位图到特定的区域;
最后通知 LVGL 显示刷新已完成。
loop():
调用 lv_timer_handler 让 LVGL 处理图形界面的任务;
检查 qmi(QMI8658 传感器对象)是否有新数据准备好。如果有,尝试获取加速度数据和陀螺仪数据,并通过串口输出;
同时,将加速度数据更新到 LVGL 的图表上,以便实时显示加速度在三个轴上的变化情况;
通过 delay(20) 增加数据轮询的频率,以确保及时获取传感器数据并更新显示。
【运行效果】
- 使用 LVGL 进行图形显示,与 QMI8658 IMU 通信以获取加速度计和陀螺仪数据

09_LVGL_Keys_Bee
【硬件连接】
- 使用 USB 线把板子接入电脑
【新旧版本对比】
- 此功能按钮是为解决外设按钮功能少而设计,在 V2 版本中,我们做了一些调整:

ESP32-S3-LCD-1.69 新旧版本对比
| 外设 | 旧版本 | 新版本 |
|---|---|---|
| 蜂鸣器(Buzz) | GPIO33 | GPIO42 |
| RTC 中断(RTC_INT) | GPIO41 | GPIO39 |
| 电源控制(SYS_EN) | GPIO35 | GPIO41 |
| 电源控制(SYS_OUT) | GPIO36 | GPIO40 |
其原理如下:
按下 PWR 之后可以使电池供电,此时系统启动,系统应定义 SYS_EN 持续输出高电平来维持上电效果,此时松开 PWR 不会断电。PWR 此时的功能即可以拉低 SYS_OUT,系统检测 SYS_OUT 按下、连按和长按,可以自定义关机控制操作,如长按模式下系统设置 SYS_EN 低电平断开电池供电,即可完成多功能按钮使用。
【代码分析】
loop():
调用 lv_timer_handler 让 LVGL 处理图形界面的任务;
读取输入引脚的状态,进行去抖动处理;
根据按钮的状态(按下或释放)以及时间间隔判断是单点击、双点击还是长按事件,并更新显示屏上的标签文本以显示相应的事件信息;
同时,对于长按事件会触发蜂鸣器发声,释放时则停止蜂鸣器并将特定输出引脚设置为低电平。
【运行效果】

10_LVGL_Arduino
【硬件连接】
- 使用 USB 线把板子接入电脑
【运行效果】
![]() | ![]() | ![]() | ![]() |
|---|
【LVGL 组件的使用】
使用 LVGL 框架开发时可以依据 lvgl 官方文档提供的组件说明来调用组件 LVGL8.3 Documents
下面是 Arduino IDE 的 LVGL 实际组件调研案例
![]() | ![]() | ![]() |
|---|








