Skip to main content

使用 LVGL

LVGL 是一个面向嵌入式设备的开源图形库。它提供了现成的 UI 组件,例如标签、面板、进度条和布局工具,因此你可以在 C/C++ 中构建结构化界面,而无需手动绘制每一个像素。

本指南将使用 PlatformIO 创建一个简单的 LVGL 电子纸状态面板。示例默认以 reTerminal E1001 为目标,并为 reTerminal E1002、E1003 和 E1004 分别保留独立的 PlatformIO 环境。

该项目会渲染一个静态仪表盘,包含:

  • 一个标题,
  • 一个设备状态卡片,
  • 一个网络状态卡片,
  • 一个演示用电池卡片。

对于电子纸显示屏,这种静态 UI 工作流是一个很好的起点,因为只有在显示信息发生变化时,屏幕才需要刷新。

在不搭建开发环境的情况下体验示例

如果你想在搭建开发环境之前,快速预览项目效果或体验基础演示固件,请打开 reTerminal E-Series Firmware Hub。你可以选择受支持的 reTerminal E 系列设备,并直接通过浏览器烧录演示固件。


兼容硬件

准备以下 reTerminal E 系列设备之一。本指南中的 PlatformIO 项目默认使用 reTerminal E1001 作为环境。

reTerminal E1001reTerminal E1002
7.5" 黑白电子纸
800 x 480
7.3" Spectra 6 色电子纸
800 x 480
reTerminal E1003reTerminal E1004
10.3" 黑白电子纸
1872 x 1404
13.3" Spectra 6 色电子纸
1200 x 1600

项目工作原理

本示例主要包含两个部分:

  • LVGL 创建 UI 对象,例如标签、卡片和进度条。
  • Seeed_GFX 初始化电子纸显示屏,接收渲染后的像素,并刷新物理面板。

项目将这两部分放在不同的文件中:

文件用途
platformio.ini定义 PlatformIO 开发板、库、编译标志和硬件环境。
include/driver.h为当前激活的硬件目标选择正确的 Seeed_GFX 驱动文件。
include/driver_e1001.hinclude/driver_e1004.h为每个 reTerminal E 系列型号存储 Seeed_GFX 的板卡与屏幕组合配置。
include/lv_conf.h配置 LVGL 功能、色深和字体。
src/main.cpp初始化 Arduino、Seeed_GFX、LVGL、显示缓冲区以及电子纸刷新流程。
src/ui_status_panel.cpp创建 LVGL 状态面板布局。

步骤 1:安装 PlatformIO

本指南使用 PlatformIO 作为项目工作流。PlatformIO 会将开发板配置、库和源文件集中在一个文件夹中,使 LVGL 项目更易于构建和维护。

如果尚未安装 PlatformIO,请按照 使用 PlatformIO 中的步骤进行设置,然后再回到本指南。

安装完成后,打开 Visual Studio Code。你应该能在左侧活动栏中看到 PlatformIO 图标。

步骤 2:下载示例项目

LVGL 电子纸状态面板示例位于官方 reTerminal E 系列仓库中:


将该仓库下载到你的电脑,然后打开以下文件夹:

OSHW-reTerminal-Series-E-D/examples/official/LVGLePaperStatusPanel

示例项目包含以下主要文件:

文件功能说明
platformio.ini为 E1001、E1002、E1003 和 E1004 定义 PlatformIO 环境。
include/driver.h为当前构建环境选择正确的电子纸驱动配置。
include/lv_conf.h配置本演示所使用的 LVGL 功能和字体。
src/main.cpp初始化显示屏、LVGL、渲染缓冲区以及电子纸刷新流程。
src/ui_status_panel.cpp创建显示在电子纸上的状态面板 UI。

步骤 3:在 PlatformIO 中打开项目

步骤 1. 打开 Visual Studio Code

步骤 2. 点击左侧活动栏中的 PlatformIO 图标。

步骤 3. 点击 PIO Home > Open

步骤 4. 点击 Open Project

步骤 5. 选择 LVGLePaperStatusPanel 文件夹。

步骤 6. 等待 PlatformIO 加载项目并安装所需库。

步骤 4:选择硬件环境

在项目根目录中打开 platformio.ini。默认环境为 reterminal_e1001

[platformio]
default_envs = reterminal_e1001

对于 E1001,你可以保留默认设置。对于其他设备,将 default_envs 修改为对应的环境:

设备PlatformIO 环境
reTerminal E1001reterminal_e1001
reTerminal E1002reterminal_e1002
reTerminal E1003reterminal_e1003
reTerminal E1004reterminal_e1004

你也可以在不修改 default_envs 的情况下,通过 PlatformIO 终端构建特定环境。

步骤 5:构建并上传演示程序

使用 USB 线将 reTerminal E 系列设备连接到电脑。

要构建默认的 E1001 固件,请运行:

pio run

要构建特定目标,请添加 -e 和环境名称。例如:

pio run -e reterminal_e1001

要将固件上传到设备,请运行:

pio run -e reterminal_e1001 --target upload

上传完成后,打开串口监视器:

pio device monitor -b 115200

当示例程序正确启动时,串口监视器会显示:

Seeed ePaper LVGL status panel starting.
LVGL status panel rendered.

ePaper 显示屏会刷新一次,并显示 LVGL 状态面板。

步骤 6:自定义并从 LVGL UI 中学习

在示例程序成功运行后,你可以开始将其作为一个小型 LVGL 学习项目进行修改。两个最重要的文件是:

FileStart Here When You Want To
src/main.cpp更改传入 UI 的数值,例如设备状态、网络状态和电池百分比。
src/ui_status_panel.cpp更改屏幕标题、卡片布局、字体、颜色、标签和 LVGL 组件。

更改显示的数值

打开 src/main.cpp,在 setup() 中找到这一行:

ui_status_panel_set_status("Ready", "Wi-Fi Standby", 76);

此函数会更新屏幕上的三个动态数值:

ParameterMeaningExample
status显示在 Device 卡片中的设备状态文本。"Ready"
network显示在 Network 卡片中的网络状态文本。"Wi-Fi Standby"
battery_percent电池条的数值。该函数会将其限制在 0 到 100 之间。76

例如,将其更改为:

ui_status_panel_set_status("Online", "Wi-Fi Connected", 95);

然后再次构建并上传项目:

pio run -e reterminal_e1001 --target upload

更改标题和卡片名称

打开 src/ui_status_panel.cpp。主标题在 ui_status_panel_create() 中创建:

lv_label_set_text(title, "Seeed ePaper LVGL Panel");

你可以更改标题文本:

lv_label_set_text(title, "My First LVGL Dashboard");

每个卡片是通过 create_card() 创建的。例如:

lv_obj_t *status_card = create_card(screen, "Device", status_x, status_y, status_w, status_h, lv_palette_main(LV_PALETTE_RED));
lv_obj_t *network_card = create_card(screen, "Network", network_x, network_y, network_w, network_h, lv_palette_main(LV_PALETTE_BLUE));
lv_obj_t *battery_card = create_card(screen, "Battery Demo", battery_x, battery_y, battery_w, battery_h, lv_palette_main(LV_PALETTE_GREEN));

第二个参数是卡片标题。你可以将 "Device""Network""Battery Demo" 更改为与你自己的应用相匹配的名称。

更改颜色

该示例使用 LVGL 调色板颜色:

lv_palette_main(LV_PALETTE_RED)
lv_palette_main(LV_PALETTE_BLUE)
lv_palette_main(LV_PALETTE_GREEN)

对于 reTerminal E1002 和 reTerminal E1004 等彩色 ePaper 型号,src/main.cpp 会将 LVGL 颜色映射到 ePaper 调色板。示例调色板包括白色、黑色、红色、黄色、绿色和蓝色。

对于 reTerminal E1001 和 reTerminal E1003 等黑白 ePaper 型号,相同的 UI 会根据亮度转换为黑白。较暗的颜色变为黑色,较亮的颜色变为白色。

这意味着你可以在四款设备上使用相同的 LVGL UI 代码,而显示驱动会为所选硬件转换最终像素。

更改布局

该示例使用 platformio.ini 中的 EPAPER_LVGL_HOR_RESEPAPER_LVGL_VER_RES 来确定屏幕尺寸。在 src/ui_status_panel.cpp 中,这些数值在此处被使用:

const int32_t screen_width = EPAPER_LVGL_HOR_RES;
const int32_t screen_height = EPAPER_LVGL_VER_RES;
const bool is_landscape = screen_width >= screen_height;

然后布局会为更宽的屏幕选择横向布局,为更高的屏幕选择纵向布局。这就是为什么同一个示例可以在 800 x 480 设备和更大的 ePaper 面板上运行。

作为一个简单的首次修改,可以调整间距数值:

const int32_t margin = max_i32(32, screen_width / 20);
const int32_t gap = max_i32(20, screen_width / 40);

增大 margin 会在屏幕边缘留出更多空白。增大 gap 会在卡片之间留出更多空间。

添加你自己的数据

本示例中的电池数值是示例 UI 数据,因此屏幕会将其显示为演示数值。要连接真实的应用数据,请保留 UI 函数,并将你自己的数值传入其中:

int battery_percent = 88;
ui_status_panel_set_status("Running", "Wi-Fi Connected", battery_percent);

对于 ePaper 项目,一个实用的工作流程是:

步骤 1. 在你的应用中读取或计算最新数据。

步骤 2. 将新数值传入 ui_status_panel_set_status()

步骤 3. 当内容需要更改时刷新 ePaper 显示屏。

该示例在 setup() 中渲染一次,因为屏幕内容是静态的。对于传感器仪表盘、日历或状态监视器等应用,你可以在显示数据发生变化时更新数值并刷新面板。

资源

技术支持与产品讨论

感谢你选择我们的产品!我们将为你提供多种支持,以确保你在使用我们产品时的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...