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 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。
配置开发环境
安装和配置 Arduino IDE
请参考 安装和配置 Arduino IDE 教程 下载安装 Arduino IDE 并添加 ESP32 支持。
Version 1.0
| 板名称 | 板安装要求 | 版本号要求 |
|---|---|---|
| esp32 by Espressif Systems | “离线”安装/“在线”安装 | 3.0.2≤版本号≤3.1.1 |
安装库
- 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
- 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
- 可从 该处 下载 ESP32-S3-Touch-LCD-1.85 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| LVGL | 图形库 | v8.3.10 | "离线安装" |
| ESP32-audioI2S-master | 音频解码库 | v2.0.0 | "离线安装" |
Version 2.0
| 板名称 | 板安装要求 | 版本号要求 |
|---|---|---|
| esp32 by Espressif Systems | “离线”安装/“在线”安装 | 3.2.0 |
安装库
- 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
- 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
- 可从 该处 下载 ESP32-S3-Touch-LCD-1.85 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| LVGL | 图形库 | v9.3.0 | "离线安装" |
| ESP32-audioI2S-master | 音频解码库 | v2.0.0 | "离线安装" |
| ES7210 | 音频编码库 | - | "离线安装" |
| ES8311 | 音频解码库 | - | "离线安装" |
LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。
Arduino 工程参数设置
- 若烧录的示例存在语音识别模型,则 Partition Scheme 选择 "ESP SR 16M (3MB APP/7MB SPIFFS/2.9MB MODEL)"
- 若烧录的示例不存在语音识别模型,则 Partition Scheme 选择 "16M Flash (3MB APP/9.9MB FATFS)" 或其他

示例程序-v1
LVGL_Arduino
程序说明
- 本示例演示了板载各个设备的功能,页面一显示 SD Card,Flash Size,Battery Voltage 等参数,页面二为音乐播放界面;另外,此示例增加语音识别功能
硬件连接
- 将 SD 卡插入开发板中
- 将喇叭与开发板连接
- 将开发板接入电脑

代码解释
setup():硬件初始化,配置外设等- 硬件初始化:
setup()内部主要执行多个初始化函数,用来配置和初始化与 Arduino 连接的硬件组件,如 RTC、陀螺仪、LCD 显示、SD 卡、音频模块、麦克风等。通过这些初始化,确保硬件能够正常工作 - 图形界面初始化:调用
Lvgl_Init()来初始化 LVGL(Light and Versatile Graphics Library),一个广泛用于嵌入式系统的图形库。Lvgl_Example1()则是一个示例程序,用来展示如何在显示屏上渲染图形界面 - 任务调度:
Driver_Loop()函数创建了一个任务(DriverTask),用于管理和循环执行一些外设的操作
- 硬件初始化:
loop():主要用于图形界面的更新和任务调度- LVGL 任务循环:
Lvgl_Loop()是一个 LVGL 库的循环函数,用于处理图形界面的更新、事件响应和其他与 UI 相关的操作。在嵌入式系统中,图形库通常需要在主循环中频繁调用,以保持界面的刷新和交互的实时性 - 任务调度控制:
vTaskDelay(pdMS_TO_TICKS(5))用于让任务暂停 5 毫秒。vTaskDelay是 FreeRTOS 中的延时函数,目的是降低 CPU 的使用率,避免占用过多的时间片,确保系统的其他任务(如外设处理)也能够按时执行
- LVGL 任务循环:
运行效果
-
LCD 屏幕显示


-
LCD 屏幕显示参数说明
参数 功能 说明 SD Card 显示 SD 卡的大小 连接 SD 卡,若识别失败请将 SD 卡格式化为 FAT32 格式(首次识别失败请等待一会后复位下再查看) Flash Size 显示 Flash 大小 当前板载 16MB Flash Battery Voltage 电池电压 连接电池时可检测到电池电压 Angular deflection 显示板子角度偏移 显示三个方向的偏移 RTC Time 显示 RTC 时间 显示当前 RTC 时间
RTC 时间与当前时间不一致,是因为掉电状态下并不能留存数据,如需要保持 RTC 时间正常,则需连接 RTC 电池并更新 RTC 时间Wireless scan 显示扫描到的 WIFI 个数 扫描结束会在末尾显示 ..OK Backlight brightness 亮度滑动条 调节屏幕亮度 -
页面 2 为播放 SD 卡根目录下的 mp3 音频的 UI 页面
-
本程序默认启用语音识别,唤醒词为 “hi esp”,唤醒后,背光变暗后即可说出指令(背光未变暗则表示未被唤醒,识别要求较为严格,发音需要标准,语速放缓)
-
以下提供几种格式的 MIC 测试音频(请注意,每次 hi esp 唤醒失败的话请重新将音频调至该次唤醒词播放处重新播放)
-
请不要在使用喇叭播放音频时进行语音识别
-
测试音频中之所以播放两次唤醒词,是由于当前固件版本首次唤醒需要聚焦设备(比喻),并且当前固件并不允许关闭该功能
// 指令
Turn on the backlight
Turn off the backlight
Backlight is brightest
Backlight is darkest
示例程序-v2
Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。
| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_lvgl_example | 展示了基本的 LVGL 图形库功能,也可以用于测试显示屏的基础性能以及随机文本显示效果 | LVGL |
| 02_RTC_PCF85063 | RTC 时钟测试 | - |
| 03_audio_out_no_tf | 音频播放测试 | ESP32-audioI2S-master |
| 04_SDMMC_Test | SD 卡挂载测试 | - |
| 05_audio_out_tf | SD 卡音频播放测试 | ESP32-audioI2S-master |
| 06_AnalogRead | ADC 读取电池电压 | - |
| 07_WiFi_http_Client | WIFI 连接及 HTTP GET 测试 | - |
| 08_esp_sr | 语音唤醒及语音识别功能测试 | - |
01_lvgl_example
【程序说明】
- 本示例演示了 LVGL Widgets 的功能,可以在代码中切换不同 demo 查看效果。
【硬件连接】
- 将开发板接入电脑
【代码分析】
setup:负责初始化各种硬件设备和 LVGL 图形库环境I²C总线初始化:I2C_Init()初始化I²C总线,用于与其他I²C设备通信- 扩展芯片初始化:创建并初始化扩展芯片
TCA9554PWR_Init(0x00);,设置引脚模式为输出,并进行一些初始的引脚状态设置 - 背光初始化:初始化
PWM控制器Backlight_Init(); - 图形显示初始化:初始化图形显示设备
LCD_Init();,然后初始化LVGL,包括注册打印回调函数用于调试,初始化显示驱动和输入设备驱动。创建并启动LVGL的定时器,最后调用lv_demo_widgets()展示LVGL的示例小部件
【运行效果】
-
LCD 屏幕显示

02_RTC_PCF85063
【程序说明】
- 本示例演示了实时时钟 PCF85063A 的功能,每秒检索时间,并在串口打印当前时间。
【硬件连接】
- 将开发板接入电脑
【代码分析】
- setup:负责初始化各种硬件外设
- 串口初始化:Serial.begin(115200); 为串口调试做准备
- I²C 总线初始化:I2C_Init()'初始化 I²C 总线,用于与其他 I²C 设备通信
- 初始化 PCF85063 芯片 PCF85063_Init();
- loop:
- 读取实时时钟数据:PCF85063_Loop();
- 将数据转换成字符串并打印到 LOG:PCF85063_Loop();
【运行效果】
-
查看串口监视器

03_audio_out_no_tf
【程序说明】
- 本示例演示了如何初始化音频外设,并播放音乐。
【硬件连接】
- 将开发板接入电脑
【代码分析】
- setup:负责初始化各种硬件外设
- 串口初始化:Serial.begin(115200); 为串口调试做准备
- I²C 总线初始化:I2C_Init()'初始化 I²C 总线,用于与其他 I²C 设备通信
- 初始化 ES8311 音频解码器芯片 es8311_codec_init();
- 初始化 I2S 外设 setupI2S();
- 初始化 PA 引脚并设置为高电平 pinMode(15, OUTPUT);digitalWrite(15, HIGH); GPIO15 控制功放使能输出
- loop:
- 读取音频数据并通过 I2S 输出到 ES8311:'i2s.write((uint8_t *)audio_data, AUDIO_SAMPLES * 2);
【运行效果】
- 此例程无屏幕显示及 LOG 输出
- 烧录代码后会循环播放音频
04_SDMMC_Test
【程序说明】
- 本示例演示了 SD 卡挂载,打印 TF 类型信息,并读写文件测试。
【硬件连接】
- 将开发板接入电脑
- 需要插入 TF 卡
【代码分析】
- setup:负责初始化各种硬件外设
- 串口初始化:Serial.begin(115200); 为串口调试做准备
- 初始化 SDIO 引脚 SD_MMC.setPins(clk, cmd, d0)
- 挂载 TF 卡 SD_MMC.begin("/sdcard", true)
- 获取 SD 卡类型 SD_MMC.cardType();
- 获取 SD 卡容量大小 SD_MMC.cardSize()
- 写入文件测试 writeFile(SD_MMC, "/hello.txt", "Hello ");
【运行效果】
-
查看串口监视器

05_audio_out_tf
【程序说明】
- 本示例演示了 SD 卡挂载,并读取 SD 卡中的音频文件进行播放。
【硬件连接】
- 将开发板接入电脑
- 需要插入 TF 卡,并放入 MP3 文件
【代码分析】
- setup:负责初始化各种硬件外设
- 串口初始化:Serial.begin(115200); 为串口调试做准备
- I²C 总线初始化:I2C_Init()'初始化 I²C 总线,用于与其他 I²C 设备通信
- 挂载 SD 卡 sdmmc_init();
- 初始化 ES8311 音频解码器芯片 es8311_codec_init();
- 初始化音频 I2S 外设引脚 audio.setPinout(I2S_BCK_PIN, I2S_LRCK_PIN, I2S_DOUT_PIN,I2S_MCLK_PIN);
- 设置播放路径 audio.connecttoFS(SD_MMC, "ff-16b-1c-44100hz.mp3");
- 初始化 PA 引脚并设置为高电平 pinMode(15, OUTPUT);digitalWrite(15, HIGH); GPIO15 控制功放使能输出
- loop:
- 音频处理 audio.loop();
【运行效果】
- 此例程无屏幕显示及 LOG 输出
- 烧录代码后会循环播放音频
06_AnalogRead
【程序说明】
- 本示例演示了通过 ADC 读取原始 ADC 值及电池电压。
【硬件连接】
- 将开发板接入电脑
- 需要插入电池
- 需要将电源开关打
【代码分析】
- setup:负责初始化各种硬件外设
- 串口初始化:Serial.begin(115200); 为串口调试做准备
- 初始化 ADC 外设 analogReadResolution(12);
- loop:
- 获取原始 ADC 值 analogRead(8);
- 获取转换后实际电压值 analogReadMilliVolts(8);
- 打印电池电压 Serial.printf("BAT millivolts value = %d\n", analogVolts*3); 电池电压通过电阻分压再送入 ADC 检测
【运行效果】
-
查看串口监视器

07_WiFi_http_Client
【程序说明】
- 本示例演示了 WIFI 的连接以及 HTTP GET 方式获取 JSON 数据。
【硬件连接】
- 将开发板接入电脑
【代码分析】
- setup:负责初始化各种硬件外设
- 设置连接的 SSIDconst char *ssid = "WSTEST";
- 设置连接的 PASSWORDconst char *password = "waveshare0755";
- 串口初始化:Serial.begin(115200); 为串口调试做准备
- WIFI 初始化及连接连接 WiFi.begin(ssid, password);
- 连接成功打印 IP 地址 Serial.println(WiFi.localIP());
- loop:
- 连接 HTTP 服务器 client.connect(host, httpPort)
- 获取响应 readResponse(&client);
【运行效果】
-
查看串口监视器

08_esp_sr
【程序说明】
- 本示例演示了 ESP-SR 的语音唤醒及语音识别功能。
【硬件连接】
- 将开发板接入电脑
【代码分析】
- setup:负责初始化各种硬件外设
- 串口初始化:Serial.begin(115200); 为串口调试做准备
- 初始化 I2CWire.begin(I2C_PIN_SDA, I2C_PIN_SCL);
- ES7210 编码器初始化 es7210_init();
- 设置 I2S 引脚 i2s.setPins(I2S_PIN_BCK, I2S_PIN_WS, I2S_PIN_DOUT, I2S_PIN_DIN, I2S_PIN_MCK);
- 初始化 I2S 外设 i2s.begin(I2S_MODE_STD, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO);
- 设置语音唤醒及识别事件 ESP_SR.onEvent(onSrEvent);
- 初始化 ESP-SR 语音识别模块 ESP_SR.begin(i2s, sr_commands, sizeof(sr_commands) / sizeof(sr_cmd_t), SR_CHANNELS_STEREO, SR_MODE_WAKEWORD);
- onSrEvent(sr_event_t event, int command_id, int phrase_id):ESP-SR 语音识别回调事件
- 连接 HTTP 服务器 client.connect(host, httpPort)
- 获取响应'readResponse(&client);
【运行效果】
-
查看串口监视器

切换为中/英文识别模型
环境初始状态默认为英文识别环境,按照以下步骤可切换为中文识别模型或还原为英文识别模型
【切换为中文识别模型】
【 中文识别环境搭建 】
- 下载提供的程序文件 使用中文模型的程序
- 进入路径
C:\Users\Waveshare\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.2\libraries\ESP_SR\src(其中 Waveshare 为电脑用户名) - 使用下载的文件替换该路径下的
esp32-hal-sr.c - 下载中文模型 中文模型-唤醒词 hi 乐鑫
- 进入路径
C:\Users\Waveshare\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-bd2b9390ef\esp32s3\esp_sr(其中 Waveshare 为电脑用户名) - 使用下载的文件替换该路径下的
srmodels.bin - 将程序中的识别指令修改为中文指令(拼音)

【切换为英文识别模型】
【切换为英文识别模型】
- 环境初始状态默认为英文识别环境,若未转为中文,则不进行以下修改
- 若此前有将其修改为中文识别则,下载提供的程序文件 使用英文模型的程序
- 进入路径
C:\Users\Waveshare\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.2\libraries\ESP_SR\src(其中 Waveshare 为电脑用户名) - 使用下载的文件替换该路径下的
esp32-hal-sr.c - 下载英文模型 英文模型-唤醒词 hi esp
- 进入路径
C:\Users\Waveshare\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.1-bd2b9390ef\esp32s3\esp_sr(其中 Waveshare 为电脑用户名) - 使用下载的文件替换该路径下的
srmodels.bin - 将程序中的识别指令修改为英文指令(音素)
