跳到主要内容

Arduino 开发

本章介绍 Arduino 环境搭建,包括 Arduino IDE、ESP32 板管理、相关库的安装,程序编译下载及示例程序测试,帮助用户掌握开发板,便于二次开发。 本章节包含以下部分,请按需阅读:

Arduino 入门教程

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

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

配置开发环境

1. 安装和配置 Arduino IDE

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

ESP32-S3-LCD-1.69 所需开发板安装说明

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

2. 安装库

  • 在安装 Arduino 库时,通常有两种方式可供选择:在线安装离线安装若库安装要求离线安装,则必须使用提供的库文件
    对于大多数库,用户可以通过 Arduino 软件的在线库管理器轻松搜索并安装。然而,一些开源库或自定义库未被同步到 Arduino 库管理器中,因此无法通过在线搜索获取。在这种情况下,用户只能通过离线方式手动安装这些库。
  • 库安装教程,详见:Arduino 库管理教程
  • ESP32-S3-LCD-1.69 库文件存放于示例程序中,点击此处跳转:ESP32-S3-LCD-1.69 示例程序

ESP32-S3-LCD-1.69 库文件安装说明

库名称说明版本库安装要求
GFX_Library_for_ArduinoST7789 的 GFX 图形化库v1.4.9可“在线”或“离线”安装
lvglLVGL 图形化库v8.4.0“在线”安装后需复制 demos 文件夹至 src,建议使用“离线”安装
Mylibrary开发板引脚宏定义——“离线”安装
SensorLibPCF85063、QMI8658 传感器驱动库v0.2.1可“在线”或“离线”安装
lv_conf.hLVGL 配置文件——“离线”安装

示例程序

ESP32-S3-LCD-1.69 示例程序

示例程序基础例程说明依赖库
01_HelloWorld展示了基本的图形库功能,也可以用于测试显示屏的基础性能以及随机文本显示效果GFX_Library_for_Arduino
02_GFX_AsciiTable根据屏幕尺寸,在显示屏上按行列打印 ASCII 字符GFX_Library_for_Arduino
03_GFX_PCF85063_simpleTime显示当前时间SensorLib,GFX_Library_for_Arduino
04_GFX_ESPWiFiAnalyzer在 ST7789 显示器上绘制 WiFi 频段信号强度GFX_Library_for_Arduino
05_GFX_Clock一个简单的 ST7789 时钟示例,通过简单的标记指针和时间管理实现时钟GFX_Library_for_Arduino
06_LVGL_Measuring_voltage板上预留分压测电压,使用 GPIO1 读取模拟量值并通过分压公式得出电池电压LVGL
07_LVGL_PCF85063_simpleTime在 LVGL 下使用 PCF85063 RTC 模块在 ST7789 显示屏上显示当前时间LVGL,SensorLib
08_LVGL_QMI8658_ui使用 LVGL 进行图形显示,与 QMI8658 IMU 通信以获取加速度计和陀螺仪数据LVGL,SensorLib
09_LVGL_Keys_Bee多功能按钮使用LVGL
10_LVGL_ArduinoLVGL 演示LVGL
  • ESP32-S3-LCD-1.69 支持直接选择型号

ESP32-S3-LCD-1

01_HelloWorld

【硬件连接】

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

ESP32-S3-LCD-1

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

【代码分析】

  • 显示初始化:

    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!");

【运行效果】

ESP32-S3-LCD-1
ESP32-S3-LCD-1

02_GFX_AsciiTable

【硬件连接】

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

【代码分析】

  • 初始化显示屏:

    if (!gfx->begin()) {
    USBSerial.println("gfx->begin() failed!");
    }
  • 计算行列并标注编号:这里根据显示屏的尺寸计算出可以显示的列数和行数。然后分别使用两个循环,设置不同的文本颜色,在显示屏上打印出行和列的编号,以便在后续绘制 ASCII 字符时可以方便地确定字符的位置。

    int numCols = LCD_WIDTH / 8;
    int numRows = LCD_HEIGHT / 10;

    // 标注行编号
    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);
    }
  • 绘制 ASCII 字符表:

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

【运行效果】

ESP32-S3-LCD-1

03_GFX_PCF85063_simpleTime

【硬件连接】

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

【代码分析】

  • loop()

  • 首先获取当前时间,如果当前时间与上一次显示的时间不同,则进行以下操作:

    • 清除上一次显示时间的区域,通过填充一个矩形实现,以便更新时间显示时不会出现重叠。
    • 设置文本颜色为黑色,并设置文本大小为 3。
    • 调用 getCenteredX 函数计算当前时间字符串在屏幕上居中显示的 X 坐标。
    • 设置光标位置并打印当前时间字符串,实现时间的更新显示。
    • 将当前时间字符串复制到 previousTimeString,以便下次判断时间是否变化。

【运行效果】

ESP32-S3-LCD-1

04_GFX_ESPWiFiAnalyzer

【硬件连接】

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

【代码分析】

  • setup()

初始化串口通信;
设置 WiFi 为站点模式并断开连接;
初始化显示屏,获取屏幕尺寸并计算各种绘图参数;
设置屏幕背景为黑色,绘制标题栏。

  • loop()

扫描 WiFi 网络并获取网络信息,包括信道、RSSI、BSSID 和 SSID;
统计每个信道上的网络数量、噪声水平和峰值信号强度;
清除旧的图形并根据扫描结果绘制新的图形,包括信号强度椭圆和网络信息文本;
打印扫描到的网络数量和噪声最小的信道;
绘制图形基线和信道编号;
根据条件进入低功耗模式。

【运行效果】

  • 在 ST7789 显示器上绘制 WiFi 频段信号强度,实现了 WiFi 分析器的功能。如下图所示:
ESP32-S3-LCD-1

05_GFX_Clock

【硬件连接】

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

【代码分析】

  • 时针、分针、秒针的绘制:

    void redraw_hands_cached_draw_and_erase() {
    gfx->startWrite();
    draw_and_erase_cached_line(center, center, nsx, nsy, SECOND_COLOR, cached_points, sHandLen + 1, false, false);
    draw_and_erase_cached_line(center, center, nhx, nhy, HOUR_COLOR, cached_points + ((sHandLen + 1) * 2), hHandLen + 1, true, false);
    draw_and_erase_cached_line(center, center, nmx, nmy, MINUTE_COLOR, cached_points + ((sHandLen + 1 + hHandLen + 1) * 2), mHandLen + 1, true, true);
    gfx->endWrite();
    }

【运行效果】

ESP32-S3-LCD-1

06_LVGL_Measuring_voltage

【硬件连接】

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

【代码分析】

  • my_print() :用于 LVGL 的日志输出,如果启用了 LVGL 的日志功能,这个函数会将日志信息打印到串口
  • my_disp_flush() :负责将 LVGL 的绘图缓冲区内容刷新到显示屏上
  • example_increase_lvgl_tick() :定时器回调函数,用于通知 LVGL 时间的流逝
  • example_increase_reboot() :另一个定时器回调函数,用于计数,达到一定次数后可能触发系统重启

【运行效果】

  • 板上预留分压测电压,使用 GPIO1 读取模拟量值并通过分压公式得出电池电压
    ESP32-S3-LCD-1

07_LVGL_PCF85063_simpleTime

【硬件连接】

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

【代码分析】

  • setup()

初始化串口通信,以 115200 的波特率准备可能的串口调试;
尝试连接 PCF85063 实时时钟芯片,如果连接失败则进入死循环;
设置实时时钟的初始时间为 2024 年 9 月 24 日 11 时 9 分 41 秒;
初始化显示屏,设置屏幕亮度;
初始化 LVGL,并注册日志输出函数(如果启用了日志功能;
配置 LVGL 的显示驱动和绘图缓冲区,以及初始化输入设备驱动(虽然是一个虚拟的指针输入设备驱动)
创建定时器用于定期触发 LVGL 的时钟更新
创建一个标签并设置初始文本为“Initializing...”

  • loop()

调用 lv_timer_handler 让 LVGL 处理图形界面的任务;
每秒钟检查一次时间是否更新,如果是,则获取实时时钟的当前时间,通过串口输出,并将时间格式化为特定格式后更新标签的文本内容,同时设置标签的字体为 lv_font_montserrat_40。

【运行效果】

ESP32-S3-LCD-1

08_LVGL_QMI8658_ui

【硬件连接】

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

【代码分析】

  • my_disp_flush()

这个函数是 LVGL 显示驱动的刷新函数。它负责将 LVGL 的绘图缓冲区内容刷新到显示屏上;
根据不同的颜色格式设置,调用 gfx 对象的相应函数来绘制位图到特定的区域;
最后通知 LVGL 显示刷新已完成。

  • loop()

调用 lv_timer_handler 让 LVGL 处理图形界面的任务;
检查 qmi(QMI8658 传感器对象)是否有新数据准备好。如果有,尝试获取加速度数据和陀螺仪数据,并通过串口输出;
同时,将加速度数据更新到 LVGL 的图表上,以便实时显示加速度在三个轴上的变化情况;
通过 delay(20) 增加数据轮询的频率,以确保及时获取传感器数据并更新显示。

【运行效果】

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

ESP32-S3-LCD-1

09_LVGL_Keys_Bee

【硬件连接】

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

【新旧版本对比】

  • 此功能按钮是为解决外设按钮功能少而设计,在 V2 版本中,我们做了一些调整:

ESP32-S3-LCD-1

ESP32-S3-LCD-1.69 新旧版本对比

外设旧版本新版本
蜂鸣器(Buzz)GPIO33GPIO42
RTC 中断(RTC_INT)GPIO41GPIO39
电源控制(SYS_EN)GPIO35GPIO41
电源控制(SYS_OUT)GPIO36GPIO40

其原理如下:

按下 PWR 之后可以使电池供电,此时系统启动,系统应定义 SYS_EN 持续输出高电平来维持上电效果,此时松开 PWR 不会断电。PWR 此时的功能即可以拉低 SYS_OUT,系统检测 SYS_OUT 按下、连按和长按,可以自定义关机控制操作,如长按模式下系统设置 SYS_EN 低电平断开电池供电,即可完成多功能按钮使用。

【代码分析】

  • loop()

调用 lv_timer_handler 让 LVGL 处理图形界面的任务;
读取输入引脚的状态,进行去抖动处理;
根据按钮的状态(按下或释放)以及时间间隔判断是单点击、双点击还是长按事件,并更新显示屏上的标签文本以显示相应的事件信息;
同时,对于长按事件会触发蜂鸣器发声,释放时则停止蜂鸣器并将特定输出引脚设置为低电平。

【运行效果】

ESP32-S3-LCD-1

10_LVGL_Arduino

【硬件连接】

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

【运行效果】

ESP32-S3-LCD-1
ESP32-S3-LCD-1
ESP32-S3-LCD-1
ESP32-S3-LCD-1

【LVGL 组件的使用】

使用 LVGL 框架开发时可以依据 lvgl 官方文档提供的组件说明来调用组件 LVGL8.3 Documents

下面是 Arduino IDE 的 LVGL 实际组件调研案例

ESP32-S3-LCD-1
ESP32-S3-LCD-1
ESP32-S3-LCD-1
ESP32-S3-LCD-1
ESP32-S3-LCD-1