跳到主要内容

Arduino 开发

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

Arduino 入门教程

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

请注意:该教程使用 ESP32-S3-Zero 作为教学示例,所有硬件代码均基于其引脚布局。在动手实践前,建议您对照手中的开发板引脚图,确认引脚配置无误。

配置开发环境

1. 安装和配置 Arduino IDE

请参考 安装和配置 Arduino IDE 教程 下载安装 Arduino IDE 并添加 ESP32 支持。

2. 安装库

  • 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
  • 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
  • 可从 此链接Arduino 目录中,下载 ESP32-S3-Touch-AMOLED-1.75C 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
库或文件名称说明版本安装方式
ESP32-audioI2S-master音频播放库v3.4.5通过库管理器或手动安装
SensorLibPCF85063、QMI8658 传感器驱动库v0.3.1通过库管理器或手动安装
es7210ES7210 驱动-手动安装
es8311ES8311 驱动-手动安装
kode_bq27220bq27220 电池检测驱动——手动安装
lvglLVGL UIv8.4.0手动安装
版本兼容性说明

LVGL 及其驱动库的版本之间存在较强的依赖关系。例如,为 LVGL v8 编写的驱动可能不兼容 LVGL v9。为确保示例能够稳定复现,推荐使用上表列出的特定版本。混合使用不同版本的库可能导致编译失败或运行时异常。

安装步骤:

  1. 进入已下载的 示例程序包

  2. 将其 Arduino\libraries 目录下的所有文件夹(Arduino_DriveBus、GFX_Library_for_Arduino 等)复制到 Arduino 的库文件夹中。

    信息

    Arduino 库文件夹的路径通常是:c:\Users\<用户名>\Documents\Arduino\libraries

    也可以在 Arduino IDE 中通过 文件 > 首选项,查看“项目文件夹位置”来定位。库文件夹就是此路径下的 libraries 文件夹。

  3. 其他安装方式请参考:Arduino 库管理教程

ESP32-S3-Touch-LCD-1.85B 所需开发板安装说明

板名称板安装要求版本号要求
ESP32 by Espressif Systems“离线”安装/“在线”安装≥3.2.0

示例程序

Arduino 示例程序位于 示例程序包Arduino/examples 目录中。

示例程序基础例程说明依赖库
01_lvgl_demo展示了基本的 LVGL 图形库功能,测试显示屏的基础性能lvgl
02_lvgl_BQ27220测试 BQ27220 电量监测传感器kode_bq27220
03_audio_out_no_tf音频播放测试es8311
04_SDMMC_TestTF 卡挂载以及读写文件测试——
05_audio_out_tfLVGL 演示LVGL,Arduino_DriveBus
06_esp_srES7210 驱动示例,拾取人声检测——
07_I2C_qmi8658陀螺仪驱动测试SensorLib
08_I2C_pcf85063RTC 实时时钟驱动测试SensorLib

01_lvgl_demo

程序说明

  • 本示例演示了如何使用 Arduino 驱动显示屏,并播放多个 LVGL 示例程序。

硬件连接

  • 将开发板接入电脑

代码分析

  • 初始化屏幕、触摸以及 LVGL:

    I2C_Init();
    Backlight_Init();
    LCD_Init();
    Lvgl_Init();
  • 选择对应的 LVGL DEMO 运行:

    lv_demo_widgets();
    // lv_demo_benchmark();
    // lv_demo_keypad_encoder();
    // lv_demo_music();
    // lv_demo_stress();

运行效果

02_lvgl_BQ27220

程序说明

  • 本示例演示使用 BQ27220 电量监测传感器读取电池信息,并在 LVGL 中显示出来

硬件连接

  • 接入 3.7V 锂电池

代码分析

  • 创建 I2C 互斥锁,避免触摸和 BQ27220 在不同任务读取时发生冲突

    wire_mutex = xSemaphoreCreateMutex();
  • 初始化 BQ27220

    if (!gauge.begin(Wire, 0x55, I2C_SDA_PIN, I2C_SCL_PIN, 400000)) {
    Serial.println("BQ27220 not found");
    while (1) delay(1000);
    }

运行效果

03_audio_out_no_tf

程序说明

  • 本示例演示使用 ES8311 音频解码器播放音乐

硬件连接

  • 接入喇叭
  • 将开发板接入电脑

代码分析

  • 初始化 I2C 控制器和外部拓展 IO

    DEV_I2C_Init();
    IO_EXTENSION_Init();
    IO_EXTENSION_Output(IO_EXTENSION_IO_6, 1);
  • 初始化 ES8311

    es8311_codec_init();
  • 初始化 I2S 并使能功放 PA 引脚

    setupI2S();
    IO_EXTENSION_Output(IO_EXTENSION_IO_4, 1);
  • 在 loop 循环中不断写通过 I2S 向 ES8311 写数据

    void loop() {
    i2s.write((uint8_t *)audio_data, AUDIO_SAMPLES * 2);
    }

运行效果

  • 屏幕无显示
  • 烧录程序后会自动开始播放音乐

04_SDMMC_Test

程序说明

  • 本示例演示了如何挂载 TF 卡,并测试读写文件

硬件连接

  • 插入 TF 卡
  • 将开发板接入电脑

代码分析

  • 设置 SDIO 接口引脚,并挂载文件系统

    if(! SD_MMC.setPins(clk, cmd, d0)){
    Serial.println("Pin change failed!");
    return;
    }

    if (!SD_MMC.begin("/sdcard", true)) {
    Serial.println("Card Mount Failed");
    return;
    }
  • 读写文件测试

    listDir(SD_MMC, "/", 0);
    createDir(SD_MMC, "/mydir");
    listDir(SD_MMC, "/", 0);
    removeDir(SD_MMC, "/mydir");
    listDir(SD_MMC, "/", 2);
    writeFile(SD_MMC, "/hello.txt", "Hello ");
    appendFile(SD_MMC, "/hello.txt", "World!\n");
    readFile(SD_MMC, "/hello.txt");
    deleteFile(SD_MMC, "/foo.txt");
    renameFile(SD_MMC, "/hello.txt", "/foo.txt");
    readFile(SD_MMC, "/foo.txt");
    testFileIO(SD_MMC, "/test.txt");
    Serial.printf("Total space: %lluMB\n", SD_MMC.totalBytes() / (1024 * 1024));
    Serial.printf("Used space: %lluMB\n", SD_MMC.usedBytes() / (1024 * 1024));

运行效果

05_audio_out_tf

程序说明

  • 本示例演示从 TF 卡中播放 MP3 音频

硬件连接

  • 插入 TF 卡,并在根目录放置文件名为 ff-16b-1c-44100hz.mp3 的音频文件
  • 接入喇叭
  • 将开发板接入电脑

代码分析

  • 初始化 I2S 以及音频解码库,并设置播放路径

    audio.setPinout(I2S_BCK_PIN, I2S_LRCK_PIN, I2S_DOUT_PIN,I2S_MCLK_PIN);
    audio.connecttoFS(SD_MMC, "ff-16b-1c-44100hz.mp3");

运行效果

  • 屏幕无显示 -烧录程序自动播放 MP3 音乐

06_esp_sr

程序说明

  • 本示例演示了使用 ES7210 音频编码芯片进行语音唤醒和语音识别

硬件连接

  • 将开发板接入电脑

代码分析

  • 初始化 I2S 以及 ES7210 音频编码器

    Wire.begin(I2C_PIN_SDA, I2C_PIN_SCL);
    es7210_init();
    i2s.setPins(I2S_PIN_BCK, I2S_PIN_WS, I2S_PIN_DOUT, I2S_PIN_DIN, I2S_PIN_MCK);
    i2s.setTimeout(1000);
    i2s.begin(I2S_MODE_STD, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO);
  • 注册语音唤醒以及语音识别回调事件,并开启 ESP-SR

    ESP_SR.onEvent(onSrEvent);
    ESP_SR.begin(i2s, sr_commands, sizeof(sr_commands) / sizeof(sr_cmd_t), SR_CHANNELS_STEREO, SR_MODE_WAKEWORD);

运行效果

07_I2C_qmi8658

【程序说明】

  • 通过 I2C 协议,对 QMI8658 芯片进行初始化设置,然后每隔 200ms 读取对应的姿态信息打印到终端。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • void i2c_qmi_loop_task(void *arg):创建一个 QMI 任务来实现获取姿态信息,在任务中读取并打印加速度计、陀螺仪数据,并将获取的结果输出到串口控制台,间隔 200ms 。

【运行效果】

  • 打开串口监控,可以看到打印输出的 IMU 发出来的原始数据(欧拉角需要自己转换),如下图所示:

08_I2C_pcf85063

【程序说明】

  • 通过 I2C 协议,分别对 PCF85063 芯片进行初始化、设置时间、间隔读取时间,然后打印到终端。

【硬件连接】

  • 使用 USB 线把板子接入电脑

【代码分析】

  • void i2c_rtc_loop_task(void *arg):创建一个 RTC 任务来实现 RTC 功能,每隔 1 秒读取一次 RTC 芯片的时钟,然后输出到终端。

【运行效果】

  • 程序编译下载完成,打开串口监控可以看到打印输出的 RTC 时间,如下图所示: