ESP32 ESP-IDF LVGL ST7789 演示lv_demo_music

陈拓 2022/09/10-2022/09/11

1. 开发环境

  • 开发环境搭建

见《Ubuntu构建ESP32 ESP-IDF开发环境》

https://blog.youkuaiyun.com/chentuo2000/article/details/126777261?spm=1001.2014.3001.5502

  • 版本

2. 开发板和显示屏

2.1 ESP32开发板

市面上最常见的esp32开发板。

2.2 TFT LCD显示屏

2.4寸240*320 TFT LCD液晶显示屏幕ST7789驱动SPI 4线串口。

3. ESP32 LVGL下载移植

见《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示》

https://blog.youkuaiyun.com/chentuo2000/article/details/126668088?spm=1001.2014.3001.5502

4. 用VSCode打开项目

见《在VSCode中打开远程主机上的ESP-IDF项目》

https://blog.youkuaiyun.com/chentuo2000/article/details/126794177?spm=1001.2014.3001.5502

查看版本:

~/esp/lv_port_esp32/README.md

- Version of LVGL used: 7.9.

- Version of lv_examples used: 7.9.

5. 构建项目

  • 进入lv_port_esp32目录
  • cd ~/esp/lv_port_esp32/
  • 刷新esp-idf环境

get_idf

  • 设定目标芯片

idf.py set-target esp32

  • 配置项目

idf.py menuconfig

1) 将闪存设置为4MB

2) 选择显示屏控制芯片

3) SPI总线选择

默认是HSPI。有关ESP32 SPI的说明见《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示》

https://blog.youkuaiyun.com/chentuo2000/article/details/126668088?spm=1001.2014.3001.5502

LCD没有使用MISO,所以接线空着。

4) 定义引脚

接线表:

LCD ST7789      ESP32

GND                   GND

VCC                    3V3

SCL                     IO14(CLK)

SDA                     IO13(MOSI)

RES                     IO17

DC                       IO16(DC)

CS                       IO18

BLK                     IO27

5) 使能Set IRAM as LV_ATTRIBUTE_FAST_MEM提高帧率

6) 屏幕方向

竖屏

 横屏

注意:横竖屏转换时两个选项要同时修改。我们使用横屏。

7) 对于SPI接口需要交换RGB565的2个字节

8) 平滑线和园,更好的显示效果

9) 设置时钟频率

10) 设置显示字体

默认都是16。

11) 启用亚像素渲染

更好的显示效果,增加计算量,会降低帧率。

12) 显示资源使用情况

你可以选择Show CPU and FPS count in the right bottom corner

在屏幕的右下角显示CUP和的占用和动画帧率。

13) 是否自动滑动演示

默认时启用以动画方式自动滑动演示。

保存,退出。

  • 编译项目

idf.py build

编译速度比WSL快多了。

  • 烧写项目

查看USB转串口的设备:

修改/dev/ttyUSB0设备权限:

sudo chmod 777 /dev/ttyUSB0

烧写:

idf.py -p /dev/ttyUSB0 -b 115200 flash

  • 启用监视器

idf.py monitor -p /dev/ttyUSB0

当示例正常运行时,将观察到以下输出:

6. 演示

6.1 默认DEMO(控件演示

6.2 反转颜色(黑底)

6.3 定制demo中可展示的元素

6.4 选择其他的DEMO

项目中4Demo,通过配置选择使用哪一个。

  • Show demo widgets控件演示。
  • Demonstrate the usage of encoder and keyboard触摸屏和拖拽控件演示。
  • Benchmark your system测试系统性能
  • Stress test for LVGL压力测试

7. 演示lv_demo_music

  • 更多例子

在~/esp/lv_port_esp32/components/lv_examples/lv_examples/src/目录下还有几个更炫的例子:

对比~/esp/lv_port_esp32/main/main.c

可知,默认只启用了4个例程。下面我们启用lv_demo_music

  • 在main.c中添加头文件lv_demo_music.h

  • 在main.c的create_demo_application函数中添加lv_demo_music();

  • 在/home/ccdc/esp/lv_port_esp32/components/lv_examples/lv_ex_conf.h中添加对Music选项定义

  • ~/esp/lv_port_esp32/components/lv_examples/Kconfig中添加Music选项

  • 配置

例子选项中多了Music demo for LVGL,选择它:

配置Music要使用的字体

  • 编译、烧写、运行

其他扩展例子仿照上面的方法就可以演示。

参考文档

  1. esp32-lvgl-(st7789/ILI9341)(基于esp-idf框架)

https://blog.youkuaiyun.com/qq_37429313/article/details/122085869

<think>我们正在使用ESP32-S3平台,结合ESP-IDFLVGL库来实现一个功能:创建一个文本区域(lv_textarea),当用户点击该文本区域时,自动弹出键盘(lv_keyboard)并允许用户输入内容。 根据之前的引用[1]和[2],我们知道用户已经成功配置了LVGL的中文字体,并且使用了TFT_eSPI库来驱动ILI9488显示屏。因此,我们假设LVGL已经成功移植到ESP32-S3上。 实现步骤: 1. 创建文本区域对象(lv_textarea) 2. 创建键盘对象(lv_keyboard) 3. 默认将键盘隐藏 4. 为文本区域添加事件回调函数,当文本区域被点击时,显示键盘并将键盘与文本区域关联 5. 键盘的事件处理:当用户按下键盘的关闭按钮时,隐藏键盘;当用户输入时,文本区域的内容相应更新。 注意:在LVGL中,键盘对象通常需要设置模式(例如,LV_KEYBOARD_MODE_TEXT_LOWER)和文本区域关联(使用lv_keyboard_set_textarea)。 具体代码实现如下(假设已经初始化了LVGL并创建了屏幕对象):</think>### ESP32-S3 + LVGL 实现文本区域点击弹出键盘输入 以下是基于 ESP-IDFLVGL 9.x 实现点击文本区域弹出键盘的完整解决方案: #### 1. **核心实现步骤** ```c // 创建文本区域 lv_obj_t *textarea = lv_textarea_create(lv_scr_act()); lv_textarea_set_one_line(textarea, true); // 单行模式 lv_obj_set_pos(textarea, 20, 20); lv_obj_set_size(textarea, 200, 40); // 创建键盘并隐藏 lv_obj_t *kb = lv_keyboard_create(lv_scr_act()); lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); // 初始隐藏 lv_keyboard_set_textarea(kb, textarea); // 关联文本区域 // 事件回调函数 static void ta_event_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t *ta = lv_event_get_target(e); if(code == LV_EVENT_CLICKED) { // 点击时显示键盘 lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN); lv_obj_move_foreground(kb); // 置顶显示 } else if(code == LV_EVENT_READY) { // 按下回车键隐藏键盘 lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); } } // 绑定事件 lv_obj_add_event_cb(textarea, ta_event_cb, LV_EVENT_ALL, NULL); ``` #### 2. **中文字体支持** 在 `lv_conf.h` 中配置中文字体(参考引用[1]): ```c #define LV_FONT_DEFAULT &my_font_simhei_16 // 默认字体 lv_font_t *my_font_simhei_16 = ...; // 初始化字体 ``` #### 3. **显示驱动配置** 在 `User_Setup.h` 中正确配置 ILI9488(参考引用[2]): ```c #define TFT_DRIVER ILI9488 #define TFT_WIDTH 480 #define TFT_HEIGHT 320 #define TFT_MOSI 11 // GPIO引脚号 #define TFT_SCLK 12 #define TFT_CS 10 ``` #### 4. **输入设备配置** 在 `lv_port_indev.c` 中启用触摸输入: ```c void lv_port_indev_init(void) { static lv_indev_t *indev_touchpad; lv_indev_drv_t indev_drv; lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = touchpad_read; // 实现触摸读取函数 indev_touchpad = lv_indev_drv_register(&indev_drv); } ``` #### 5. **优化建议** 1. **键盘布局定制**: ```c static const char *kb_map[] = { "1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "\n", "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", "\n", "拼音", "z", "x", "c", "v", "b", "n", "m", LV_SYMBOL_BACKSPACE, "\n", LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" }; lv_keyboard_set_map(kb, LV_KEYBOARD_MODE_TEXT_LOWER, kb_map); ``` 2. **焦点管理**: ```c lv_group_t *g = lv_group_create(); lv_group_add_obj(g, textarea); lv_indev_set_group(indev_touchpad, g); // 关联输入设备 ``` 3. **内存优化**: ```c lv_obj_set_style_text_font(textarea, &my_font_simhei_16, 0); lv_obj_set_style_bg_opa(kb, LV_OPA_70, 0); // 半透明背景 ``` #### 6. **常见问题解决** - **键盘不显示**: 1. 检查 `lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN)` 是否执行 2. 确认键盘未在屏幕外 `lv_obj_set_pos(kb, 0, 200)` - **中文乱码**: 1. 确保字体包含中文字符集 2. 在 `menuconfig` 中启用 UTF-8 支持: ``` Component config → LVGL → Enable UTF-8 support ``` - **触摸无响应**: 1. 检查 `touchpad_read()` 是否返回正确坐标 2. 校准触摸屏: ```c touch_calibration_t cal = { .x0=50, .y0=60, .x1=450, .y1=300 }; touch_set_calibration(&cal); ``` #### 完整示例项目结构: ``` esp32_lvgl_keyboard/ ├── main/ │ ├── app_main.c # 主逻辑 │ ├── lvgl_helpers.c # 显示/输入初始化 │ └── fonts/ # 字体目录 ├── components/ │ └── lvgl/ # LVGL库 └── CMakeLists.txt ``` [^1]: ESP32-S3驱动ILI9488显示屏中文显示实现 [^2]: LVGL移植ESP32详细步骤
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晨之清风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值