跳到主要内容

Arduino 开发

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

Arduino 入门教程

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

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

配置开发环境

1. 安装和配置 Arduino IDE

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

2. 安装库

  • 在安装 Arduino 库时,通常有两种方式可供选择:在线安装 和 离线安装。若库安装要求离线安装,则必须使用提供的库文件。
  • 对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
  • 可从 该处 下载 ESP32-S3-Touch-LCD-2 开发板的示例程序包。包内的 Arduino\libraries 目录已包含本教程所需的全部库文件。
库或文件名称说明版本安装方式
LVGL图形库v8.4.0“在线”安装 (需要复制 demos 文件夹至 src)
GFX_Library_for_ArduinoLCD 驱动库v1.5.0"在线 安装"
FastIMUIUM 驱动库v1.2.6“在线”安装
bsp_cst816触摸驱动库-“离线”安装
版本兼容性说明

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

3. Arduino 工程参数设置

示例程序

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

示例程序基础例程说明依赖库
01_factory综合测试程序lvgl、GFX_Library_for_Arduino、FastIMU、OneButton
02_gfx_helloworld屏幕上显示 HelloWorldGFX_Library_for_Arduino
03_sd_card_test测试 SD 卡-
04_qmi8658_output串口打印 QMI8658 的数据FastIMU
05_lvgl_qmi8658使用 lvgl 库显示 QMI8658 的数据lvgl、FastIMU
06_lvgl_battery使用 lvgl 库显示电池电压lvgl、GFX_Library_for_Arduino
07_lvgl_brightness使用 lvgl 库控制和显示屏幕亮度lvgl、GFX_Library_for_Arduino
08_lvgl_examplelvgl 示例程序lvgl、GFX_Library_for_Arduino
09_lvgl_camera使用 lvgl 库显示摄像头图像lvgl、GFX_Library_for_Arduino
10_camera_web_server在网页上显示摄像头图像

01_factory

【程序说明】

  • 本示例测试 ESP32-S3-Touch-LCD-2 板载模块的功能,屏幕上将显示各个模块的信息,用户可以通过触摸屏进行页面切换

【硬件连接】

  • 将板子接入电脑
  • OV5640 摄像头插入板子上的 24pin 座子 (若没有也不影响其他功能使用)
  • Micro SD 卡 插入卡槽(若没有也不影响其他功能使用)

【代码分析】

  • 硬件初始化

      Serial.begin(115200);
    bsp_i2c_init(); //初始化 I2C 总线,通常用于连接传感器、显示器等外设
    bsp_lv_port_init(); //初始化 LVGL 图形库的端口,这样可以将图形输出到显示设备(如 LCD)
    bsp_spi_init(); //初始化 SPI 总线,通常用于与传感器、外部存储、屏幕等设备通信
  • LVGL 图形库配置

      bsp_lv_port_run();       //运行与 LVGL 相关的驱动或循环,例如刷新显示等
    if (lvgl_lock(-1)) { //锁定 LVGL 资源,确保在更新 UI 时不会与其他任务冲突
    lvgl_ui_init(); //初始化 UI,可能包括布局、控件等设置
    lvgl_unlock(); //解锁 LVGL,允许其他任务访问 LVGL
    }
  • 外设初始化

      app_qmi8658_init();                     //初始化 QMI8658 传感器(如加速度计、陀螺仪等)
    app_system_init(); //进行系统级的初始化,例如时钟、内存、复位等
    app_camera_init(); //初始化相机模块,准备好进行图像采集
    app_wifi_init(sta_ssid, sta_pass); //初始化 Wi-Fi 模块,连接到指定的 Wi-Fi 网络
  • 应用层任务运行

      app_qmi8658_run();       //启动 QMI8658 传感器相关的任务,例如数据采集、处理等
    app_system_run(); //启动系统任务,确保系统功能正常运行
    app_camera_run(); //启动相机相关的任务,通常是获取图像数据并进行处理或传输
    app_wifi_run(); //启动 Wi-Fi 相关任务,例如连接管理、数据传输等

【运行效果】

  • 单击 BOOT 按键是下,双击 BOOT 按键是上,长按 BOOT 按键是确定

  • System 界面

  • QMI8658 界面,可以看到获取到的 X、Y、Z 轴的加速度和角速度数据
  • camera 界面,可以看到摄像头获取的画面
  • WiFi 界面,显示要连接的 WiFi 名称和密码,连接成功后会显示 IP

02_gfx_helloworld

【程序说明】

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

【硬件连接】

  • 将板子接入电脑

【代码分析】

  • 创建 Arduino_ESP32SPI 类的对象 bus,用于配置 SPI 总线的 GPIO,创建 Arduino_ST7789 类的对象 gfx,用于驱动 ST7789 显示屏

      Arduino_DataBus *bus = new Arduino_ESP32SPI(
    EXAMPLE_PIN_NUM_LCD_DC /* DC */, EXAMPLE_PIN_NUM_LCD_CS /* CS */,
    EXAMPLE_PIN_NUM_LCD_SCLK /* SCK */, EXAMPLE_PIN_NUM_LCD_MOSI /* MOSI */, EXAMPLE_PIN_NUM_LCD_MISO /* MISO */);

    /* More display class: https://github.com/moononournation/Arduino_GFX/wiki/Display-Class */
    Arduino_GFX *gfx = new Arduino_ST7789(
    bus, EXAMPLE_PIN_NUM_LCD_RST /* RST */, EXAMPLE_LCD_ROTATION /* rotation */, true /* IPS */,
    EXAMPLE_LCD_H_RES /* width */, EXAMPLE_LCD_V_RES /* height */);

【运行效果】

03_sd_card_test

【程序说明】

  • 本示例演示了如何使用 ESP32-S3-Touch-LCD-2 测试 SD 卡的读写功能

【硬件连接】

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

【代码分析】

  • SPI 接口初始化以及 SD 卡初始化

      SPI.begin(sck, miso, mosi, cs);
    if (!SD.begin(cs)) {
    Serial.println("Card Mount Failed");
    return;
    }

【运行效果】

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

04_qmi8658_output

【程序说明】

  • 本示例演示了如何使用 ESP32-S3-Touch-LCD-2 获取 QMI8658 的数据并使用串口打印

【硬件连接】

  • 将板子接入电脑

【代码分析】

  • 初始化 QMI8658

      int err = IMU.init(calib, IMU_ADDRESS);
    if (err != 0) {
    Serial.print("Error initializing IMU: ");
    Serial.println(err);
    while (true) {
    ;
    }
    }

【运行效果】

  • 打开串口监视器,可以看到打印的 x、y、z 轴的 accel 和 gyro 以及 qmi8658 内部温度传感器的数据

05_lvgl_qmi8658

【程序说明】

  • 本示例演示使用 ESP32-S3-Touch-LCD-2 获取 qmi8658 的数据,并通过 lvgl 库将数据显示出来

【硬件连接】

  • 将板子接入电脑

【代码分析】

  • ui 的初始化,并创建一个 100ms 的定时器,用于获取 qmi8658 的数据

      lvgl_qmi8658_ui_init(lv_scr_act());

【运行效果】

06_lvgl_battery

【程序说明】

  • 本示例演示了如何使用 ESP32-S3-Touch-LCD-2 使用 lvgl 库在屏幕上显示电池电压以及 ADC 的值

【硬件连接】

  • 将板子接入电脑
  • 电池插入座子

【代码分析】

  • ui 的初始化,并创建一个 1000ms 的定时器,用于获取 adc 的数据并将该数据转换成电压

      lvgl_battery_ui_init(lv_scr_act());

【运行效果】

07_lvgl_brightness

【程序说明】

  • 本示例演示了如何使用 ESP32-S3-Touch-LCD-2 使用 lvgl 库在屏幕上显示屏幕亮度,通过滑动条可以控制屏幕亮度

【硬件连接】

  • 将板子接入电脑

【代码分析】

  • ui 的初始化,并创建一个滑动条值更改回调,当滑动条的值发生改变时,修改屏幕亮度

      lvgl_brightness_ui_init(lv_scr_act());

【运行效果】

08_lvgl_example

【程序说明】

  • 本示例演示了使用 ESP32-S3-Touch-LCD-2 运行 lvgl 示例程序

【硬件连接】

  • 将板子接入电脑

【注意事项】

  • 如果 lvgl 库是在线安装,需要复制 demos 文件夹至 src

【代码分析】

  • 选择要运行的 lvgl 示例

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

【运行效果】

09_lvgl_camera

【程序说明】

  • 本示例在 ESP32-S3-Touch-LCD-2 屏幕上使用 LVGL 库显示从摄像头获取的图像

【硬件连接】

  • 将板子接入电脑
  • 将 Micro SD 卡插入卡槽

【代码分析】

  • 创建一个任务专门获取摄像头图像的任务

      xTaskCreatePinnedToCore(camera_task, "camera_task_task", 1024 * 3, NULL, 1, NULL, 0);
  • 获取摄像头图像并更新显示

      camera_fb_t *pic;
    lv_img_dsc_t img_dsc;
    img_dsc.header.always_zero = 0;
    img_dsc.header.w = 480;
    img_dsc.header.h = 320;
    img_dsc.data_size = 320 * 480 * 2;
    img_dsc.header.cf = LV_IMG_CF_TRUE_COLOR;
    img_dsc.data = NULL;
    // lv_img_set_src(img_camera, &pic);
    while (1)
    {
    pic = esp_camera_fb_get();

    if (NULL != pic)
    {
    img_dsc.data = pic->buf;
    if (lvgl_lock(-1))
    {
    lv_img_set_src(img_camera, &img_dsc);
    lvgl_unlock();
    }
    }
    esp_camera_fb_return(pic);
    vTaskDelay(pdMS_TO_TICKS(1));
    }

【运行效果】

10_camera_web

【程序说明】

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

【硬件连接】

  • 将板子接入电脑
  • OV5640 摄像头插入板子上的 24pin 座子

【代码分析】

  • 选择相机模型并定义相关的引脚和配置

      #define CAMERA_MODEL_ESP_EYE  // Has PSRAM
    #define PWDN_GPIO_NUM 17 // Power down is not used
    #define RESET_GPIO_NUM -1 // Software reset will be performed
    #define XCLK_GPIO_NUM 8
    #define SIOD_GPIO_NUM 21
    #define SIOC_GPIO_NUM 16

    #define Y9_GPIO_NUM 2
    #define Y8_GPIO_NUM 7
    #define Y7_GPIO_NUM 10
    #define Y6_GPIO_NUM 14
    #define Y5_GPIO_NUM 11
    #define Y4_GPIO_NUM 15
    #define Y3_GPIO_NUM 13
    #define Y2_GPIO_NUM 12
    #define VSYNC_GPIO_NUM 6
    #define HREF_GPIO_NUM 4
    #define PCLK_GPIO_NUM 9
  • 要连接的 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,可以看到摄像头的图像