作为从事嵌入式与机器人自动化教学的研究者,在机器人设计与应用综合实训中,ESP32凭借高性价比、丰富外设成为主控首选,而LVGL(轻量级嵌入式图形库)则是实现机器人可视化交互界面的核心工具。本次实战将基于ESP32S3开发板,完整实现LVGL9.4的移植、GUIGuider可视化开发,并结合LVGL百问网Bar组件教程,完成Bar组件的开发与机器人场景的落地,同时融入工程实操中的避坑技巧与优化思路,适配机器人实训的全流程开发要求。

本文所涉及的开发流程均基于实际工程笔记与ESP32实战开发模板,涵盖LVGL底层移植、可视化界面开发、硬件联调全环节,所有代码与配置均可直接复用到机器人实训项目中。

一、开发环境与核心资源准备

1.1硬件与软件环境

本次开发围绕ESP32S3展开,搭配FT5x06触摸屏驱动的LCD显示屏,软件环境遵循机器人实训的标准化配置要求,具体如下:

硬件:ESP32S3开发板、FT5x06触摸屏LCD、USB数据线、3.7V锂电池(供电)

软件:VSCode+ESP-IDF开发框架、GUIGuider(LVGL可视化开发工具)、JDK1.8+(GUIGuider运行依赖)

核心组件:lvgl/lvgl^9.4.0(核心图形库)、espressif/esp_lvgl_port^2.6.3(LVGL-ESP32接口)、espressif/esp_lcd_touch_ft5x06^1.0.6(触摸屏驱动)、78/xiaozhi-fonts^1.5.3(中文字体)

1.2核心资源说明

  1. LVGL移植核心笔记:包含ESP32S3与LVGL9.4的底层适配、LCD/触摸屏初始化代码、组件拉取指令等关键内容;
  1. ESP32实战开发模板:提供环境配置检查、硬件引脚映射、问题复盘、性能优化的标准化表格,适配实训报告与工程复盘;
  1. LVGL百问网Bar组件教程:官方标准化的Bar组件API说明、示例代码与效果演示,是本次组件开发的核心参考。

二、LVGL9.4到ESP32S3的完整移植

LVGL的底层移植是界面开发的基础,本次移植严格遵循工程准备-组件拉取-代码添加-配置设置-测试验证五步走,所有步骤均适配ESP-IDF框架,也是机器人实训中嵌入式GUI开发的标准化流程。

2.1第一步:工程准备与组件拉取

  1. 打开已验证的ESP32S3基础工程,确保板载LED、串口、LCD底层驱动可正常运行;
  1. 拉取LVGL相关组件,两种方式二选一(推荐直接修改配置文件,适配批量开发):
  • 方式1:在main/idf_component.yml中直接添加组件依赖:

YAML

lvgl/lvgl:^9.4.0

espressif/esp_lvgl_port:^2.6.3#LVGL与ESP32的接口适配

espressif/esp_lcd_touch_ft5x06:^1.0.6#FT5x06触摸屏驱动

78/xiaozhi-fonts:^1.5.3#中文字体组件

  • 方式2:在ESP-IDF终端执行指令拉取:

Bash

idf.pyadd-dependency"lvgl/lvgl^9.4.0"

idf.pyadd-dependency"espressif/esp_lvgl_port^2.6.3"

idf.pyadd-dependency"78/xiaozhi-fonts^1.5.3"

2.2第二步:添加LVGL核心适配代码

此步骤是移植的核心,需在LCD驱动文件中完成液晶屏/触摸屏与LVGL的接口绑定,关键代码与注意事项如下:

  1. LCD.c中定义全局句柄(触摸屏、液晶屏、LVGL输入设备):

C

staticesp_lcd_touch_handle_ttp;//触摸屏句柄

staticlv_disp_t*disp;//指向液晶屏

staticlv_indev_t*disp_indev=NULL;//指向LVGL触摸屏输入设备

#defineBSP_LCD_DRAW_BUF_HEIGHT(20)//绘制缓存高度,平衡内存与流畅度

  1. 实现液晶屏初始化+LVGL接口添加函数bsp_display_lcd_init,重点注意旋转配置与液晶屏底层保持一致DMA与SPIRAM互斥(二者不可同时开启);
  1. 实现FT5x06触摸屏初始化函数bsp_touch_new,配置swap_xy/mirror_x与液晶屏匹配,避免触摸坐标偏移;
  1. 实现LVGL总初始化函数bsp_lvgl_start,完成LVGL核心、液晶屏、触摸屏的依次初始化,并打开LCD背光;
  1. LCD.h中添加LVGL头文件与初始化函数声明,保证工程跨文件调用。

2.3第三步:LVGL配置与基础测试

  1. 打开ESP-IDF的SDK配置编辑器,启用LVGL的demo测试项,在lvgl9.4.0的demos文件夹中选择基础demo(如显示demo);
  1. 在工程主函数中调用bsp_lvgl_start()完成LVGL初始化,再调用demo测试函数;
  1. 编译烧录工程,若LCD屏正常显示demo界面,说明LVGL底层移植成功。

移植关键避坑:液晶屏的rotation配置(swap_xy/mirror_x/mirror_y)必须与底层驱动完全一致,否则会出现显示花屏、坐标颠倒;DMA开启时需关闭SPIRAM,否则会触发硬件冲突。

三、GUIGuider可视化开发:高效实现界面布局

纯代码开发LVGL界面效率低,尤其在机器人实训的团队开发中,GUIGuider作为LVGL官方可视化开发工具,可通过拖拽组件快速实现界面布局,还支持中文显示与代码自动生成,大幅降低开发成本。

3.1GUIGuider安装与基础配置

  1. 环境检查:按下WIN+R输入java-version验证JDK环境,无环境则先安装JDK1.8+;
  1. 安装软件:选择中文版本安装,完成后注册并登录账户,将软件界面设置为中文;
  1. 新建工程:选择ESP32S3+LVGL9.4版本,匹配开发板与图形库版本,点击创建即可。

3.2界面绘制与中文显示配置

  1. 界面绘制:左侧为组件库、中间为绘制幕布、右侧为属性面板,拖拽Bar组件、按钮、标签等组件到幕布,通过右侧属性面板调整尺寸、位置、样式,完全贴合LVGL百问网的组件属性说明;
  1. 中文显示(核心配置):
  • GUIGuider默认仅一种中文字体,需手动导入Windows系统字体;
  • C:\Windows\Fonts复制所需字体(如微软雅黑)到自定义文件夹,在GUIGuider中点击工具->导入字体,选择复制后的字体文件完成添加;
  • 选中组件后,在右侧属性面板选择导入的中文字体,即可实现中文正常显示。
  1. 效果预览:点击右上角编译运行按钮,实时查看界面效果,反复调整至符合机器人界面需求。

四、核心实战:LVGLBar组件开发与交互实现

Bar组件是嵌入式GUI中数值可视化的核心组件,在机器人实训中可用于电量显示、传感器距离可视化、电机PWM占空比显示、超声波测距数值条等场景,本次开发完全基于LVGL百问网Bar组件教程,实现Bar组件的基础显示、数值更新与触摸屏交互。

4.1Bar组件基础开发(从百问网获取并适配代码)

  1. LVGL百问网Bar组件页面复制基础示例代码,核心实现Bar对象的创建、范围设置、数值赋值:

C

voidlv_demo_bar_basic(void)

{

//创建Bar组件,挂载到屏幕根对象

lv_obj_t*bar1=lv_bar_create(lv_scr_act());

//设置Bar组件尺寸与位置

lv_obj_set_size(bar1,200,30);

lv_obj_center(bar1);

//设置Bar数值范围(0-100,适配机器人电量/占空比等0-100%的数值)

lv_bar_set_range(bar1,0,100);

//设置当前数值

lv_bar_set_value(bar1,50,LV_ANIM_ON);//开启动画,数值更新更流畅

}

  1. 将上述函数添加到ESP32S3工程中,在bsp_lvgl_start()后调用lv_demo_bar_basic(),编译烧录后,LCD屏将显示居中的Bar组件,且数值从0平滑过渡到50(动画开启);
  1. 基于百问网教程拓展Bar组件:添加刻度标记、数值标签、背景样式修改,适配机器人界面的视觉需求,例如给Bar组件添加电量百分比标签,实时显示数值。

4.2Bar组件的触摸屏交互实现

结合LVGL的点击事件处理,实现触摸屏点击调整Bar组件数值,适配机器人的手动参数调节场景(如点击调整电机PWM占空比):

  1. 复制LVGL按钮组件的显示函数与回调函数到工程,创建两个按钮(“数值+”、“数值-”);
  1. 在回调函数中实现Bar组件数值的增减,核心代码:

C

staticvoidbtn_event_cb(lv_event_t*e)

{

lv_event_code_tcode=lv_event_get_code(e);

lv_obj_t*btn=lv_event_get_target(e);

lv_obj_t*bar=lv_event_get_user_data(e);

if(code==LV_EVENT_CLICKED){

int32_tval=lv_bar_get_value(bar);

//判断点击的按钮,实现数值增减

if(btn==btn_plus)val+=10;

elseif(btn==btn_minus)val-=10;

//限制数值在0-100范围内

val=lv_clamp(val,0,100);

lv_bar_set_value(bar,val,LV_ANIM_ON);

}

}

  1. 将按钮与Bar组件绑定,编译烧录后,点击触摸屏上的“+/-”按钮,Bar组件数值将平滑调整,实现基础交互。

4.3定时器实现Bar组件数值实时刷新

在机器人实训中,Bar组件需实时显示传感器采集的数值(如超声波距离、电池电压),因此需结合ESP32的定时器,实现数值的定时采集与Bar组件的实时更新:

  1. 按照LVGL学习笔记中的定时器配置方法,在FRTask.h/FRTask.c中实现FreeRTOS定时器任务;
  1. 在定时器回调函数中,完成ESP32传感器数据采集(如超声波模块采集距离),并将采集到的数值转换为Bar组件的显示范围,调用lv_bar_set_value()更新数值;
  1. 配置定时器任务优先级(略低于界面刷新),避免占用过多系统资源,保证界面流畅度。

五、GUIGuider代码移植到ESP32S3:可视化代码落地

GUIGuider绘制的界面会自动生成C代码,需将生成的代码移植到ESP32S3工程中,实现可视化设计到硬件落地的转化,此步骤遵循文件拷贝-配置修改-代码调用三步走,适配机器人实训的工程化开发要求。

5.1第一步:获取GUIGuider生成的代码

在GUIGuider工程中,找到custom(自定义代码)和generated(自动生成代码)两个核心文件夹,这是移植的全部文件。

5.2第二步:工程文件部署与CMakeLists配置

  1. 在ESP32S3工程的main目录下创建ui文件夹,将customgenerated文件夹拷贝到ui中;
  1. 修改main/CMakeLists.txt,通过批量导入的方式添加源文件和包含路径,避免逐个添加.c文件的繁琐操作,核心配置:

CMake

set(INCLUDES".""./ui/generated""./ui/custom""./ui/generated/guider_customer_fonts")

file(GLOB_RECURSESOURCES./*.c)

idf_component_register(SRCS${SOURCES}

INCLUDE_DIRS${INCLUDES})

其中GLOB_RECURSE参数实现递归查找所有.c文件,适配GUIGuider自动生成的大量代码文件。

5.3第三步:代码调用实现界面显示

在ESP32S3工程主函数中,删除不必要的测试代码,添加以下五行核心代码,即可实现GUIGuider绘制的界面(含Bar组件)在LCD屏上显示:

C

//初始化LVGL

bsp_lvgl_start();

//初始化GUIGuider界面

ui_init();

//界面刷新循环

while(1){

lv_timer_handler();

vTaskDelay(pdMS_TO_TICKS(5));

}

六、机器人场景落地:Bar组件的实际应用

本次开发的Bar组件可直接落地到智能避障小车、巡检机器人、机械臂等机器人实训项目中,以下为两个典型应用场景,结合ESP32实战开发模板的硬件引脚映射功能模块实现

6.1场景1:机器人电池电量可视化

  1. 通过ESP32的ADC引脚采集锂电池电压,将电压值转换为0-100%的电量百分比;
  1. 将电量百分比实时更新到Bar组件,添加“电量”中文标签,实现机器人电量的可视化显示;
  1. 当电量低于20%时,通过LVGL的颜色修改功能,将Bar组件设置为红色,实现低电量报警。

6.2场景2:超声波避障距离可视化

  1. 在ESP32S3上挂载HC-SR04超声波模块,通过GPIO引脚实现距离采集;
  1. 将采集到的距离值(如0-50cm)映射为Bar组件的0-100数值范围,距离越近,Bar数值越大;
  1. 结合机器人的避障逻辑,当距离小于10cm时,Bar组件闪烁,同时触发电机停车,实现视觉+动作的避障联动。

七、工程实操避坑与性能优化

结合机器人设计与应用综合实训的疑难问题排查表性能优化数据表,总结本次LVGL开发中常见的问题与优化策略,也是嵌入式GUI开发的通用避坑技巧:

7.1常见问题排查

问题现象

涉及模块

核心原因

解决方法

LCD屏显示花屏

LVGL移植

液晶屏旋转配置与底层不一致、缓存设置过小

1.统一swap_xy/mirror_x配置;2.适当增大BSP_LCD_DRAW_BUF_HEIGHT

触摸屏无响应

FT5x06驱动

触摸屏坐标配置错误、驱动未初始化

1.保证触摸屏与液晶屏的坐标配置一致;2.检查bsp_touch_new函数调用顺序

Bar组件不显示

LVGL组件

组件父对象设置错误、LVGL定时器未运行

1.将Bar组件挂载到lv_scr_act()(屏幕根对象);2.确保lv_timer_handler()在主循环中调用

中文显示乱码

GUIGuider

字体导入失败、编码不匹配

1.从Windows字体文件夹复制后再导入;2.选择UTF-8编码

7.2性能优化策略

  1. LVGL缓存优化:根据ESP32S3的内存大小,调整BSP_LCD_DRAW_BUF_HEIGHT,建议设置为20-50,平衡内存占用与界面流畅度;
  1. 硬件加速:开启DMA传输(关闭SPIRAM),提升LCD屏的绘制速度;
  1. 任务调度优化:将传感器采集、电机控制、界面刷新分为独立的FreeRTOS任务,合理设置任务优先级,避免界面被阻塞;
  1. 代码精简:删除LVGL中未使用的demo和组件,减少固件大小,提升运行效率。

八、总结与实训拓展

本次实战完成了LVGL9.4到ESP32S3的底层移植GUIGuider可视化开发LVGLBar组件的开发与交互,并将Bar组件落地到机器人实训的实际场景中,核心收获如下:

  1. 掌握了ESP-IDF框架下LVGL的标准化移植流程,理解了液晶屏/触摸屏与LVGL的接口适配原理;
  1. 学会了GUIGuider的可视化开发与代码移植,实现了“拖拽式设计”到“硬件落地”的转化,大幅提升嵌入式GUI开发效率;
  1. 基于LVGL百问网掌握了Bar组件的开发与拓展,实现了数值可视化与触摸屏交互,适配机器人的各类数值显示场景;
  1. 结合ESP32实战开发模板,完成了工程化的避坑与优化,符合机器人实训的理论+实操+复盘三位一体要求。

实训拓展方向

  1. 多组件集成:结合LVGL百问网的教程,添加图表、滑块、列表等组件,开发完整的机器人主控界面;
  1. 物联网联动:将ESP32接入WiFi/MQTT,实现手机APP远程控制Bar组件数值,或远程查看机器人的传感器数值;
  1. 多任务协同:基于FreeRTOS实现界面显示、传感器采集、电机控制、无线通信的多任务协同,提升机器人的智能化水平;
  1. LVGL主题定制:根据机器人的设计风格,定制LVGL的界面主题(颜色、字体、组件样式),提升界面的美观度。

在机器人设计与应用综合实训中,嵌入式GUI是机器人人机交互的核心,LVGL与ESP32的组合是高性价比的选择,而标准化的开发流程、工程化的避坑与优化,更是提升实训效率、完成项目落地的关键。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐