ESP32-S3-Touch-LCD移植LVGL+GUI-Guider编辑UI
摘要:本文介绍了使用Visual Studio Code + PlatformIO开发ESP32-S3的LVGL GUI项目,并配合GUI-Guider工具进行UI设计。内容包括开发环境配置、硬件引脚定义、显示驱动初始化、触摸屏设置以及LVGL库的集成。重点讲解了如何将GUI-Guider生成的UI代码移植到ESP32工程中,包括文件目录结构、关键代码添加等步骤,最后展示了按钮控件的事件处理实现效
#LVGL#ESP32-S3#GUI-Guider
通过网盘分享的文件:LVGL
链接: https://pan.baidu.com/s/1tX67F6R2yLFs6zUv4uwsyw 提取码: sqdj
开发需要文件链接如上
1.开发工具
本次项目采用Visual Studio Code+platformIO开发ESP32-S3,其中LVGL的控件开发部分用到GUI-Guider。
2.使用Visual Studio Code+platformIO开发ESP32-S3

打开VS CODE中的platformIO新建一个工程
如图所示创建工程完毕点击finish。
打开工程文件夹,创建一个文件夹存放我们的相关开发文件



如上所示将我们LVGL开发需要的文件按照如上工程路径添加完成。
#include <Arduino.h>
#include <lvgl.h>
#include <Arduino_GFX_Library.h>
#include "bsp_cst816.h"
#define EXAMPLE_PIN_NUM_LCD_SCLK 39
#define EXAMPLE_PIN_NUM_LCD_MOSI 38
#define EXAMPLE_PIN_NUM_LCD_MISO 40
#define EXAMPLE_PIN_NUM_LCD_DC 42
#define EXAMPLE_PIN_NUM_LCD_RST -1
#define EXAMPLE_PIN_NUM_LCD_CS 45
#define EXAMPLE_PIN_NUM_LCD_BL 1
#define EXAMPLE_PIN_NUM_TP_SDA 48
#define EXAMPLE_PIN_NUM_TP_SCL 47
#define LEDC_FREQ 5000
#define LEDC_TIMER_10_BIT 10
#define EXAMPLE_LCD_ROTATION 1
#define EXAMPLE_LCD_H_RES 240
#define EXAMPLE_LCD_V_RES 320
Arduino_DataBus *bus = new Arduino_ESP32SPI(
EXAMPLE_PIN_NUM_LCD_DC /* DC */, EXAMPLE_PIN_NUM_LCD_CS /* CS */,
EXAMPLE_PIN_NUM_LCD_SCLK /* SCK */, EXAMPLE_PIN_NUM_LCD_MOSI /* MOSI */, EXAMPLE_PIN_NUM_LCD_MISO /* MISO */);
Arduino_GFX *gfx = new Arduino_ST7789(
bus, EXAMPLE_PIN_NUM_LCD_RST /* RST */, EXAMPLE_LCD_ROTATION /* rotation */, true /* IPS */,
EXAMPLE_LCD_H_RES /* width */, EXAMPLE_LCD_V_RES /* height */);
/*******************************************************************************
* End of Arduino_GFX setting
******************************************************************************/
/*******************************************************************************
* Please config the touch panel in touch.h
******************************************************************************/
// #include "touch.h"
uint32_t screenWidth;
uint32_t screenHeight;
uint32_t bufSize;
lv_disp_draw_buf_t draw_buf;
lv_color_t *disp_draw_buf;
lv_disp_drv_t disp_drv;
/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) {
lv_disp_flush_ready(disp_drv);
}
/*Read the touchpad*/
void my_touchpad_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
uint16_t touchpad_x;
uint16_t touchpad_y;
bsp_touch_read();
if (bsp_touch_get_coordinates(&touchpad_x, &touchpad_y)) {
data->point.x = touchpad_x;
data->point.y = touchpad_y;
data->state = LV_INDEV_STATE_PRESSED;
} else {
data->state = LV_INDEV_STATE_RELEASED;
}
}
void setup() {
Serial.begin(115200);
Serial.println("Arduino_GFX LVGL_Arduino_v8 example ");
String LVGL_Arduino = String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
Serial.println(LVGL_Arduino);
// Init Display
if (!gfx->begin()) {
Serial.println("gfx->begin() failed!");
}
gfx->fillScreen(BLACK);
#ifdef EXAMPLE_PIN_NUM_LCD_BL
analogWrite(EXAMPLE_PIN_NUM_LCD_BL , LEDC_FREQ);//PWM驱动背光
#endif
// Init touch device
Wire.begin(EXAMPLE_PIN_NUM_TP_SDA, EXAMPLE_PIN_NUM_TP_SCL);
bsp_touch_init(&Wire, gfx->getRotation(), gfx->width(), gfx->height());
// Init lvgl
lv_init();
screenWidth = gfx->width();
screenHeight = gfx->height();
bufSize = screenWidth * screenHeight;
disp_draw_buf = (lv_color_t *)heap_caps_malloc(bufSize * 2, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
if (!disp_draw_buf) {
// remove MALLOC_CAP_INTERNAL flag try again
disp_draw_buf = (lv_color_t *)heap_caps_malloc(bufSize * 2, MALLOC_CAP_8BIT);
}
if (!disp_draw_buf) {
Serial.println("LVGL disp_draw_buf allocate failed!");
} else {
lv_disp_draw_buf_init(&draw_buf, disp_draw_buf, NULL, bufSize);
/* Initialize the display */
lv_disp_drv_init(&disp_drv);
/* Change the following line to your display resolution */
disp_drv.hor_res = screenWidth;
disp_drv.ver_res = screenHeight;
disp_drv.flush_cb = my_disp_flush;
disp_drv.draw_buf = &draw_buf;
disp_drv.direct_mode = true;
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);
}
Serial.println("Setup done");
}
void loop() {
lv_timer_handler(); /* let the GUI do its work */
#if (LV_COLOR_16_SWAP != 0)
gfx->draw16bitBeRGBBitmap(0, 0, (uint16_t *)disp_draw_buf, screenWidth, screenHeight);
#else
gfx->draw16bitRGBBitmap(0, 0, (uint16_t *)disp_draw_buf, screenWidth, screenHeight);
#endif
delay(5);
}
如上所示在main.cpp中添加如上代码,完成上面的设置后我们在Visual Studio上的编辑暂时告一段落。
3.使用GUI-Guider编辑UI
本次将使用1.8.1版的GUI-Guider进行GUI开发。
新建项目

建完工程后点击创建一个按键。

选中控件点击添加事件。

构建点击按键切换按键文本事件。
构建完成后点击运行并生成代码模拟。

如下为仿真结果:
Simulator (C_C++)
工程移植
1.文件导入
在我们的Gui-Guider工程路径下找到生成的工程文件,如下

这里移植需要用到的文件夹只有custom和generated两个。其中custom是用来存放gui工程中我们自定义的一些代码,实际上如果没有自定义代码的话也可以不用,generated则是Gui-Guider工程生成的C代码,我们主要将这部分导入到我们的esp32s3工程中。


添加这两句代码,我们就完成了简单的一格LVGL移植。
实际效果如下
lvgl_ex
更多推荐



所有评论(0)