跳到主要内容

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 目录已包含本教程所需的全部库文件。
库或文件名称说明版本安装方式
GFX Library for ArduinoST7789 显示驱动图形库v1.6.4通过库管理器或手动安装
SensorLibPCF85063、QMI8658 传感器驱动库v0.3.3通过库管理器或手动安装
XPowersLibAXP2101 驱动库v0.2.6通过库管理器或手动安装
lvgllvgl 显示显示框架v8.4.0通过库管理器或手动安装
Mylibrary开发板引脚宏定义——手动安装
lv_conf.hLVGL 配置文件——手动安装
版本兼容性说明

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 库管理教程

示例程序

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

示例程序基础例程说明依赖库
01_HelloWorld展示了基本的图形库功能,也可以用于测试显示屏的基础性能以及随机文本显示效果GFX_Library_for_Arduino
02_GFX_AsciiTable根据屏幕尺寸,在显示屏上按行列打印 ASCII 字符GFX_Library_for_Arduino
03_LVGL_AXP2101_ADC_Data通过移植后的 XPowersLib 驱动 AXP2101 获取电源相关数据GFX_Library_for_Arduino
04_LVGL_QMI8658_uiLVGL 绘制加速度折线图LVGL,SensorLib
05_LVGL_WidgetsLVGL 演示LVGL,Arduino_DriveBus ,Adafruit_XCA9554
06_ES7210ES7210 驱动示例,拾取人声检测——
07_ES8311ES8311 驱动示例,播放简单的音频——

01_HelloWorld

程序说明

  • 本示例演示了如何使用 Arduino GFX 库控制 SH8601 显示屏,通过动态变化的文本展示了基本的图形库功能。该代码也可以用于测试显示屏的基础性能以及随机文本显示效果

硬件连接

  • 将开发板接入电脑

代码分析

  • 显示初始化:

    if (!gfx->begin()) {
    USBSerial.println("gfx->begin() failed!");
    }
  • 清屏并显示文本:

     gfx->fillScreen(BLACK);
    gfx->setCursor(10, 10);
    gfx->setTextColor(RED);
    gfx->println("Hello World!");
  • 动图显示:

     gfx->setCursor(random(gfx->width()), random(gfx->height()));
    gfx->setTextColor(random(0xffff), random(0xffff));
    gfx->setTextSize(random(6), random(6), random(2));
    gfx->println("Hello World!");

运行效果

02_GFX_AsciiTable

程序说明

  • 本示例通过使用 Arduino GFX 库在 ESP32 上展示了如何在 SH8601 显示屏上显示一个基本的 ASCII 字符表格。代码的核心功能是初始化显示屏,并根据屏幕尺寸,在显示屏上按行列打印 ASCII 字符

硬件连接

  • 将开发板接入电脑

代码分析

  • 数据总线和图形显示对象的创建

    • 这里创建了一个用于与显示屏通信的数据总线对象 bus,使用特定的引脚配置进行初始化。然后创建了一个图形显示对象 gfx,传入数据总线、复位引脚、旋转角度、是否为 IPS 屏以及显示屏的宽度和高度等参数
     Arduino_DataBus *bus = new Arduino_ESP32QSPI(
    LCD_CS /* CS */, LCD_SCLK /* SCK */, LCD_SDIO0 /* SDIO0 */, LCD_SDIO1 /* SDIO1 */,
    LCD_SDIO2 /* SDIO2 */, LCD_SDIO3 /* SDIO3 */);

    Arduino_GFX *gfx = new Arduino_SH8601(bus, -1 /* RST */,
    0 /* rotation */, false /* IPS */, LCD_WIDTH, LCD_HEIGHT);
  • 绘制行列编号和字符表

    • 首先设置文本颜色为绿色,在显示屏上逐个打印行号。然后设置文本颜色为蓝色,打印列号。接着使用循环逐个绘制字符,组成字符表,每个字符使用白色前景和黑色背景
     gfx->setTextColor(GREEN);
    for (int x = 0; x < numRows; x++) {
    gfx->setCursor(10 + x * 8, 2);
    gfx->print(x, 16);
    }
    gfx->setTextColor(BLUE);
    for (int y = 0; y < numCols; y++) {
    gfx->setCursor(2, 12 + y * 10);
    gfx->print(y, 16);
    }

    char c = 0;
    for (int y = 0; y < numRows; y++) {
    for (int x = 0; x < numCols; x++) {
    gfx->drawChar(10 + x * 8, 12 + y * 10, c++, WHITE, BLACK);
    }
    }

运行效果

03_LVGL_AXP2101_ADC_Data

程序说明

  • 本示例演示了 LVGL 下使用 XPowers 库进行电源管理,并且提供 PWR 自定义按钮控制亮屏、熄屏动作

硬件连接

  • 将开发板接入电脑

代码分析

  • 亮屏熄屏实现函数

      void toggleBacklight() {
    USBSerial.println(backlight_on);
    if (backlight_on) {
    for (int i = 255; i >= 0; i--) {
    gfx->Display_Brightness(i);
    delay(3);
    }
    } else {
    for (int i = 0; i <= 255; i++) {
    gfx->Display_Brightness(i);
    delay(3);
    }
    }
    backlight_on = !backlight_on;
    }

运行效果

04_LVGL_QMI8658_ui

程序说明

  • 本示例演示了使用 LVGL 进行图形显示,与 QMI8658 IMU 通信以获取加速度计和陀螺仪数据

硬件连接

  • 将开发板接入电脑

代码分析

  • setup:负责初始化各种硬件设备和 LVGL 图形库环境

    • 串口初始化:USBSerial.begin(115200) 为串口调试做准备
    • 触摸控制器初始化:不断尝试初始化触摸控制器 FT3168,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息
    • 图形显示初始化:初始化图形显示设备 gfx,设置亮度,并打印 LVGL 和 Arduino 的版本信息。接着初始化 LVGL,包括注册打印回调函数用于调试,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,最后创建一个标签并设置初始文本为 “Initializing...”
    • 创建图表:创建一个图表对象 chart,设置图表的类型、范围、数据点数量等属性,并为加速度的三个轴添加数据系列
    • 加速度传感器初始化:初始化加速度传感器 qmi,配置加速度计和陀螺仪的参数,启用它们,并打印芯片 ID 和控制寄存器信息
  • loop

    • lv_timer_handler():这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作
    • 读取加速度传感器数据:如果加速度传感器数据准备好,读取加速度数据并通过串口打印出来,同时更新图表显示加速度数据。如果陀螺仪数据准备好,读取陀螺仪数据并通过串口打印出来。最后添加一个小的延迟,增加数据 polling 的频率

运行效果

05_LVGL_Widgets

程序说明

  • 本示例演示了 LVGL Widgets 示例,动态状态下帧率可达 50~60 帧,通过优化 SH8601 显示库可实现更佳流畅的帧率,实际可对比 ESP-IDF 环境下启用双缓存、双加速的场景

硬件连接

  • 将开发板接入电脑

代码分析

  • setup:负责初始化各种硬件设备和 LVGL 图形库环境
    • 串口初始化:USBSerial.begin(115200) 为串口调试做准备
    • I²C 总线初始化:Wire.begin(IIC_SDA, IIC_SCL); 初始化 I²C 总线,用于与其他 I²C 设备通信
    • 扩展芯片初始化:创建并初始化扩展芯片 expander,设置引脚模式为输出,并进行一些初始的引脚状态设置
    • 触摸控制器初始化:不断尝试初始化触摸控制器 FT3168,如果初始化失败则打印错误信息并延迟等待,成功后打印成功信息
    • 图形显示初始化:初始化图形显示设备 gfx,设置亮度,并获取屏幕的宽度和高度。然后初始化 LVGL,包括注册打印回调函数用于调试,设置触摸控制器的电源模式为监控模式,初始化显示驱动和输入设备驱动。创建并启动 LVGL 的定时器,创建一个标签并设置文本,最后调用 lv_demo_widgets() 展示 LVGL 的示例小部件
  • loop
    • lv_timer_handler():这是 LVGL 图形库中的一个重要函数,用于处理图形界面的各种定时器事件、动画更新、输入处理等任务。在每个循环中调用这个函数可以确保图形界面的流畅运行和及时响应交互操作
    • delay(5):添加一个小的延迟,避免过度占用 CPU 资源

运行效果

06_ES7210

程序说明

  • 本示例演示了使用 I2S 驱动 ES7210 芯片,拾音并过滤人声

硬件连接

  • 将开发板接入电脑

运行效果

  • 拾音,屏幕无现象

07_ES8311

程序说明

  • 本示例演示了使用 I2S 驱动 ES8311 芯片,将转换的二进制音频文件进行播放

硬件连接

  • 将开发板接入电脑

代码分析

  • es8311_codec_init:初始化 ES8311 音频编解码器
    • 创建一个 ES8311 编解码器的句柄 es_handle
    • 配置 ES8311 的时钟参数,包括主时钟和采样时钟的频率、时钟极性等
    • 初始化编解码器,设置音频分辨率为 16 位
    • 配置采样频率
    • 配置麦克风相关参数,如关闭麦克风、设置音量和麦克风增益
  • setup:进行整体的初始化设置,包括串口、引脚、I2S 和 ES8311 编解码器
    • 初始化串口用于调试输出
    • 设置特定引脚为输出并置高
    • 配置 I2S 总线,设置引脚、工作模式、采样率、数据位宽、声道模式等
    • 初始化 I²C 总线
    • 调用 es8311_codec_init 函数初始化 ES8311 编解码器
    • 通过 I2S 总线播放一段预先定义的音频数据(canon_pcm)

运行效果

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