跳到主要内容

Arduino 开发

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

Arduino 入门教程

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

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

配置开发环境

1. 安装和配置 Arduino IDE

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

2. 安装库

  • 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
  • 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
  • 可从 该处 下载 ESP32-S3-Touch-LCD-3.5B 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
库或文件名称说明版本安装方式
LVGL图形库v8.4.0“在线”安装 (需要复制 demos 文件夹至 src)
GFX_Library_for_ArduinoLCD 驱动库v1.5.5"在线 安装"
XPowersLib电源管理驱动库v0.2.9“在线”安装
SensorLib传感器库v0.3.1“在线”安装
ESP32-audioI2S-master音频处理v3.3.0“在线”安装
TCA9554扩展 IO 库v0.1.2“在线”安装
OneButton按键库v2.6.1“在线”安装
esp_lcd_touch_axs15231b触摸驱动-“线”安装
es8311es8311 驱动库-“离线”安装

3. Arduino 工程参数设置

示例程序

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

示例程序基础例程说明依赖库
01_audio_out读取 SD 卡的音频文件,并播放ESP32-audioI2S-master
02_axp2101_example打印电源管理芯片的数据XPowersLib
03_button_exampleBOOT 按键单击、双击、长按等OneButton
04_es8311_example录音一段时间,并播放es8311
05_pcf85063_example打印 RTC 获取的数据SensorLib
06_qmi8658_example打印 IMU 的数据SensorLib
07_sd_test测试 SD 卡的读写-
08_gfx_helloworld屏幕上显示 HelloWorldGFX_Library_for_Arduino、TCA9554
09_lvgl_example_v8lvgl v8 版本示例程序lvgl(v8.4.0)、GFX_Library_for_Arduino、TCA9554、esp_lcd_touch_axs15231b
10_lvgl_example_v9lvgl v9 版本示例程序lvgl(v9.2.2)、GFX_Library_for_Arduino、TCA9554、esp_lcd_touch_axs15231b
11_camera_web_server在网页上显示摄像头图像XPowersLib

01_audio_out

【程序说明】

  • 本示例演示 ESP32-S3-Touch-LCD-3.5B 读取 SD 卡的音频文件并使用喇叭播放,支持 MP3、AAC、WAV 等格式。

【硬件连接】

  • 将 SD 卡插入电脑
  • 把需要播放的音乐文件 1.mp3 拷贝到 SD 卡
  • 将 SD 卡插入 ESP32-S3-Touch-LCD-3.5B

【代码分析】

  • 设置播放的音频文件

      audio.connecttoFS(SD_MMC, "1.mp3");

【运行效果】

  • 播放音频文件,屏幕无现象

02_axp2101_example

【程序说明】

  • 本示例演示使用 XPowers 驱动 AXP2101,并通过串口打印数据

【硬件连接】

  • 通过 USB 连接电脑

【代码分析】

  • 初始化

      bool result = power.begin(Wire, AXP2101_SLAVE_ADDRESS, i2c_sda, i2c_scl);

    if (result == false) {
    Serial.println("power is not online...");
    while (1) delay(50);
    }

【运行效果】

  • 屏幕无现象

  • 打开串口监视器

03_button_example

【程序说明】

  • 本示例演示如何使用 OneButton 库驱动 BOOT 按键,并通过串口打印单击、双击和长按等事件。

【硬件连接】

  • 通过 USB 连接电脑

【代码分析】

  • 绑定回调函数

      button1.attachClick(click1);
    button1.attachDoubleClick(doubleclick1);
    button1.attachLongPressStart(longPressStart1);
    button1.attachLongPressStop(longPressStop1);
    button1.attachDuringLongPress(longPress1);

【运行效果】

  • 屏幕无现象

  • 打开串口监视器

04_es8311_example

【程序说明】

  • 本示例演示使用 ESP32-S3-Touch-LCD-3.5B 驱动 ES8311 音频编解码器,实现音频录制及回放功能。

【硬件连接】

  • 通过 USB 连接电脑

【代码分析】

  • 初始化

      Wire.begin(I2C_SDA, I2C_SCL);
    es8311_codec_init();
    setupI2S();
  • 音频录制 5s,并播放录制的内容

      wav_buffer = i2s.recordWAV(5, &wav_size);
    delay(1000);
    Serial.println("I2S playWAV");
    i2s.playWAV(wav_buffer, wav_size);

【运行效果】

  • 屏幕无现象
  • 按下 ESP32-S3-Touch-LCD-3.5B 的 RST 按键进入音频录制状态,2s 后播放录制的内容。

05_pcf85063_example

【程序说明】

  • 本实例演示 ESP32-S3-Touch-LCD-3.5B 驱动 PCF85063,设置时间、日期以及获取时间。

【硬件连接】

  • 通过 USB 连接电脑

【代码分析】

  • 初始化

      if (!rtc.begin(Wire, PCF85063_SLAVE_ADDRESS, SENSOR_SDA, SENSOR_SCL)) {
    Serial.println("Failed to find PCF8563 - check your wiring!");
    while (1) {
    delay(1000);
    }
    }
  • 设置时间、日期

      rtc.setDateTime(year, month, day, hour, minute, second);
  • 获取时间、日期

      RTC_DateTime datetime = rtc.getDateTime();

【运行效果】

  • 屏幕无现象

  • 打开串口监视器

06_qmi8658_example

【程序说明】

  • 本实例演示 ESP32-S3-Touch-LCD-3.5B 驱动 QMI8658,获取并打印 Accel、Gyro 和 IMU 的温度。

【硬件连接】

  • 通过 USB 连接电脑

【代码分析】

  • 初始化

      if (!qmi.begin(Wire, QMI8658_L_SLAVE_ADDRESS, SENSOR_SDA, SENSOR_SCL)) {
    Serial.println("Failed to find QMI8658 - check your wiring!");
    while (1) {
    delay(1000);
    }
    }
  • 获取数据

      if (qmi.getDataReady()) {
    if (qmi.getAccelerometer(acc.x, acc.y, acc.z)) {
    }
    if (qmi.getGyroscope(gyr.x, gyr.y, gyr.z)) {
    }
    }

【运行效果】

  • 屏幕无现象

  • 打开串口监视器

07_sd_test

【程序说明】

  • 本示例演示使用 ESP32-S3-Touch-LCD-3.5B 测试 SD 卡的读写功能

【硬件连接】

  • 将板子接入电脑
  • Micro SD 卡 插入卡槽(SD 卡需要格式化为 FAT32)

【代码分析】

  • 初始化

      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;
    }

【运行效果】

  • 将 SD 卡插入电脑,可以发现多了两个文件 test.txt foo.test。其中 foo.txt 的内容为 Hello World!,test.txt 的内容为空

08_gfx_helloworld

【程序说明】

  • 本示例演示 ESP32-S3-Touch-LCD-3.5B 使用 GFX_Library_for_Arduino 库驱动屏幕并在屏幕上显示 HelloWorld

【硬件连接】

  • 将板子接入电脑

【代码分析】

  • 配置屏幕接口以及屏幕的分辨率等

      Arduino_DataBus *bus = new Arduino_ESP32QSPI(LCD_QSPI_CS, LCD_QSPI_CLK, LCD_QSPI_D0, LCD_QSPI_D1, LCD_QSPI_D2, LCD_QSPI_D3);
    Arduino_GFX *g = new Arduino_AXS15231B(bus, -1 /* RST */, 0 /* rotation */, false, 320, 480);
    Arduino_Canvas *gfx = new Arduino_Canvas(320, 480, g, 0, 0, ROTATION);

【运行效果】

09_lvgl_example_v8

【程序说明】

  • 本示例演示了使用 ESP32-S3-Touch-LCD-3.5B 运行 lvgl(v8.4.0)示例程序。

【硬件连接】

  • 将板子接入电脑

【准备工作】

  • 需要安装 lvgl v8.4.0 版本,如已安装其他版本,请重新安装。

【代码分析】

  • UI 初始化

      lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello Arduino! (V" GFX_STR(LVGL_VERSION_MAJOR) "." GFX_STR(LVGL_VERSION_MINOR) "." GFX_STR(LVGL_VERSION_PATCH) ")");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    lv_obj_t *sw = lv_switch_create(lv_scr_act());
    lv_obj_align(sw, LV_ALIGN_TOP_MID, 0, 50);

    sw = lv_switch_create(lv_scr_act());
    lv_obj_align(sw, LV_ALIGN_BOTTOM_MID, 0, -50);

【运行效果】

10_lvgl_example_v9

【程序说明】

  • 本示例演示了使用 ESP32-S3-Touch-LCD-3.5B 运行 lvgl(v9.2.2)示例程序。

【硬件连接】

  • 将板子接入电脑

【准备工作】

  • 需要安装 lvgl v9.2.2 版本,如已安装其他版本,请重新安装。

【代码分析】

  • UI 初始化

      lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello Arduino, I'm LVGL!(V" GFX_STR(LVGL_VERSION_MAJOR) "." GFX_STR(LVGL_VERSION_MINOR) "." GFX_STR(LVGL_VERSION_PATCH) ")");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    lv_obj_t *sw = lv_switch_create(lv_scr_act());
    lv_obj_align(sw, LV_ALIGN_TOP_MID, 0, 50);

    sw = lv_switch_create(lv_scr_act());
    lv_obj_align(sw, LV_ALIGN_BOTTOM_MID, 0, -50);

【运行效果】

11_camera_web_server

【程序说明】

  • 本示例演示了如何使用驱动摄像头。在连接 WiFi 后,程序会创建一个网页服务器,用户只需在浏览器中输入设备的 IP 地址即可访问。网页上可以显示摄像头的图像,并支持分辨率、镜像等设置操作

【硬件连接】

  • 将板子接入电脑
  • 将 OV5640 摄像头插入板子上的 24pin 座子(带外壳版本不需要这个操作)

【准备工作】

  • 设置 Parttion 为 Custom

【代码分析】

  • 定义摄像头相关的引脚

      #define PWDN_GPIO_NUM -1
    #define RESET_GPIO_NUM -1
    #define XCLK_GPIO_NUM 38
    #define SIOD_GPIO_NUM 8
    #define SIOC_GPIO_NUM 7

    #define Y9_GPIO_NUM 21
    #define Y8_GPIO_NUM 39
    #define Y7_GPIO_NUM 40
    #define Y6_GPIO_NUM 42
    #define Y5_GPIO_NUM 46
    #define Y4_GPIO_NUM 48
    #define Y3_GPIO_NUM 47
    #define Y2_GPIO_NUM 45
    #define VSYNC_GPIO_NUM 17
    #define HREF_GPIO_NUM 18
    #define PCLK_GPIO_NUM 41
  • 要连接的 wifi 名称和密码

      const char *ssid = "waveshare";
    const char *password = "12345678";
  • 启动服务器,开始提供 HTTP 视频流服务

      startCameraServer();
    Serial.print("Camera Ready! Use 'http://");
    Serial.print(WiFi.localIP());
    Serial.println("' to connect");

【运行效果】

  • 打开串口终端连接 WiFi 后可以看到 IP 地址

  • 使用浏览器(开热点的设备)打开串口打印的 IP 地址

  • 点击 Start Stream,可以看到摄像头的图像