Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行

Arduino应用开发------使用GUI-Guider制作LVGL UI并导入ESP32运行

目录

  • [Arduino应用开发------使用GUI-Guider制作LVGL UI并导入ESP32运行](#Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行)
    • 前言
    • [1 使用GUI-Guider设计UI](#1 使用GUI-Guider设计UI)
      • [1.1 创建工程](#1.1 创建工程)
      • [1.2 设计UI](#1.2 设计UI)
    • [2 ESP工程导入UI](#2 ESP工程导入UI)
      • [2.1 移植LVGL](#2.1 移植LVGL)
      • [2.2 移植UI文件](#2.2 移植UI文件)
      • [2.3 调用UI文件](#2.3 调用UI文件)
      • [2.4 烧录测试](#2.4 烧录测试)
    • 结束语

前言

GUI Guider是一个专门针对LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的方式设计LVGL GUI页面,加速GUI的设计。设计完成的UI页面可以在PC上仿真运行,确认设计完毕之后可以生成C代码,再整合到MCU项目中。

1 使用GUI-Guider设计UI

1.1 创建工程

打开GUI-Guider,选择自己要使用的LVGL版本,V7或者V8,两个版本差别较大,有些控件不兼容,这点需要注意。

注:我使用的GUI-Guider版本是1.6.1。其他版本应该是基本一样的。

设备模板选择空白,因为ESP32并不包含在这个软件的模板里面。

应用模板可以根据自己的需要选择空白模板或者测试demo。

项目配置根据自己的情况设置。

注:如果你屏幕的尺寸跟测试demo的尺寸不一致,里面的布局可能会被打乱,素材可能也会被拉伸。

空白模板如下:

测试demo如下:

1.2 设计UI

创建项目之后就可以开始设计自己的UI了。

空白模板如下:

测试demo如下:

UI设计好以后,点击C编译。编译成功后会在PC上仿真运行。

仿真结果如下:

2 ESP工程导入UI

2.1 移植LVGL

关于这个,我之前发过博客,不懂的同学可以先看下。
Arduino应用开发------esp32 lvgl v8.3环境搭建

2.2 移植UI文件

打开上面GUI-Guider的工程目录,customgenerated文件夹里面全部都是UI相关的文件,我们把这些文件移植到ESP32的工程里面即可。

在ESP32工程的src文件夹(也就是main.cpp所在目录),新建一个文件夹用来存放UI文件,名字随意(我这里命名为lvgl_ui)。

把上面说的customgenerated文件夹里面的文件全部放到ESP32工程这个新建的文件夹(lvgl_ui)里面。

拷贝完成后,用VScode打开ESP32的工程,编译。

注意几个容易出错的点:
1、根据设计UI的不同,有些文件需要进行修改才能编译通过,比如一些图像素材文件,需要将#include "lvgl/lvgl.h"改成#include "lvgl.h"。可以先编译一下,看看有没有报错。
2、制作UI时用到的控件,需要在ESP32工程的lv_conf.h里面打开相应的宏。
3、有些控件在GUI-Guider上面有,但是ESP32工程上移植的LVGL可能没有,如果出现这种情况,可以把GUI-Guider工程上面对应控件的几个文件也移植到ESP32工程对应的位置即可。

如果报错如下:

#include "lvgl/lvgl.h"改成#include "lvgl.h",然后重新编译即可。

2.3 调用UI文件

1)添加头文件

在main.cpp里面把前面加的UI文件包含进去。

c 复制代码
// 前面的lvgl_ui是文件夹名称,根据自己的文件夹修改
#include "lvgl_ui\events_init.h"
#include "lvgl_ui\gui_guider.h"
#include "lvgl_ui\custom.h"

2)创建一个UI

c 复制代码
lv_ui guider_ui;

3)初始化UI

c 复制代码
setup_ui(&guider_ui);
events_init(&guider_ui);
custom_init(&guider_ui);

完整的示例代码如下:

c 复制代码
#include <Arduino.h>
#include <SPI.h>
#include <TFT_eSPI.h>
#include "lvgl.h"
#include "lvgl_ui\events_init.h"
#include "lvgl_ui\gui_guider.h"
#include "lvgl_ui\custom.h"

lv_ui guider_ui;

TFT_eSPI tft = TFT_eSPI(); 

static lv_disp_draw_buf_t draw_buf;


/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
  uint32_t w = ( area->x2 - area->x1 + 1 );
  uint32_t h = ( area->y2 - area->y1 + 1 );

  tft.startWrite();
  tft.setAddrWindow( area->x1, area->y1, w, h );
  tft.pushColors( ( uint16_t * )&color_p->full, w * h, true );
  tft.endWrite();

  lv_disp_flush_ready( disp_drv );
}

/*Read the touchpad*/
void my_touchpad_read( lv_indev_drv_t * indev_drv, lv_indev_data_t * data )
{
}

void lvgl_user_init(void)
{
  lv_init();
  
  /*Set the touchscreen calibration data,
    the actual data for your display can be acquired using
    the Generic -> Touch_calibrate example from the TFT_eSPI library*/
  // uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
  // tft.setTouch( calData );
  
  lv_color_t* buf1 = (lv_color_t*) heap_caps_malloc(240 * 240, MALLOC_CAP_SPIRAM);
  // lv_color_t* buf2 = (lv_color_t*) heap_caps_malloc(240 * 240, MALLOC_CAP_SPIRAM);
  lv_disp_draw_buf_init( &draw_buf, buf1, NULL, 240 * 240);

  /*Initialize the display*/
  static lv_disp_drv_t disp_drv;
  lv_disp_drv_init( &disp_drv );
  /*Change the following line to your display resolution*/
  disp_drv.hor_res = 240;
  disp_drv.ver_res = 240;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.full_refresh = 1;
  disp_drv.draw_buf = &draw_buf;
  lv_disp_drv_register(&disp_drv);

  /*Initialize the (dummy) input device driver*/
  static lv_indev_drv_t indev_drv;
  lv_indev_drv_init(&indev_drv);
  indev_drv.type = LV_INDEV_TYPE_POINTER;
  indev_drv.read_cb = my_touchpad_read;
  lv_indev_drv_register(&indev_drv);

  setup_ui(&guider_ui);
  events_init(&guider_ui);
  custom_init(&guider_ui);
}

void setup() 
{
  Serial.begin(115200);
  tft.begin();
  tft.setRotation(0);
  tft.fillScreen(TFT_BLACK);

  lvgl_user_init();
}

void loop()
{
  lv_timer_handler(); /* let the GUI do its work */
  delay(5);
}

2.4 烧录测试

运行结果如下,手机拍照有失真,将就着看吧。

结束语

关于使用GUI-Guider工程导入esp32运行就讲到这里,我这里只是简单介绍了一下整个移植的流程,具体的一些细节和问题,还需要根据实际情况处理,有什么问题的欢迎评论区留言。

想了解更多Arduino的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。

Arduino的开发教程汇总:
https://blog.csdn.net/ShenZhen_zixian/article/details/121659482

如果这篇文章能够帮到你,就...你懂得。

相关推荐
Devlive 开源社区1 天前
View Shadcn UI v2025.1.4 发布 - 全面拥抱暗黑模式
ui
招风的黑耳1 天前
Axure设计案例——颜色选择器
ui·axure·颜色选择器
灵感菇_1 天前
Flutter Riverpod 完整教程:从入门到实战
前端·flutter·ui·状态管理
2022.11.7始学前端2 天前
n8n第七节 只提醒重要的待办
前端·javascript·ui·n8n
尤老师FPGA2 天前
使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第四十讲)
ui
成富2 天前
Chat Agent UI,类似 ChatGPT 的聊天界面,Spring AI 应用的测试工具
java·人工智能·spring·ui·chatgpt
小a彤2 天前
Flutter UI 美化与适配技巧详解
flutter·ui
测试人社区—66792 天前
Jenkins持续测试集成
运维·人工智能·学习·flutter·ui·自动化·jenkins
我命由我123452 天前
Photoshop - Photoshop 调整画布大小
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
wonder135792 天前
RectTransform位置计算方法和UI自适应
ui·unity·ugui