跳到主要内容

Arduino 开发

本章节包含以下部分,请按需阅读:

Arduino 入门教程

初次接触 Arduino ESP32 开发,想要快速上手?我们为您准备了一套通用的 入门教程

请注意:该教程使用 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_Example3.97inch e-Paper 墨水屏幕示例程序-
03_I2C_PCF85063RTC 例程-
04_I2C_SHTC3温湿度传感器例程SensorLib
05_SD_TestSD 卡例程-
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();
    }

【运行效果】

  • 墨水屏局部刷新显示六轴陀螺仪传感器数据