ESP32S3移植LVGL9.4+GUIGuider实战:Bar组件开发与机器人界面落地(*Day4)
本文以ESP32S3开发板为基础,结合机器人实训开发要求,详述了LVGL9.4的移植流程、GUI Guider可视化开发方法及LVGL Bar组件的实战开发与机器人场景落地。文章先介绍开发环境与资源准备,按工程准备、组件拉取等步骤完成LVGL底层移植,再讲解GUI Guider的安装配置与界面绘制,重点基于LVGL百问网教程实现Bar组件的基础显示、触屏交互和定时器实时刷新,还完成了GUI Gui
作为从事嵌入式与机器人自动化教学的研究者,在机器人设计与应用综合实训中,ESP32凭借高性价比、丰富外设成为主控首选,而LVGL(轻量级嵌入式图形库)则是实现机器人可视化交互界面的核心工具。本次实战将基于ESP32S3开发板,完整实现LVGL9.4的移植、GUIGuider可视化开发,并结合LVGL百问网Bar组件教程,完成Bar组件的开发与机器人场景的落地,同时融入工程实操中的避坑技巧与优化思路,适配机器人实训的全流程开发要求。
本文所涉及的开发流程均基于实际工程笔记与ESP32实战开发模板,涵盖LVGL底层移植、可视化界面开发、硬件联调全环节,所有代码与配置均可直接复用到机器人实训项目中。
本次开发围绕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(中文字体)
- LVGL移植核心笔记:包含ESP32S3与LVGL9.4的底层适配、LCD/触摸屏初始化代码、组件拉取指令等关键内容;
- ESP32实战开发模板:提供环境配置检查、硬件引脚映射、问题复盘、性能优化的标准化表格,适配实训报告与工程复盘;
- LVGL百问网Bar组件教程:官方标准化的Bar组件API说明、示例代码与效果演示,是本次组件开发的核心参考。
LVGL的底层移植是界面开发的基础,本次移植严格遵循工程准备-组件拉取-代码添加-配置设置-测试验证五步走,所有步骤均适配ESP-IDF框架,也是机器人实训中嵌入式GUI开发的标准化流程。
- 打开已验证的ESP32S3基础工程,确保板载LED、串口、LCD底层驱动可正常运行;
- 拉取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" |
此步骤是移植的核心,需在LCD驱动文件中完成液晶屏/触摸屏与LVGL的接口绑定,关键代码与注意事项如下:
- 在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)//绘制缓存高度,平衡内存与流畅度 |
- 实现液晶屏初始化+LVGL接口添加函数bsp_display_lcd_init,重点注意旋转配置与液晶屏底层保持一致、DMA与SPIRAM互斥(二者不可同时开启);
- 实现FT5x06触摸屏初始化函数bsp_touch_new,配置swap_xy/mirror_x与液晶屏匹配,避免触摸坐标偏移;
- 实现LVGL总初始化函数bsp_lvgl_start,完成LVGL核心、液晶屏、触摸屏的依次初始化,并打开LCD背光;
- 在LCD.h中添加LVGL头文件与初始化函数声明,保证工程跨文件调用。
- 打开ESP-IDF的SDK配置编辑器,启用LVGL的demo测试项,在lvgl9.4.0的demos文件夹中选择基础demo(如显示demo);
- 在工程主函数中调用bsp_lvgl_start()完成LVGL初始化,再调用demo测试函数;
- 编译烧录工程,若LCD屏正常显示demo界面,说明LVGL底层移植成功。
移植关键避坑:液晶屏的rotation配置(swap_xy/mirror_x/mirror_y)必须与底层驱动完全一致,否则会出现显示花屏、坐标颠倒;DMA开启时需关闭SPIRAM,否则会触发硬件冲突。
纯代码开发LVGL界面效率低,尤其在机器人实训的团队开发中,GUIGuider作为LVGL官方可视化开发工具,可通过拖拽组件快速实现界面布局,还支持中文显示与代码自动生成,大幅降低开发成本。
- 环境检查:按下WIN+R输入java-version验证JDK环境,无环境则先安装JDK1.8+;
- 安装软件:选择中文版本安装,完成后注册并登录账户,将软件界面设置为中文;
- 新建工程:选择ESP32S3+LVGL9.4版本,匹配开发板与图形库版本,点击创建即可。
- 界面绘制:左侧为组件库、中间为绘制幕布、右侧为属性面板,拖拽Bar组件、按钮、标签等组件到幕布,通过右侧属性面板调整尺寸、位置、样式,完全贴合LVGL百问网的组件属性说明;
- 中文显示(核心配置):
- GUIGuider默认仅一种中文字体,需手动导入Windows系统字体;
- 从C:\Windows\Fonts复制所需字体(如微软雅黑)到自定义文件夹,在GUIGuider中点击工具->导入字体,选择复制后的字体文件完成添加;
- 选中组件后,在右侧属性面板选择导入的中文字体,即可实现中文正常显示。
- 效果预览:点击右上角编译运行按钮,实时查看界面效果,反复调整至符合机器人界面需求。
Bar组件是嵌入式GUI中数值可视化的核心组件,在机器人实训中可用于电量显示、传感器距离可视化、电机PWM占空比显示、超声波测距数值条等场景,本次开发完全基于LVGL百问网Bar组件教程,实现Bar组件的基础显示、数值更新与触摸屏交互。
- 从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);//开启动画,数值更新更流畅 } |
- 将上述函数添加到ESP32S3工程中,在bsp_lvgl_start()后调用lv_demo_bar_basic(),编译烧录后,LCD屏将显示居中的Bar组件,且数值从0平滑过渡到50(动画开启);
- 基于百问网教程拓展Bar组件:添加刻度标记、数值标签、背景样式修改,适配机器人界面的视觉需求,例如给Bar组件添加电量百分比标签,实时显示数值。
结合LVGL的点击事件处理,实现触摸屏点击调整Bar组件数值,适配机器人的手动参数调节场景(如点击调整电机PWM占空比):
- 复制LVGL按钮组件的显示函数与回调函数到工程,创建两个按钮(“数值+”、“数值-”);
- 在回调函数中实现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); } } |
- 将按钮与Bar组件绑定,编译烧录后,点击触摸屏上的“+/-”按钮,Bar组件数值将平滑调整,实现基础交互。
在机器人实训中,Bar组件需实时显示传感器采集的数值(如超声波距离、电池电压),因此需结合ESP32的定时器,实现数值的定时采集与Bar组件的实时更新:
- 按照LVGL学习笔记中的定时器配置方法,在FRTask.h/FRTask.c中实现FreeRTOS定时器任务;
- 在定时器回调函数中,完成ESP32传感器数据采集(如超声波模块采集距离),并将采集到的数值转换为Bar组件的显示范围,调用lv_bar_set_value()更新数值;
- 配置定时器任务优先级(略低于界面刷新),避免占用过多系统资源,保证界面流畅度。
五、GUIGuider代码移植到ESP32S3:可视化代码落地
GUIGuider绘制的界面会自动生成C代码,需将生成的代码移植到ESP32S3工程中,实现可视化设计到硬件落地的转化,此步骤遵循文件拷贝-配置修改-代码调用三步走,适配机器人实训的工程化开发要求。
在GUIGuider工程中,找到custom(自定义代码)和generated(自动生成代码)两个核心文件夹,这是移植的全部文件。
- 在ESP32S3工程的main目录下创建ui文件夹,将custom和generated文件夹拷贝到ui中;
- 修改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自动生成的大量代码文件。
在ESP32S3工程主函数中,删除不必要的测试代码,添加以下五行核心代码,即可实现GUIGuider绘制的界面(含Bar组件)在LCD屏上显示:
|
C //初始化LVGL bsp_lvgl_start(); //初始化GUIGuider界面 ui_init(); //界面刷新循环 while(1){ lv_timer_handler(); vTaskDelay(pdMS_TO_TICKS(5)); } |
本次开发的Bar组件可直接落地到智能避障小车、巡检机器人、机械臂等机器人实训项目中,以下为两个典型应用场景,结合ESP32实战开发模板的硬件引脚映射与功能模块实现:
- 通过ESP32的ADC引脚采集锂电池电压,将电压值转换为0-100%的电量百分比;
- 将电量百分比实时更新到Bar组件,添加“电量”中文标签,实现机器人电量的可视化显示;
- 当电量低于20%时,通过LVGL的颜色修改功能,将Bar组件设置为红色,实现低电量报警。
- 在ESP32S3上挂载HC-SR04超声波模块,通过GPIO引脚实现距离采集;
- 将采集到的距离值(如0-50cm)映射为Bar组件的0-100数值范围,距离越近,Bar数值越大;
- 结合机器人的避障逻辑,当距离小于10cm时,Bar组件闪烁,同时触发电机停车,实现视觉+动作的避障联动。
结合机器人设计与应用综合实训的疑难问题排查表与性能优化数据表,总结本次LVGL开发中常见的问题与优化策略,也是嵌入式GUI开发的通用避坑技巧:
|
问题现象 |
涉及模块 |
核心原因 |
解决方法 |
|
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编码 |
- LVGL缓存优化:根据ESP32S3的内存大小,调整BSP_LCD_DRAW_BUF_HEIGHT,建议设置为20-50,平衡内存占用与界面流畅度;
- 硬件加速:开启DMA传输(关闭SPIRAM),提升LCD屏的绘制速度;
- 任务调度优化:将传感器采集、电机控制、界面刷新分为独立的FreeRTOS任务,合理设置任务优先级,避免界面被阻塞;
- 代码精简:删除LVGL中未使用的demo和组件,减少固件大小,提升运行效率。
本次实战完成了LVGL9.4到ESP32S3的底层移植、GUIGuider可视化开发、LVGLBar组件的开发与交互,并将Bar组件落地到机器人实训的实际场景中,核心收获如下:
- 掌握了ESP-IDF框架下LVGL的标准化移植流程,理解了液晶屏/触摸屏与LVGL的接口适配原理;
- 学会了GUIGuider的可视化开发与代码移植,实现了“拖拽式设计”到“硬件落地”的转化,大幅提升嵌入式GUI开发效率;
- 基于LVGL百问网掌握了Bar组件的开发与拓展,实现了数值可视化与触摸屏交互,适配机器人的各类数值显示场景;
- 结合ESP32实战开发模板,完成了工程化的避坑与优化,符合机器人实训的理论+实操+复盘三位一体要求。
- 多组件集成:结合LVGL百问网的教程,添加图表、滑块、列表等组件,开发完整的机器人主控界面;
- 物联网联动:将ESP32接入WiFi/MQTT,实现手机APP远程控制Bar组件数值,或远程查看机器人的传感器数值;
- 多任务协同:基于FreeRTOS实现界面显示、传感器采集、电机控制、无线通信的多任务协同,提升机器人的智能化水平;
- LVGL主题定制:根据机器人的设计风格,定制LVGL的界面主题(颜色、字体、组件样式),提升界面的美观度。
在机器人设计与应用综合实训中,嵌入式GUI是机器人人机交互的核心,LVGL与ESP32的组合是高性价比的选择,而标准化的开发流程、工程化的避坑与优化,更是提升实训效率、完成项目落地的关键。
更多推荐



所有评论(0)