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支持多种图像格式(如JPEG、PNG等),能够高效地在屏幕上展示图像。图像可以作为背景、图标或独立组件,增强用户界面的视觉效果。
按钮交互功能:
按钮控件提供了用户与设备交互的基本方式。LVGL的按钮支持多种状态(如正常、悬停、按下、禁用),可以通过视觉变化来反馈用户操作。
自定义样式:
开发者可以自定义按钮的外观,包括颜色、形状、字体和边框样式,确保按钮与整体界面风格一致,提升用户体验。
事件处理机制:
LVGL提供了丰富的事件处理机制,按钮可以响应各种用户操作,如点击、长按和释放。开发者可以根据事件触发特定的功能。
多种布局支持:
LVGL支持灵活的布局管理,可以将按钮与图像按需组合,构建丰富的用户界面。通过合理布局,可以提高界面的可用性。

应用场景
展示信息:
在智能家居、监控设备等应用中,可以使用图像展示设备状态或环境信息,按钮则可用于控制设备或调整设置。
游戏界面:
在游戏开发中,图像可用于展示角色、场景,按钮用于控制角色移动、攻击等操作,提供直观的交互体验。
多媒体播放器:
在音频或视频播放器中,按钮可用于播放、暂停、快进等操作,图像用于展示封面或播放状态,提升用户体验。
设置界面:
在各种设备的设置界面中,图像可用于指示功能模块,按钮则用于选择和调整设置选项。

需要注意的事项
图像加载效率:
大尺寸或高质量图像可能影响加载速度和响应时间。因此,应选择合适的图像分辨率,并在必要时进行压缩,以提高性能。
按钮的可见性:
按钮的设计需确保在不同背景下具有良好的可见性。使用对比色和适当的阴影效果,可以提高按钮的辨识度。
用户反馈:
按钮在被点击时应提供即时的视觉反馈,如颜色变化或动画效果,以提升用户的操作确认感。
触摸区域:
在触摸屏上,按钮的触摸区域需足够大,以方便用户操作。建议遵循人体工程学设计,确保用户在使用时的舒适性。
事件处理逻辑:
在设计按钮交互时,要确保事件处理逻辑清晰,避免因误触而导致的不必要操作。同时,考虑长按、双击等多种交互方式的实现。
通过合理利用Arduino LVGL的图像展示与按钮交互功能,开发者能够构建出高效、直观且美观的用户界面,提升产品的 usability 和用户满意度。

在这里插入图片描述
1、显示图像与按钮切换

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

TFT_eSPI tft =TFT_eSPI();// 创建TFT对象
lv_obj_t * img;// 声明图像对象voidbtn_event_callback(lv_event_t * e){lv_obj_set_hidden(img,!lv_obj_is_hidden(img));// 切换图像显示状态}voidsetup(){lv_init();
    tft.begin();
    tft.setRotation(1);lvgl_port_init();// 初始化LVGL端口// 创建图像对象
    img =lv_img_create(lv_scr_act());lv_img_set_src(img,"S:/image.jpg");// 设置图像源,需根据实际情况修改lv_obj_align(img, LV_ALIGN_CENTER,0,-20);// 创建按钮
    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,40);lv_obj_add_event_cb(btn, btn_event_callback, LV_EVENT_CLICKED,NULL);// 添加事件回调// 创建按钮标签
    lv_obj_t * label =lv_label_create(btn);lv_label_set_text(label,"Toggle Image");lv_obj_center(label);}voidloop(){lv_task_handler();// 处理LVGL任务delay(5);}

2、多张图像与按钮切换

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

TFT_eSPI tft =TFT_eSPI();// 创建TFT对象
lv_obj_t * img;// 声明图像对象constchar* images[]={"S:/image1.jpg","S:/image2.jpg","S:/image3.jpg"};int current_image =0;// 当前显示的图像索引voidbtn_event_callback(lv_event_t * e){
    current_image =(current_image +1)%3;// 循环切换图像lv_img_set_src(img, images[current_image]);// 更新图像源}voidsetup(){lv_init();
    tft.begin();
    tft.setRotation(1);lvgl_port_init();// 初始化LVGL端口// 创建图像对象
    img =lv_img_create(lv_scr_act());lv_img_set_src(img, images[current_image]);lv_obj_align(img, LV_ALIGN_CENTER,0,-20);// 创建按钮
    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,40);lv_obj_add_event_cb(btn, btn_event_callback, LV_EVENT_CLICKED,NULL);// 添加事件回调// 创建按钮标签
    lv_obj_t * label =lv_label_create(btn);lv_label_set_text(label,"Next Image");lv_obj_center(label);}voidloop(){lv_task_handler();// 处理LVGL任务delay(5);}

3、图像与按钮并行显示

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

TFT_eSPI tft =TFT_eSPI();// 创建TFT对象
lv_obj_t * img;// 声明图像对象voidbtn_event_callback(lv_event_t * e){
    lv_obj_t * btn =lv_event_get_target(e);constchar* label_text =lv_label_get_text(lv_obj_get_child(btn,NULL));if(strcmp(label_text,"Show Image")==0){lv_label_set_text(lv_obj_get_child(btn,NULL),"Hide Image");lv_obj_clear_flag(img, LV_OBJ_FLAG_HIDDEN);// 显示图像}else{lv_label_set_text(lv_obj_get_child(btn,NULL),"Show Image");lv_obj_add_flag(img, LV_OBJ_FLAG_HIDDEN);// 隐藏图像}}voidsetup(){lv_init();
    tft.begin();
    tft.setRotation(1);lvgl_port_init();// 初始化LVGL端口// 创建图像对象
    img =lv_img_create(lv_scr_act());lv_img_set_src(img,"S:/image.jpg");// 设置图像源,需根据实际情况修改lv_obj_align(img, LV_ALIGN_CENTER,0,-20);lv_obj_add_flag(img, LV_OBJ_FLAG_HIDDEN);// 初始隐藏图像// 创建按钮
    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,40);lv_obj_add_event_cb(btn, btn_event_callback, LV_EVENT_CLICKED,NULL);// 添加事件回调// 创建按钮标签
    lv_obj_t * label =lv_label_create(btn);lv_label_set_text(label,"Show Image");lv_obj_center(label);}voidloop(){lv_task_handler();// 处理LVGL任务delay(5);}

要点解读
图像与按钮的创建:
在每个示例中,使用lv_img_create创建图像对象,使用lv_btn_create创建按钮对象。LVGL提供了简单的API来方便地创建和管理界面元素。
事件回调机制:
每个按钮都绑定了一个事件回调函数。通过lv_obj_add_event_cb,当按钮被点击时,回调函数会被触发,执行图像显示或切换等逻辑。事件驱动模型使得界面更加灵活和响应迅速。
图像的动态更新:
在第二个示例中,通过维护一个图像数组,按钮点击事件会循环切换显示的图像。这种方式能够轻松扩展到更多图像,增强用户界面的互动性。
图像的显示控制:
第三个示例展示了如何通过按钮控制图像的显示与隐藏。初始时,图像是隐藏的,只有在用户点击按钮后,图像才会显示出来。这种方式使得用户界面更为简洁。
与硬件的集成:
所有示例都通过TFT_eSPI库与显示屏进行交互,确保图像能够正确展示。结合Arduino的硬件能力,可以实现更复杂的交互,如传感器数据驱动的图像变化等。

在这里插入图片描述
4、显示图像并响应按钮点击

#include<lvgl.h>#include<TFT_eSPI.h>#include<FS.h>// 使用SPIFFS存储图像// 假设图像已经存储在SPIFFS中,文件名为"/image.png"constchar* img_filename ="/image.png";voidsetup(){lv_init();tft_init();lv_port_init();
  SPIFFS.begin(true);// 创建一个按钮
  lv_obj_t * btn =lv_btn_create(lv_scr_act());lv_obj_set_pos(btn,50,50);lv_obj_set_size(btn,100,50);
  lv_obj_t * label =lv_label_create(btn);lv_label_set_text(label,"Show Image");// 为按钮设置点击事件回调函数lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED,NULL);}voidloop(){lv_task_handler();delay(5);}// 按钮点击事件回调函数voidbtn_event_cb(lv_event_t * e){
  lv_event_code_t code =lv_event_get_code(e);if(code == LV_EVENT_CLICKED){
    lv_obj_t * img =lv_img_create(lv_scr_act());
    File file = SPIFFS.open(img_filename,"r");if(!file){
      Serial.println("Failed to open image file");return;}lv_img_set_src(img,lv_img_buf_alloc(file.size(), LV_IMG_CF_TRUE_COLOR));
    file.read((uint8_t*)lv_img_buf_get_data(img), file.size());
    file.close();lv_obj_align(img, LV_ALIGN_CENTER,0,0);}}

5、 图像滑动查看

#include<lvgl.h>#include<TFT_eSPI.h>#include<FS.h>voidsetup(){lv_init();tft_init();lv_port_init();
  SPIFFS.begin(true);// 创建一个滑动条
  lv_obj_t * slider =lv_slider_create(lv_scr_act());lv_obj_set_pos(slider,10,10);lv_obj_set_size(slider,200,50);// 创建一个图像视图
  lv_obj_t * img =lv_img_create(lv_scr_act());lv_obj_set_size(img,480,320);// 设置图像视图大小lv_obj_set_pos(img,0,50);// 设置图像视图位置// 将滑动条值与图像位置关联lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, img);}voidloop(){lv_task_handler();delay(5);}// 滑动条值改变事件回调函数voidslider_event_cb(lv_event_t * e){
  lv_event_code_t code =lv_event_get_code(e);if(code == LV_EVENT_VALUE_CHANGED){
    lv_obj_t * slider =lv_event_get_target(e);
    lv_obj_t * img =(lv_obj_t*)lv_event_get_user_data(e);int16_t value =lv_slider_get_value(slider);lv_img_set_offset_x(img, value *10);// 根据滑动条值改变图像的X偏移}}

6、图像和按钮组合控件

#include<lvgl.h>#include<TFT_eSPI.h>#include<FS.h>voidsetup(){lv_init();tft_init();lv_port_init();
  SPIFFS.begin(true);// 创建一个图像按钮
  lv_obj_t * btn =lv_btn_create(lv_scr_act());lv_obj_set_pos(btn,50,50);lv_obj_set_size(btn,100,100);// 创建一个图像
  lv_obj_t * img =lv_img_create(btn);lv_img_set_src(img, LV_SYMBOL_LEFT);// 使用LVGL内置符号作为图像// 为图像按钮设置点击事件回调函数lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED,NULL);}voidloop(){lv_task_handler();delay(5);}// 图像按钮点击事件回调函数voidbtn_event_cb(lv_event_t * e){
  lv_event_code_t code =lv_event_get_code(e);if(code == LV_EVENT_CLICKED){
    Serial.println("Image button clicked");}}

要点解读
图像存储与读取:
图像可以存储在SPIFFS或其他文件系统中,通过文件系统API读取图像数据,并将其设置为LVGL图像控件的源。
按钮事件处理:
为按钮添加事件回调函数,当按钮被点击时,执行特定的操作,如显示图像或改变图像的位置。
图像与控件的交互:
可以将图像作为按钮的装饰,或者在按钮点击事件中改变图像的属性,如位置或可见性。
滑动条控制图像:
使用滑动条控件来控制图像的位置或大小,实现图像的滑动查看功能。
组合控件的使用:
LVGL允许将多个控件(如图像和按钮)组合在一起,创建复杂的用户界面元素。

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

在这里插入图片描述


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

“【花雕学编程】Arduino LVGL 之图像展示与按钮交互”的评论:

还没有评论