【花雕学编程】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(轻量级图形库)中,多个按钮控制不同标签的功能是一种常见的用户界面设计模式。这种设计允许用户通过按下不同的按钮来动态更改界面上显示的标签内容,从而实现更灵活的用户交互。以下是对这一功能的详细解释,包括主要特点、应用场景以及需要注意的事项。

主要特点
动态内容更新:
用户可以通过不同的按钮触发标签内容的更新,实现动态的信息展示,增强用户界面的交互性。
简洁明了:
通过将多个按钮与不同标签结合,用户界面可以保持简洁,避免信息的堆叠和混乱,使用户更容易理解和使用。
灵活性:
开发者可以根据应用需求,灵活设置每个按钮对应的标签内容,适应不同的功能需求。
实时反馈:
点击按钮后,标签内容的变化能够立即反馈给用户,提升用户体验,使操作更加直观。

应用场景
设置界面:
在设备设置界面中,多个按钮可以用于选择不同的设置选项(如音量、亮度等),每个按钮对应的标签显示当前选项的具体值。
信息展示:
在信息展示界面中,按钮可以用于切换不同的信息内容,例如显示不同的传感器数据、天气信息等。
教学应用:
在教育类应用中,多个按钮可以用来展示不同的知识点或步骤,通过标签动态更新内容,帮助用户学习。
游戏控制:
在游戏应用中,按钮可以用于选择不同的角色、道具或游戏模式,标签则动态显示所选内容的详细信息。

注意事项
按钮功能明确:
确保每个按钮的功能明确,用户能够一目了然地理解每个按钮的作用,避免造成混淆。
标签内容简洁:
标签内容应简洁明了,避免过长的文本导致界面拥挤或难以阅读,确保用户能够快速获取信息。
性能优化:
在频繁更新标签内容的情况下,需注意性能问题,确保系统能够快速响应用户的操作而不出现延迟。
用户反馈:
在用户点击按钮时,提供视觉反馈(如按钮颜色变化、动画等),使用户能够确认操作已被接受并执行。
测试与调试:
在开发过程中,进行充分的测试,确保按钮与标签的交互逻辑正常工作,并处理可能出现的错误或问题。

总结
在 Arduino LVGL 中,多个按钮控制不同标签的设计模式为用户提供了灵活且直观的方式来交互和获取信息。通过动态更新标签内容,开发者能够创建更具吸引力和实用性的用户界面。在实际应用中,需要关注按钮功能的明确性、标签内容的简洁性以及系统性能等方面,以确保用户体验的流畅和满意。合理的设计与实现将使这一功能成为用户界面中的一个重要组成部分,提升应用的整体功能性和易用性。

在这里插入图片描述
1、基本按钮控制不同标签

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

TFT_eSPI tft = TFT_eSPI();
lv_obj_t *label1;
lv_obj_t *label2;

void button1_event_handler(lv_event_t *e) {
    lv_label_set_text(label1, "Button 1 Pressed");
}

void button2_event_handler(lv_event_t *e) {
    lv_label_set_text(label2, "Button 2 Pressed");
}

void setup() {
    Serial.begin(9600);
    tft.begin();
    lv_init();

    lv_disp_buf_t disp_buf;
    static lv_color_t buf1[LV_HOR_RES_MAX * 10];
    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 *scr = lv_obj_create(NULL);
    lv_scr_load(scr);

    // 创建标签1
    label1 = lv_label_create(scr);
    lv_label_set_text(label1, "Label 1");
    lv_obj_align(label1, LV_ALIGN_CENTER, -50, -20);

    // 创建标签2
    label2 = lv_label_create(scr);
    lv_label_set_text(label2, "Label 2");
    lv_obj_align(label2, LV_ALIGN_CENTER, 50, -20);

    // 创建按钮1
    lv_obj_t *btn1 = lv_btn_create(scr);
    lv_obj_set_size(btn1, 80, 40);
    lv_obj_align(btn1, LV_ALIGN_CENTER, -50, 20);
    lv_obj_t *btn1_label = lv_label_create(btn1);
    lv_label_set_text(btn1_label, "Button 1");
    lv_obj_add_event_cb(btn1, button1_event_handler, LV_EVENT_CLICKED, NULL);

    // 创建按钮2
    lv_obj_t *btn2 = lv_btn_create(scr);
    lv_obj_set_size(btn2, 80, 40);
    lv_obj_align(btn2, LV_ALIGN_CENTER, 50, 20);
    lv_obj_t *btn2_label = lv_label_create(btn2);
    lv_label_set_text(btn2_label, "Button 2");
    lv_obj_add_event_cb(btn2, button2_event_handler, LV_EVENT_CLICKED, NULL);
}

void loop() {
    lv_task_handler();
    delay(5);
}

void my_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((uint16_t *)color_p, lv_area_get_size(area));
    lv_disp_flush_ready(disp);
}

2、按钮控制多个标签文本状态

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

TFT_eSPI tft = TFT_eSPI();
lv_obj_t *label1;
lv_obj_t *label2;
lv_obj_t *label3;

void button1_event_handler(lv_event_t *e) {
    lv_label_set_text(label1, "Button 1 Activated");
}

void button2_event_handler(lv_event_t *e) {
    lv_label_set_text(label2, "Button 2 Activated");
}

void button3_event_handler(lv_event_t *e) {
    lv_label_set_text(label3, "Button 3 Activated");
}

void setup() {
    Serial.begin(9600);
    tft.begin();
    lv_init();

    lv_disp_buf_t disp_buf;
    static lv_color_t buf1[LV_HOR_RES_MAX * 10];
    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 *scr = lv_obj_create(NULL);
    lv_scr_load(scr);

    // 创建标签1
    label1 = lv_label_create(scr);
    lv_label_set_text(label1, "Label 1");
    lv_obj_align(label1, LV_ALIGN_CENTER, -50, -40);

    // 创建标签2
    label2 = lv_label_create(scr);
    lv_label_set_text(label2, "Label 2");
    lv_obj_align(label2, LV_ALIGN_CENTER, 0, -40);

    // 创建标签3
    label3 = lv_label_create(scr);
    lv_label_set_text(label3, "Label 3");
    lv_obj_align(label3, LV_ALIGN_CENTER, 50, -40);

    // 创建按钮1
    lv_obj_t *btn1 = lv_btn_create(scr);
    lv_obj_set_size(btn1, 80, 40);
    lv_obj_align(btn1, LV_ALIGN_CENTER, -50, 20);
    lv_obj_t *btn1_label = lv_label_create(btn1);
    lv_label_set_text(btn1_label, "Button 1");
    lv_obj_add_event_cb(btn1, button1_event_handler, LV_EVENT_CLICKED, NULL);

    // 创建按钮2
    lv_obj_t *btn2 = lv_btn_create(scr);
    lv_obj_set_size(btn2, 80, 40);
    lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 20);
    lv_obj_t *btn2_label = lv_label_create(btn2);
    lv_label_set_text(btn2_label, "Button 2");
    lv_obj_add_event_cb(btn2, button2_event_handler, LV_EVENT_CLICKED, NULL);

    // 创建按钮3
    lv_obj_t *btn3 = lv_btn_create(scr);
    lv_obj_set_size(btn3, 80, 40);
    lv_obj_align(btn3, LV_ALIGN_CENTER, 50, 20);
    lv_obj_t *btn3_label = lv_label_create(btn3);
    lv_label_set_text(btn3_label, "Button 3");
    lv_obj_add_event_cb(btn3, button3_event_handler, LV_EVENT_CLICKED, NULL);
}

void loop() {
    lv_task_handler();
    delay(5);
}

void my_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((uint16_t *)color_p, lv_area_get_size(area));
    lv_disp_flush_ready(disp);
}

3、按钮控制标签并提供不同的颜色反馈

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

TFT_eSPI tft = TFT_eSPI();
lv_obj_t *label1;
lv_obj_t *label2;

void button1_event_handler(lv_event_t *e) {
    lv_label_set_text(label1, "Button 1 Pressed");
    lv_obj_set_style_text_color(label1, LV_COLOR_GREEN, 0); // 设置文本颜色为绿色
}

void button2_event_handler(lv_event_t *e) {
    lv_label_set_text(label2, "Button 2 Pressed");
    lv_obj_set_style_text_color(label2, LV_COLOR_BLUE, 0); // 设置文本颜色为蓝色
}

void setup() {
    Serial.begin(9600);
    tft.begin();
    lv_init();

    lv_disp_buf_t disp_buf;
    static lv_color_t buf1[LV_HOR_RES_MAX * 10];
    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 *scr = lv_obj_create(NULL);
    lv_scr_load(scr);

    // 创建标签1
    label1 = lv_label_create(scr);
    lv_label_set_text(label1, "Label 1");
    lv_obj_align(label1, LV_ALIGN_CENTER, -50, -20);

    // 创建标签2
    label2 = lv_label_create(scr);
    lv_label_set_text(label2, "Label 2");
    lv_obj_align(label2, LV_ALIGN_CENTER, 50, -20);

    // 创建按钮1
    lv_obj_t *btn1 = lv_btn_create(scr);
    lv_obj_set_size(btn1, 80, 40);
    lv_obj_align(btn1, LV_ALIGN_CENTER, -50, 20);
    lv_obj_t *btn1_label = lv_label_create(btn1);
    lv_label_set_text(btn1_label, "Button 1");
    lv_obj_add_event_cb(btn1, button1_event_handler, LV_EVENT_CLICKED, NULL);

    // 创建按钮2
    lv_obj_t *btn2 = lv_btn_create(scr);
    lv_obj_set_size(btn2, 80, 40);
    lv_obj_align(btn2, LV_ALIGN_CENTER, 50, 20);
    lv_obj_t *btn2_label = lv_label_create(btn2);
    lv_label_set_text(btn2_label, "Button 2");
    lv_obj_add_event_cb(btn2, button2_event_handler, LV_EVENT_CLICKED, NULL);
}

void loop() {
    lv_task_handler();
    delay(5);
}

void my_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((uint16_t *)color_p, lv_area_get_size(area));
    lv_disp_flush_ready(disp);
}

要点解读
多个按钮与标签的基本实现:
所有案例展示了如何使用多个按钮来控制不同的标签,通过按钮点击事件改变标签的文本。这种设计使得用户可以通过简单的交互来获取不同的信息。
事件处理机制:
每个按钮都通过 lv_obj_add_event_cb() 注册了特定的事件处理函数,确保用户点击按钮时可以触发相应的操作。这种事件驱动的设计模式使得代码结构清晰且易于扩展。
动态文本更新:
在按钮事件处理函数中,通过 lv_label_set_text() 动态更新标签的内容,展示了如何在用户操作后即时反馈。这种实时更新的特性增强了用户体验。
颜色反馈机制:
第三个案例中,通过 lv_obj_set_style_text_color() 方法改变标签文本的颜色,以提供视觉反馈。这种颜色变化可以帮助用户快速识别操作结果,提高交互的直观性。
良好的界面布局:
使用 lv_obj_align() 方法可以灵活地布局界面,使得按钮和标签的位置合理,便于用户操作。整洁的界面设计不仅提升了美观性,也提高了用户的操作效率。

在这里插入图片描述
4、基本的按钮控制标签

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

// 初始化TFT屏幕
TFT_eSPI tft = TFT_eSPI();

// 按钮1事件处理函数
void btn1_event_handler(lv_event_t *e) {
  lv_obj_t *label = static_cast<lv_obj_t *>(lv_event_get_user_data(e));
  lv_label_set_text(label, "按钮1被点击");
}

// 按钮2事件处理函数
void btn2_event_handler(lv_event_t *e) {
  lv_obj_t *label = static_cast<lv_obj_t *>(lv_event_get_user_data(e));
  lv_label_set_text(label, "按钮2被点击");
}

void setup() {
  Serial.begin(115200);

  // 初始化TFT屏幕
  tft.begin();
  tft.setRotation(1);

  // 初始化LVGL库
  lv_init();

  // 设置显示缓冲区
  static lv_color_t buf[LV_HOR_RES_MAX * 10];
  static lv_disp_buf_t disp_buf;
  lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);

  // 初始化显示驱动
  lv_disp_drv_t disp_drv;
  lv_disp_drv_init(&disp_drv);
  disp_drv.hor_res = TFT_WIDTH;
  disp_drv.ver_res = TFT_HEIGHT;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.buffer = &disp_buf;
  lv_disp_drv_register(&disp_drv);

  // 创建标签1
  lv_obj_t *label1 = lv_label_create(lv_scr_act());
  lv_label_set_text(label1, "标签1");
  lv_obj_align(label1, LV_ALIGN_CENTER, -50, -20);

  // 创建标签2
  lv_obj_t *label2 = lv_label_create(lv_scr_act());
  lv_label_set_text(label2, "标签2");
  lv_obj_align(label2, LV_ALIGN_CENTER, 50, -20);

  // 创建按钮1
  lv_obj_t *btn1 = lv_btn_create(lv_scr_act());
  lv_obj_align(btn1, LV_ALIGN_CENTER, -50, 50);
  lv_obj_add_event_cb(btn1, btn1_event_handler, LV_EVENT_CLICKED, label1);
  lv_obj_t *label_btn1 = lv_label_create(btn1);
  lv_label_set_text(label_btn1, "按钮1");

  // 创建按钮2
  lv_obj_t *btn2 = lv_btn_create(lv_scr_act());
  lv_obj_align(btn2, LV_ALIGN_CENTER, 50, 50);
  lv_obj_add_event_cb(btn2, btn2_event_handler, LV_EVENT_CLICKED, label2);
  lv_obj_t *label_btn2 = lv_label_create(btn2);
  lv_label_set_text(label_btn2, "按钮2");
}

void loop() {
  lv_timer_handler(); // 处理LVGL任务
  delay(5); // 小延时
}

void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
  tft.startWrite();
  tft.setAddrWindow(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1);
  for (int y = area->y1; y <= area->y2; y++) {
    for (int x = area->x1; x <= area->x2; x++) {
      tft.pushColor(color_p->full);
      color_p++;
    }
  }
  tft.endWrite();
  lv_disp_flush_ready(disp);
}

要点解读:
事件处理函数:为每个按钮创建单独的事件处理函数,通过lv_obj_add_event_cb函数为按钮添加点击事件。

标签内容更新:在事件处理函数中使用lv_label_set_text函数动态更新标签的文本内容。

用户数据传递:在添加事件回调时传递用户数据(标签对象),使事件处理函数能够访问并修改标签内容。

组件对齐与布局:使用lv_obj_align函数设置按钮和标签在屏幕上的位置,确保界面布局合理。

显示刷新:通过定期调用lv_timer_handler函数,刷新显示内容,确保标签内容实时更新。

5、多个按钮控制不同标签,带有初始文本

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

// 初始化TFT屏幕
TFT_eSPI tft = TFT_eSPI();

// 按钮1事件处理函数
void btn1_event_handler(lv_event_t *e) {
  lv_obj_t *label = static_cast<lv_obj_t *>(lv_event_get_user_data(e));
  lv_label_set_text(label, "按钮1被点击");
}

// 按钮2事件处理函数
void btn2_event_handler(lv_event_t *e) {
  lv_obj_t *label = static_cast<lv_obj_t *>(lv_event_get_user_data(e));
  lv_label_set_text(label, "按钮2被点击");
}

// 按钮3事件处理函数
void btn3_event_handler(lv_event_t *e) {
  lv_obj_t *label = static_cast<lv_obj_t *>(lv_event_get_user_data(e));
  lv_label_set_text(label, "按钮3被点击");
}

void setup() {
  Serial.begin(115200);

  // 初始化TFT屏幕
  tft.begin();
  tft.setRotation(1);

  // 初始化LVGL库
  lv_init();

  // 设置显示缓冲区
  static lv_color_t buf[LV_HOR_RES_MAX * 10];
  static lv_disp_buf_t disp_buf;
  lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10);

  // 初始化显示驱动
  lv_disp_drv_t disp_drv;
  lv_disp_drv_init(&disp_drv);
  disp_drv.hor_res = TFT_WIDTH;
  disp_drv.ver_res = TFT_HEIGHT;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.buffer = &disp_buf;
  lv_disp_drv_register(&disp_drv);

  // 创建标签1
  lv_obj_t *label1 = lv_label_create(lv_scr_act());
  lv_label_set_text(label1, "标签1: 初始文本");
  lv_obj_align(label1, LV_ALIGN_CENTER, -50, -20);

  // 创建标签2
  lv_obj_t *label2 = lv_label_create(lv_scr_act());
  lv_label_set_text(label2, "标签2: 初始文本");
  lv_obj_align(label2, LV_ALIGN_CENTER, 50, -20);

  // 创建标签3
  lv_obj_t *label3 = lv_label_create(lv_scr_act());
  lv_label_set_text(label3, "标签3: 初始文本");
  lv_obj_align(label3, LV_ALIGN_CENTER, 0, 60);

  // 创建按钮1
  lv_obj_t *btn1 = lv_btn_create(lv_scr_act());
  lv_obj_align(btn1, LV_ALIGN_CENTER, -50, 80);
  lv_obj_add_event_cb(btn1, btn1_event_handler, LV_EVENT_CLICKED, label1);
  lv_obj_t *label_btn1 = lv_label_create(btn1);
  lv_label_set_text(label_btn1, "按钮1");

  // 创建按钮2
  lv_obj_t *btn2 = lv_btn_create(lv_scr_act());
  lv_obj_align(btn2, LV_ALIGN_CENTER, 50, 80);
  lv_obj_add_event_cb(btn2, btn2_event_handler, LV_EVENT_CLICKED, label2);
  lv_obj_t *label_btn2 = lv_label_create(btn2);
  lv_label_set_text(label_btn2, "按钮2");

  // 创建按钮3
  lv_obj_t *btn3 = lv_btn_create(lv_scr_act());
  lv_obj_align(btn3, LV_ALIGN_CENTER, 0, 130);
  lv_obj_add_event_cb(btn3, btn3_event_handler, LV_EVENT_CLICKED, label3);
  lv_obj_t *label_btn3 = lv_label_create(btn3);
  lv_label_set_text(label_btn3, "按钮3");
}

void loop() {
  lv_timer_handler(); // 处理LVGL任务
  delay(5); // 小延时
}

void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
  tft.startWrite();
  tft.setAddrWindow(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1);
  for (int y = area->y1; y <= area->y2; y++) {
    for (int x = area->x1; x <= area->x2; x++) {
      tft.pushColor(color_p->full);
      color_p++;
    }
  }
  tft.endWrite();
  lv_disp_flush_ready(disp);
}

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

在这里插入图片描述

### 关于在Arduino上使用LVGL库的示例教程 #### 示例代码解析 为了帮助理解如何在Arduino平台上利用LVGL库构建图形用户界面,下面提供了一个简单的`HelloWorld`实例。此例子展示了基本的初始化过程以及创建一个按钮的方法。 ```cpp #include "lvgl/lvgl.h" #include "lv_arduino.h" void setup() { Serial.begin(9600); // 初始化TFT屏幕和触摸屏 tft.init(); ts.begin(); // 初始化LVGL库 lv_init(); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic display driver initialization*/ disp_drv.flush_cb = my_disp_flush; // 设置刷新回调函数 lv_disp_drv_register(&disp_drv); // 创建一个按钮并设置其属性 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_set_pos(btn1, 10, 10); /*Set its position*/ lv_obj_set_size(btn1, 120, 50); /*Set its size*/ // 给按钮添加标签 lv_obj_t * label = lv_label_create(btn1); lv_label_set_text(label, "Button"); } void loop() { lv_task_handler(); /*Let the GUI do its work*/ delay(5); /*Sleep a bit not to waste resources*/ } ``` 这段代码首先包含了必要的头文件,并定义了`setup()`函数来完成硬件初始化工作[^2]。接着,在屏幕上创建了一个按钮对象,并通过调用`lv_btn_create()`方法将其放置到当前活动窗口中;之后调整位置大小并通过`lv_label_create()`给该按钮附加文字说明。最后,在主循环里不断更新GUI状态以响应事件处理程序。 #### 主要组件解释 - **lvgl/** 文件夹下存放着核心图形引擎及相关模块; - **examples/** 中有多个子目录分别对应不同类型的案例研究,比如最基础的`HelloWorld`入门级应用; - **libraries/** 收录了第三方依赖项和其他支持包; - **tools/** 提供了一些实用工具,例如图像转换器等辅助开发的小应用程序[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值