0


【花雕学编程】Arduino LVGL 之在不同平台创建相同的用户界面

在这里插入图片描述

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述
Arduino LVGL(Light and Versatile Graphics Library)是一个功能强大、轻量级的图形库,专为嵌入式系统设计,尤其适用于Arduino等微控制器平台。以下是对其主要特点、应用场景以及需要注意的事项的详细解释。

1、主要特点
1)轻量级:
LVGL是一个轻量级的图形库,适合资源有限的嵌入式系统。它在内存使用和处理速度上进行了优化,使其能够在低功耗设备上流畅运行。
2)丰富的组件:
LVGL提供了多种用户界面组件,比如按钮、滑块、图表、列表、图像等,开发者可以利用这些组件快速构建复杂的用户界面。
3)高效的渲染能力:
LVGL支持多种显示驱动程序,能够高效地渲染图形,支持抗锯齿、alpha混合等图形效果,从而提升界面的视觉质量。
4)灵活的主题和样式:
LVGL支持主题和样式的自定义,使得开发者可以根据需求轻松调整界面的外观,增加了界面的美观性和用户体验。
5)多种输入设备支持:
支持触摸屏、鼠标、键盘等多种输入设备,能够实现丰富的用户交互。
6)多平台支持:
LVGL不仅可以在Arduino上运行,还可以在多个嵌入式平台和操作系统上使用,包括ESP32、STM32、Linux等,具有良好的跨平台性。

2、应用场景
1)嵌入式设备的用户界面:
适用于需要图形用户界面的嵌入式设备,如智能家居控制面板、工业控制系统、医疗设备等。
2)物联网(IoT)设备:
在物联网应用中,LVGL可以用来构建设备的控制界面,例如智能传感器、网关设备的设置界面。
3)便携式设备:
适合用于便携式电子设备,如手持设备、智能手表等,因其轻量特性和高效性能能够满足电池供电的需求。
4)教育和原型开发:
适用于教育和原型开发环境,开发者可以快速实现用户界面,帮助学生和初学者理解图形界面的设计与实现。
5)高级应用:
可用于需要复杂图形和动画的应用,如游戏开发或多媒体应用,利用其渲染能力实现丰富的用户体验。

3、需要注意的事项
1)内存管理:
尽管LVGL是轻量级的,但在内存使用方面仍需谨慎。开发者需要合理管理内存,避免内存泄漏或溢出,特别是在资源受限的环境中。
2)性能优化:
在实现复杂界面时,需要对性能进行优化。例如,减少不必要的重绘,使用图像缓存等方法,提高界面的响应速度和流畅度。
3)输入设备的兼容性:
在选择输入设备时,要确保与LVGL的兼容性。例如,不同的触摸屏可能需要不同的驱动程序,开发者需要确保所用的硬件能够正常工作。
4)学习曲线:
LVGL虽然功能强大,但其使用和配置可能有一定的学习曲线。开发者需要花时间熟悉LVGL的API和工作流程,才能有效利用其功能。
5)文档与社区支持:
LVGL有较好的文档和社区支持,但在遇到问题时,开发者应积极查阅官方文档,参与社区讨论,以获得帮助和解决方案。

总结
Arduino LVGL是一个强大的图形库,适合在资源有限的嵌入式系统上构建高效的用户界面。通过其丰富的组件和灵活的特性,开发者可以实现多种应用场景中的图形界面。然而,在使用过程中,合理管理内存和优化性能是成功的关键。通过充分利用LVGL的特性,开发者能够创建出美观且功能强大的用户界面。

在这里插入图片描述
Arduino LVGL 之在不同平台创建相同的用户界面

一、主要特点
跨平台支持:
LVGL(Lightweight Embedded GUI Library)能够在多种平台上运行,包括 Arduino、ESP32、Raspberry Pi 等。这种跨平台能力使得开发者能够在不同硬件上使用相同的代码和用户界面设计。
统一的界面设计:
LVGL 提供了一套一致的 API 和控件库,使得在不同平台上开发的用户界面具有相似的外观和行为,增强了用户体验的一致性。
自适应布局:
LVGL 支持灵活的布局管理,通过响应式设计和自适应布局,可以根据不同屏幕尺寸和分辨率自动调整界面元素的位置和大小,确保良好的可用性。
主题和样式管理:
LVGL 提供了主题和样式管理功能,允许开发者在不同平台上使用相同的主题和样式,从而实现视觉上的一致性。
事件驱动模型:
LVGL 的事件驱动模型使得开发者可以轻松处理用户交互,无论在何种平台上,用户的操作都能够得到及时的反馈。

二、应用场景
嵌入式设备开发:
在嵌入式设备(如智能家居控制器、医疗设备)中,使用 LVGL 可以实现跨平台的用户界面设计,方便在不同硬件上部署相同的功能。
物联网(IoT)应用:
在物联网应用中,设备可能运行在不同的硬件平台上,通过 LVGL 开发统一的用户界面可以简化开发流程,提高系统的可维护性。
移动应用与嵌入式设备整合:
在某些项目中,移动设备与嵌入式设备需要进行交互,使用 LVGL 可以确保这两者之间的用户界面保持一致,提升用户体验。
教育与实验项目:
在教育环境中,通过 LVGL 开发的跨平台用户界面可以帮助学生学习 GUI 编程,同时在不同的硬件上进行实验,增强实践能力。
原型设计与测试:
在原型设计阶段,开发者可以快速在不同平台上测试相同的界面设计,以验证用户体验和功能实现的有效性。

三、需要注意的事项
平台特性差异:
尽管 LVGL 提供跨平台支持,但不同平台的硬件特性(如处理能力、显示分辨率、输入方式等)可能影响界面的表现,开发者需针对不同平台进行优化。
性能调优:
不同平台的性能差异可能导致界面响应速度和流畅度不一致,开发者需根据具体平台进行性能调优,确保良好的用户体验。
资源管理:
在资源受限的嵌入式平台上,需合理管理内存和处理能力,避免因资源消耗过多导致系统不稳定。
事件处理一致性:
确保在不同平台上事件处理逻辑的一致性,避免因平台差异导致用户交互体验不一致。
测试与验证:
在不同平台上部署相同的用户界面时,需进行全面的测试与验证,以确保在所有平台上的功能和界面表现都符合预期。
结论
Arduino LVGL 之在不同平台创建相同的用户界面是一种高效、灵活的开发方式,适用于嵌入式设备、物联网应用、移动应用整合、教育项目和原型设计等多个领域。通过 LVGL 提供的跨平台支持和一致的界面设计,开发者能够快速构建出具有良好用户体验的应用。在实施过程中,需要关注平台特性差异、性能调优、资源管理、事件处理一致性和测试验证等因素,以确保系统的高效性和可靠性。

在这里插入图片描述
1、基本用户界面(按钮和标签)
(Arduino TFT屏幕):

#include<lvgl.h>#include<TFT_eSPI.h>

TFT_eSPI tft =TFT_eSPI();// TFT实例
lv_disp_buf_t disp_buf;
lv_color_t buf1[LV_HOR_RES_MAX *10];// 颜色缓冲区voidsetup(){
    tft.begin();lv_init();lv_disp_buf_init(&disp_buf, buf1,NULL, LV_HOR_RES_MAX *10);
    lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);
    disp_drv.buffer =&disp_buf;
    disp_drv.flush_cb = my_flush;// 自定义刷新函数lv_disp_drv_register(&disp_drv);// 创建按钮
    lv_obj_t *btn =lv_btn_create(lv_scr_act(),NULL);lv_obj_set_size(btn,120,50);lv_obj_set_style_local_radius(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,15);lv_obj_align(btn,NULL, LV_ALIGN_CENTER,0,0);
    
    lv_obj_t *label =lv_label_create(btn,NULL);lv_label_set_text(label,"Click Me");}voidloop(){lv_task_handler();// LVGL任务处理delay(5);}// 自定义刷新函数voidmy_flush(lv_disp_drv_t *disp,const lv_area_t *area, lv_color_t *color_p){
    tft.setAddrWindow(area->x1, area->y1, area->x2, area->y2);
    tft.pushColors(color_p, area->x2 - area->x1 +1);lv_disp_flush_ready(disp);}

2、相同的用户界面在LVGL模拟器上
(LVGL模拟器):

#include<lvgl.h>voidsetup(){lv_init();
    lv_obj_t *scr =lv_obj_create(NULL,NULL);// 创建屏幕lv_scr_load(scr);// 加载屏幕// 创建按钮
    lv_obj_t *btn =lv_btn_create(scr,NULL);lv_obj_set_size(btn,120,50);lv_obj_set_style_local_radius(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,15);lv_obj_align(btn,NULL, LV_ALIGN_CENTER,0,0);
    
    lv_obj_t *label =lv_label_create(btn,NULL);lv_label_set_text(label,"Click Me");}voidloop(){lv_task_handler();// LVGL任务处理delay(5);}

3、不同平台(TFT与PC)交互相同的用户界面
(Arduino TFT屏幕与串口):

#include<lvgl.h>#include<TFT_eSPI.h>

TFT_eSPI tft =TFT_eSPI();
lv_disp_buf_t disp_buf;
lv_color_t buf1[LV_HOR_RES_MAX *10];voidbtn_event_handler(lv_obj_t *btn){lv_label_set_text(lv_obj_get_child(btn,NULL),"Clicked!");// 更改标签文本
    Serial.println("Button Clicked!");}voidsetup(){
    Serial.begin(115200);
    tft.begin();lv_init();lv_disp_buf_init(&disp_buf, buf1,NULL, LV_HOR_RES_MAX *10);
    lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);
    disp_drv.buffer =&disp_buf;
    disp_drv.flush_cb = my_flush;lv_disp_drv_register(&disp_drv);// 创建按钮
    lv_obj_t *btn =lv_btn_create(lv_scr_act(),NULL);lv_obj_set_size(btn,120,50);lv_obj_set_style_local_radius(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,15);lv_obj_align(btn,NULL, LV_ALIGN_CENTER,0,0);
    
    lv_obj_t *label =lv_label_create(btn,NULL);lv_label_set_text(label,"Click Me");lv_obj_set_event_cb(btn, btn_event_handler);// 注册事件回调}voidloop(){lv_task_handler();delay(5);}voidmy_flush(lv_disp_drv_t *disp,const lv_area_t *area, lv_color_t *color_p){
    tft.setAddrWindow(area->x1, area->y1, area->x2, area->y2);
    tft.pushColors(color_p, area->x2 - area->x1 +1);lv_disp_flush_ready(disp);}

要点解读
跨平台一致性:
LVGL允许在多种平台上创建相同的用户界面。通过使用相同的LVGL API,无论是在Arduino TFT屏幕上还是在LVGL模拟器中,都可以实现一致的界面布局和交互逻辑。
用户界面组件:
案例中展示了如何创建按钮和标签等基本界面组件。LVGL提供了丰富的控件库,开发者可以使用这些控件来构建复杂的用户界面,保持一致的风格和行为。
事件处理机制:
在最后一个案例中,按钮使用事件回调函数来处理用户交互。在点击按钮时,触发事件并执行相应的操作(如更改标签文本和输出到串口)。这种机制使得用户交互更为自然和直观。
自定义刷新函数:
自定义的my_flush()函数负责将LVGL的绘制内容刷新到显示设备上。这个函数是将LVGL与具体显示硬件(如TFT屏幕)连接的关键部分,确保图形能够正确显示。在不同平台上,刷新机制可能会有所不同,但LVGL的框架保持了一致性。
模拟器与真实硬件的联动:
在模拟器上创建的用户界面可以无缝迁移到真实硬件上,而不需要重写代码。这种灵活性使得开发者可以在不同的环境中快速测试和迭代用户界面设计,提高开发效率。

在这里插入图片描述
4、ESP32平台

#include<Arduino.h>#include<lvgl.h>#include<TFT_eSPI.h>// 创建TFT实例
TFT_eSPI tft =TFT_eSPI();static lv_disp_draw_buf_t draw_buf;static lv_color_t buf[LV_HOR_RES_MAX *10];voidmy_disp_flush(lv_disp_drv_t *disp,const lv_area_t *area, lv_color_t *color_p){
  tft.pushImage(area->x1, area->y1, area->x2 - area->x1 +1, area->y2 - area->y1 +1,(uint16_t*)&color_p->full);lv_disp_flush_ready(disp);}voidsetup(){
  Serial.begin(115200);lv_init();

  tft.begin();
  tft.setRotation(1);lv_disp_draw_buf_init(&draw_buf, buf,NULL, LV_HOR_RES_MAX *10);static lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);
  disp_drv.hor_res =320;
  disp_drv.ver_res =240;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.draw_buf =&draw_buf;lv_disp_drv_register(&disp_drv);

  lv_obj_t *btn =lv_btn_create(lv_scr_act());lv_obj_set_size(btn,120,50);lv_obj_align(btn, LV_ALIGN_CENTER,0,0);
  lv_obj_t *label =lv_label_create(btn);lv_label_set_text(label,"Hello ESP32!");}voidloop(){lv_task_handler();delay(5);}

5、STM32平台

#include"main.h"#include"lvgl.h"#include"st7735.h"#include"lv_conf.h"static lv_disp_draw_buf_t draw_buf;static lv_color_t buf[LV_HOR_RES_MAX *10];voidSystemClock_Config(void);staticvoidMX_GPIO_Init(void);staticvoidMX_SPI1_Init(void);voidmy_disp_flush(lv_disp_drv_t *disp,const lv_area_t *area, lv_color_t *color_p);intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_SPI1_Init();lv_init();ST7735_Init();lv_disp_draw_buf_init(&draw_buf, buf,NULL, LV_HOR_RES_MAX *10);static lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);
  disp_drv.hor_res =128;
  disp_drv.ver_res =160;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.draw_buf =&draw_buf;lv_disp_drv_register(&disp_drv);

  lv_obj_t *btn =lv_btn_create(lv_scr_act());lv_obj_set_size(btn,120,50);lv_obj_align(btn, LV_ALIGN_CENTER,0,0);
  lv_obj_t *label =lv_label_create(btn);lv_label_set_text(label,"Hello STM32!");while(1){lv_task_handler();HAL_Delay(5);}}voidmy_disp_flush(lv_disp_drv_t *disp,const lv_area_t *area, lv_color_t *color_p){ST7735_DrawBitmap(area->x1, area->y1, color_p);lv_disp_flush_ready(disp);}voidSystemClock_Config(void){// 配置系统时钟}staticvoidMX_GPIO_Init(void){// 初始化GPIO}staticvoidMX_SPI1_Init(void){// 初始化SPI}

6、PC模拟器平台

#include<stdio.h>#include<lvgl.h>#include<SDL2/SDL.h>static lv_disp_draw_buf_t draw_buf;static lv_color_t buf[LV_HOR_RES_MAX *10];voidmy_disp_flush(lv_disp_drv_t *disp,const lv_area_t *area, lv_color_t *color_p){SDL_UpdateTexture(texture,NULL, color_p, area->x2 - area->x1 +1);lv_disp_flush_ready(disp);}intmain(int argc,char**argv){lv_init();SDL_Init(SDL_INIT_VIDEO);
  SDL_Window *window =SDL_CreateWindow("LVGL Simulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,320,240,0);
  SDL_Renderer *renderer =SDL_CreateRenderer(window,-1, SDL_RENDERER_ACCELERATED);
  SDL_Texture *texture =SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STATIC,320,240);lv_disp_draw_buf_init(&draw_buf, buf,NULL, LV_HOR_RES_MAX *10);static lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);
  disp_drv.hor_res =320;
  disp_drv.ver_res =240;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.draw_buf =&draw_buf;lv_disp_drv_register(&disp_drv);

  lv_obj_t *btn =lv_btn_create(lv_scr_act());lv_obj_set_size(btn,120,50);lv_obj_align(btn, LV_ALIGN_CENTER,0,0);
  lv_obj_t *label =lv_label_create(btn);lv_label_set_text(label,"Hello PC!");while(1){lv_task_handler();SDL_RenderClear(renderer);SDL_RenderCopy(renderer, texture,NULL,NULL);SDL_RenderPresent(renderer);SDL_Delay(5);}SDL_DestroyTexture(texture);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();return0;}

要点解读:
初始化LVGL:在所有示例中,通过 lv_init() 初始化LVGL库。无论是哪种平台,都需要调用此函数以开始使用LVGL。

显示缓冲区:使用 lv_disp_draw_buf_init() 初始化显示缓冲区,确保绘图数据的存储和处理。各平台示例中都配置了显示缓冲区。

显示驱动配置:通过 lv_disp_drv_init() 初始化显示驱动,并设置回调函数(如 my_disp_flush)用于刷新显示内容。各平台示例中都注册了相应的显示驱动和回调函数。

创建UI控件:通过 lv_btn_create() 创建按钮控件,并设置按钮的大小、位置和标签文本。在所有示例中,这些控件的创建和配置方式相同,实现了一致的用户界面。

任务处理:通过定期调用 lv_task_handler() 函数处理LVGL任务,确保UI界面能够正确响应和更新。各平台示例中都在循环中调用该函数。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述


本文转载自: https://blog.csdn.net/weixin_41659040/article/details/143649056
版权归原作者 驴友花雕 所有, 如有侵权,请联系我们删除。

“【花雕学编程】Arduino LVGL 之在不同平台创建相同的用户界面”的评论:

还没有评论