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. 安装库
示例程序使用 LVGL 图形库驱动 AMOLED 显示屏。请先确认开发板 PCB 版本,再下载对应的示例程序:
V1 资料包的 Arduino\libraries 目录包含示例所需的库文件;V2 请按照仓库中的说明安装依赖。
| 库名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| LVGL | 图形库 | v8.4.0 | 离线安装 |
V1 与 V2 示例程序不通用。LVGL 与驱动库之间也存在版本依赖,请使用对应资料包提供或指定的库版本,避免混用。
V1 库安装步骤:
-
解压 V1 示例程序包。
-
将
Arduino\libraries目录下的库文件夹复制到 Arduino 库目录。信息Arduino 库目录通常为:
C:\Users\<用户名>\Documents\Arduino\libraries。也可以在 Arduino IDE 中通过 文件 > 首选项 查看“项目文件夹位置”,其下的
libraries文件夹即为库目录。 -
其他安装方式请参考:Arduino 库管理教程。
3. 其他提示
ESP32-S3-Touch-AMOLED-1.64 使用 ESP32-S3 原生 USB 接口。若要通过 Serial.println() 使用 USB 串口,请在 Arduino IDE 的 工具 菜单中启用 USB CDC On Boot。
示例程序
Arduino 示例程序位于对应资料包的 Arduino 目录中。

| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_ADC_Test | 读取系统当前的电压值 | - |
| 02_I2C_QMI8658 | 打印 IMU 发出的原始数据 | - |
| 03_SD_Card | 加载并显示 SD 卡信息 | - |
| 04_WIFI_AP | 设置为 AP 模式,可获取接入设备的 MAC 地址 | - |
| 05_WIFI_STA | 设置为 STA 模式,可接入 Wi-Fi 并获取 IP 地址 | - |
| 06_LVGL_Test | LVGL 示例 | LVGL |
Arduino 工程参数设置

01_ADC_Test
【程序说明】
- 通过GPIO连接的模拟量电压经过ADC转换成数字量,然后通过计算得到实际的系统电压,打印到终端。
【硬件连接】
- 使用USB线把板子接入电脑

【代码分析】
- adc_bsp_init(void) :初始化 ADC1,包括创建 ADC 单次触发单元并配置 ADC1 的通道 3。
- **adc_get_value(float value,int data) :读取 ADC1 通道 3 的值,并根据参考电压和分辨率计算出对应的电压值存储在传入的指针指向的位置,如果读取失败则存储 0。
- adc_example(void parameter)* :初始化 ADC1 后,创建一个ADC任务,该任务每隔 1 秒读取一次ADC的值,通过读取的ADC原始值计算出系统的电压。
【运行效果】
- 程序编译下载完成,打开串口监控可以看到打印输出的ADC的值和电压,如下图所示:

- ADC采样值是1900左右,系统电压是4.9V左右,若想具体分析,可以查看原理图。
02_I2C_QMI8658
【程序说明】
- 通过I2C协议,对QMI8658芯片进行初始化设置,然后每隔1秒读取对应的姿态信息打印到终端。
【硬件连接】
- 使用USB线把板子接入电脑(参考示例01)
【代码分析】
- qmi8658c_example(void parameter)* :该函数初始化 QMI8658 设备,在无限循环中读取并打印加速度计、陀螺仪数据和温度数据,每 1 秒执行一次,旋转板子的过程中陀螺仪数据随着旋转越快而越大,加速度计会根据当前的位置计算出对应的加速度。
【运行效果】
- 打开串口监控,可以看到打印输出的IMU发出来的原始数据(欧拉角需要自己转换),如下图所示:

- 数据每隔 1 秒输出一次,若需修改或参考,可直接进入 qmi 源文件进行操作。
03_SD_Card
【程序说明】
- 通过宏定义选择SPI或者SDMMC方式驱动SD卡,成功挂载SD卡之后把SD卡信息打印到终端。
【硬件连接】
- 板子装上SD卡(必须先插入容量小于64G的SD卡),使用USB线把板子接入电脑(参考示例01)
【代码分析】
-
可以根据用户选择来实现SD卡的通信协议,在**
sd_card_bsp.cpp** 源文件下找到**#define SDMMC_U** 宏定义,取消该宏定义注释即可使用SDMMC方式驱动SD卡。//#define SDMMC_U
【运行效果】
- 点击串口监控设备,可以看到输出的SD卡的信息,practical_size是SD卡的实际容量,如下图所示:

想了解更多关于Arduino ESP32库关于SD卡相关的使用?可访问:Arduino ESP32 库 SD 使用
04_WIFI_AP
【程序说明】
- 该示例可将开发板设置为热点,允许手机或其他处于 STA 模式的设备连接到开发板。
【硬件连接】
- 使用USB线把板子接入电脑(参考示例01)
【代码分析】
-
在**
05_WIFI_AP.ino** 文件找到**ssid** 和**password** ,然后手机或其他处于 STA 模式的设备即可使用该 ssid 和 password 连接到开发板。const char *ssid = "ESP32_AP";const char *password = "12345678";
【运行效果】
烧录完程序,打开串口终端,如果设备连接成功热点之后,会输出该设备的MAC地址,如图: 
05_WIFI_STA
【程序说明】
- 把开发板作为一个终端角色,可以连接环境可用的AP,成功连接之后打印获取到的IP信息到终端。
【硬件连接】
- 使用USB线把板子接入电脑(参考示例01)
【代码修改】
该工程实现芯片处于STA模式下连接WIFI而且获取到IP地址,在编译、下载固件之前,需要修改一些代码,此处修改成所处环境可用的WIFI路由器名字和密码。

【代码分析】
- wifi_init(void) :该函数用于初始化 ESP32 的 Wi-Fi 连接。它将 ESP32 设置为 Wi-Fi 站点模式,尝试连接到指定的 Wi-Fi 网络(通过
**ssid**和**password**)。如果连接成功,打印本地 IP 地址;如果在一定时间内(20 * 500 毫秒)未能连接成功,则打印连接失败信息。同时,函数还可以设置自动连接和自动重连功能。
【运行效果】
- 芯片处于STA模式下成功连接WIFI,并且点击串口监控设备,可以看到获取到的IP地址,如图:

06_LVGL_Test
【程序说明】
- 通过移植LVGL,在屏幕上实现一些多功能的GUI界面。
【硬件连接】
- 使用USB线把板子接入电脑(参考示例01)
【代码分析】
针对 LVGL,lvgl_conf.h 是其配置文件,下面对一些常用内容进行说明,还有一些LVGL的demo、文件系统都可以在conf配置文件里面设置
/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
#define LV_COLOR_DEPTH 16//Color depth, a macro definition that must be concerned with porting LVGL
#define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
#define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
#define LV_MEM_ADR 0 /*0: unused*/
/*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
#if LV_MEM_ADR == 0
#undef LV_MEM_POOL_INCLUDE
#undef LV_MEM_POOL_ALLOC
#endif
#else /*LV_MEM_CUSTOM*/
#define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/
#define LV_MEM_CUSTOM_ALLOC malloc
#define LV_MEM_CUSTOM_FREE free
#define LV_MEM_CUSTOM_REALLOC realloc
#endif /*LV_MEM_CUSTOM*/
//The above section is mainly for LVGL memory allocation,
//which defaults to lv_mem_alloc() versus lv_mem_free().
【代码修改】
-
显示芯片本身不支持硬件旋转,如果需要旋转显示可以通过软件实现,可以在 lcd_bsp.c 文件中找到**
#define EXAMPLE_Rotate_90** 宏定义然后取消注释该宏定义即可,软件旋转显示性能是不如硬件旋转的。//#define EXAMPLE_Rotate_90
【运行效果】
- LVGL例程对RAM和ROM要求比较高,所以必须要按照环境搭建的要求来配置程序烧录完成后,设备的运行效果如下:

LVGL更多学习及使用可参考LVGL官方文档