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. 安装库
- 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
- 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
- 可从 该处 下载 ESP32-S3-ePaper-3.97 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
| 库或文件名称 | 说明 | 版本 | 安装方式 |
|---|---|---|---|
| SensorLib | 传感器库 | v0.3.1 | "离线/在线 安装" |
3. Arduino 工程参数设置

示例程序
Arduino 示例程序位于 示例程序包 的 Arduino/examples 目录中。
| 示例程序 | 基础例程说明 | 依赖库 |
|---|---|---|
| 01_Audio_Test | 驱动 ES8311 播放音乐 | - |
| 02_E-Paper_Example | 3.97inch e-Paper 墨水屏幕示例程序 | - |
| 03_I2C_PCF85063 | RTC 例程 | - |
| 04_I2C_SHTC3 | 温湿度传感器例程 | SensorLib |
| 05_SD_Test | SD 卡例程 | - |
| 06_QMI8658A | 六轴陀螺仪例程 | SensorLib |
01_Audio_Test
【程序说明】
- 该示例可驱动 ES8311 音频编解码器,播放音乐
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
配置 ES8311 音频编解码器初始化。
void setup() {
Serial.begin(115200);
Wire.begin(I2C_SDA, I2C_SCL);
pinMode(PA_CTRL, OUTPUT);
digitalWrite(PA_CTRL, HIGH);
es8311_codec_init();
setupI2S();
Serial.println("I2S Initialized");
} -
持续向 I2S 总线写入内置音频数据,实现循环播放。
i2s.write((uint8_t *)audio_data, AUDIO_SAMPLES * 2);
【运行效果】
- 播放音频文件,屏幕无现象
02_E-Paper_Example
【程序说明】
- 该示例为 3.97 寸墨水屏 Arduino 本地例程,实现电子纸初始化清屏,显示图片,绘制基础图形、文字,局部刷新动态显示时间。
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
显示预设图片。
#if 1 // show bmp
EPD_3IN97_Init_Fast();
printf("show image for array\r\n");
EPD_3IN97_Display(gImage_image);
DEV_Delay_ms(1500);
#endif -
绘制基础图形、中英文文字、数字,并刷新显示。
#if 1 // Drawing on the image
//1.Select Image
EPD_3IN97_Init();
printf("SelectImage:BlackImage\r\n");
Paint_SelectImage(BlackImage);
Paint_Clear(WHITE);
// 2.Drawing on the image
Debug("Drawing:BlackImage\r\n");
Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT);
Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);
Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
Paint_DrawCircle(45, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
Paint_DrawCircle(105, 95, 20, WHITE, DOT_PIXEL_1X1, DRAW_FILL_FULL);
Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE);
Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
Paint_DrawString_CN(130, 0, " 你好 abc", &Font12CN, BLACK, WHITE);
Paint_DrawString_CN(130, 20, "微雪电子", &Font24CN, WHITE, BLACK);
printf("EPD_Display\r\n");
EPD_3IN97_Display_Base(BlackImage);
DEV_Delay_ms(3000);
#endif
【运行效果】
-
屏幕刷新显示

03_I2C_PCF85063
【程序说明】
- 该示例使用板载 PCF85063 RTC 芯片,实现 3.97 寸墨水屏结合 I2C 接口 RTC 实时时钟模块动态显示功能
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
循环读取 RTC 时间,格式化字符串后局部刷新墨水屏显示。
void i2c_rtc_loop_task(void *arg)
{
char buff[80];
for(;;)
{
RtcDateTime_t datetime = rtc_dev->get_rtcTime();
printf("%d/%d/%d %d:%d:%d \n",datetime.year,datetime.month,datetime.day,datetime.hour,datetime.minute,datetime.second);
Paint_NewImage(BlackImage, Font20.Height *3, Font20.Width * 8, 270, WHITE);
Paint_SelectImage(BlackImage);
Paint_Clear(WHITE);
sprintf(buff, "%d-%d-%d", datetime.year,datetime.month,datetime.day);
Paint_DrawString_EN(0, 5, buff, &Font20, WHITE, BLACK);
sprintf(buff, "%d:%d:%d", datetime.hour,datetime.minute,datetime.second);
Paint_DrawString_EN(0, 35, buff, &Font20, WHITE, BLACK);
EPD_3IN97_Display_Partial(BlackImage, 50, 250, 50 + Font20.Height*3 , 250 + Font20.Width * 8);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
【运行效果】
-
墨水屏局部刷新显示时间

04_I2C_SHTC3
【程序说明】
- 该示例使用板载 SHTC3 温湿度传感器,实现 3.97 寸墨水屏动态显示温湿度数据功能
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
循环读取传感器数据,局部刷新墨水屏,显示温湿度数据。
void i2c_SHTC3_loop_task(void *arg)
{
char buff[80];
for(;;)
{
shtc3_data_t shtc3_data = shtc3_dev->readTempHumi();
printf("RH:%.2f%%,Temp:%.2f°C \n",shtc3_data.RH,shtc3_data.Temp);
Paint_NewImage(BlackImage, Font20.Height *3, Font20.Width * 8, 270, WHITE);
Paint_SelectImage(BlackImage);
Paint_Clear(WHITE);
sprintf(buff, "%.2f%%",shtc3_data.RH);
Paint_DrawString_EN(0, 5, buff, &Font20, WHITE, BLACK);
sprintf(buff, "%.2f", shtc3_data.Temp);
Paint_DrawString_EN(0, 35, buff, &Font20, WHITE, BLACK);
Paint_DrawString_CN(Font20.Width * 5, 30, "℃", &Font12CN, WHITE, BLACK);
EPD_3IN97_Display_Partial(BlackImage, 50, 250, 50 + Font20.Height*3, 250 + Font20.Width * 8);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
【运行效果】
-
墨水屏局部刷新显示温湿度

05_SD_Test
【程序说明】
- 该示通过读取 SD 卡中的 BMP 图片并在墨水屏上刷新显示
【硬件连接】
- 使用 USB 线把板子接入电脑
- 将保存有图片的 bmp 文件夹放入 SD 卡根目录,插入 SD 卡模块
【代码分析】
-
配置挂载 SD 卡
//sdcard init
Serial.begin(115200);
delay(1000);
SD_MMC.setPins(SD_CLK, SD_CMD, SD_D0, SD_D1, SD_D2, SD_D3);
if (!SD_MMC.begin("/sdcard", true)) {
printf("SD card failed to mount\r\n");
return;
}
printf("SD card success to mount\r\n"); -
显示图片
printf("show BMP-------------------------\r\n");
EPD_3IN97_Init_Fast();
Paint_Clear(WHITE);
GUI_ReadBmp("/sdcard/bmp/100x100.bmp", 50, 50);
EPD_3IN97_Display_Fast(Image);
printf("100*100 BMP Load OK!\r\n");
DEV_Delay_ms(1000);
Paint_Clear(WHITE);
GUI_ReadBmp("/sdcard/bmp/3in97.bmp",0 ,0);
EPD_3IN97_Display_Fast(Image);
printf("800*480 BMP Load OK!\r\n");
DEV_Delay_ms(3000); -
显示 4 灰度 BMP 图片
EPD_3IN97_Init_4GRAY();
Paint_NewImage(Image, EPD_3IN97_WIDTH, EPD_3IN97_HEIGHT, 0, WHITE);
Paint_SetScale(4);
Paint_Clear(WHITE);
if(GUI_ReadBmp_4Gray("/sdcard/bmp/3in97_4Gray.bmp", 0, 0) == 0){
printf("4Gray BMP Load OK!\r\n");
}else{
printf("4Gray BMP Load Failed!\r\n");
}
EPD_3IN97_Display_4Gray(Image);
DEV_Delay_ms(3000);
【运行效果】
-
读取显示 sd 卡图片



06_QMI8658A
【程序说明】
- 该示例使用板载 QMI8658 六轴 IMU 传感器,墨水屏显示数值
【硬件连接】
- 使用 USB 线把板子接入电脑
【代码分析】
-
检测数据就绪,读取并打印传感器数据,调用显示函数更新墨水屏显示数据
if (qmi.getDataReady()) {
if (qmi.getAccelerometer(acc.x, acc.y, acc.z)) {
Serial.print("ACCEL.x:"); Serial.print(acc.x); Serial.print(",");
Serial.print("ACCEL.y:"); Serial.print(acc.y); Serial.print(",");
Serial.print("ACCEL.z:"); Serial.print(acc.z); Serial.println();
}
if (qmi.getGyroscope(gyr.x, gyr.y, gyr.z)) {
Serial.print(" GYRO.x:"); Serial.print(gyr.x); Serial.print(",");
Serial.print(" GYRO.y:"); Serial.print(gyr.y); Serial.print(",");
Serial.print(" GYRO.z:"); Serial.print(gyr.z); Serial.println();
}
qmi8658_data_show();
}
【运行效果】
-
墨水屏局部刷新显示六轴陀螺仪传感器数据
