深圳晶彩智能ESP32-2432S028R实时观察LVGL9效果

server/2024/9/23 4:09:56/

深圳晶彩智能ESP32-2432S028R概述:

深圳晶彩智能出品ESP32-32432S028R为2.8寸彩色屏采用分辨率320x240彩色液晶屏,驱动芯片是ILI9431。板载乐鑫公司出品ESP-WROOM-32,Flash 4M。型号尾部“R”标识电阻膜的感压式触摸屏,驱动芯片是XPT2046。
他的屏幕驱动芯片ILI9431和电阻触碰芯片XPT2046没有采用共用SPI的接法,就不能直接使用TFT_eSPI库驱动,电阻触碰芯片采用第三方XPT2046_Touchscreen库。
这款产品发布后,由于其制作精良价格优惠,受到了国际玩家的普遍追捧,各位大虾称其为“Cheap Yellow Display”,简称CYD。
在这里插入图片描述
这是一个能干活的开发板,用于为您的物联网项目构建彩色显示屏,带有TFT屏幕的单独ESP32板更方便和实用,明显越升二次开发产品的格调。

在这里插入图片描述

完美得到LVGL9和lovyanGFX库支持

LVGL是最流行的免费和开源嵌入式图形库,可为任何MCU, MPU和显示类型创建漂亮的ui。
从消费电子产品到工业自动化,任何应用程序都可以利用LVGL的30多个内置小部件,100多个样式属性,web启发的布局和支持多种语言的排版系统。
LovyanGFX 是一个高效且功能丰富的图形库,专为连接到ESP32、ESP8266和ATSAMD51的显示器设计。它兼容多种通讯协议,如SPI、I2C和8位并行接口,适用于各种LCD、OLED和EPD显示屏。这个库不仅提供了与流行的AdafruitGFX和TFT_eSPI类似的功能,而且在速度和特性上有了显著提升,让开发变得更加便捷。
LGFX_AUTODETECT类中自动识别多款“Cheap Yellow Display”,其中就包括ESP32-2432S028R,本示例就结合这两个库,使用Arduino IDE的方法,用最快捷的方法让各位玩家来适配LVGL9,直接在液晶屏上操作各种组建,把构想变成实景图。

Arduino IDE SDK和LVGL9,LovyanGFX的版本

Arduino IDE SDK 3.0.2版本
在这里插入图片描述
lvgl 9.1.0版本
在这里插入图片描述
LovyanGFX 1.1.16版本
在这里插入图片描述

配置LVGL9库

1,修改 lv_conf.h

LVGL 有一个名为 lv_conf.h 的配置文件。当安装 LVGL 时,请遵循以下配置步骤:
进入已安装的 Arduino 库目录。
进入 lvgl 并复制 lv_conf_template.h 到Arduino 库目录中,该文件应位于 lvgl 库同级文件夹。然后重命名为 lv_conf.h 。
下图可见 lv_conf.h 的布局:
在这里插入图片描述
用Notepad++对 lv_conf.h 修改:
默认设置是“0”,设置为“1”以启用内容。

第15行 #if 1 

如果lvgl设置在屏幕上显示当前帧率(FPS):

第751行 #define LV_USE_SYSMON   1
第764行 #define LV_USE_PERF_MONITOR 1

在这里插入图片描述
本示例全面演示LVGL9的examples,widgets和demos,需要分别置1启用。譬如允许 examples构建示例:

第929行 #define LV_BUILD_EXAMPLES 1

2,移动examples和demos库的位置。
将Arduino\libraries\lvgl里的examples和demos库拖曳到src文件夹里面:
在这里插入图片描述
3,修改lv_examples.h
用Notepad++对C:\Users\用户名\Documents\Arduino\libraries\lvgl\src\examples\lv_examples.h修改为:

第16行 #include "lvgl.h"

用Notepad++对C:\Users\用户名\Documents\Arduino\libraries\lvgl\src\demos\lv_demos.h修改为:

第16行 #include "lvgl.h"

用最简单的程序展示LVGL9的绚丽功能

#include <SPI.h>                                      // SPI Library
#include <lvgl.h>                                     // LVGL9
#define LGFX_AUTODETECT
#include <LovyanGFX.hpp>static const uint32_t screenWidth = 320;                   // LCD宽度
static const uint32_t screenHeight = 240;                  // LCD高度
static uint8_t draw_buf[screenWidth * screenHeight / 10];  // 缓冲器
static ulong lvgl_tick_millis = millis();                  // tick#include <examples\lv_examples.h>                 // examples
//#include <examples\widgets\lv_example_widgets.h>  // widgets
//#include <demos\lv_demos.h>                       // demosLGFX tft;void init_display() {static lv_display_t *disp;disp = lv_display_create(screenWidth, screenHeight);lv_display_set_flush_cb(disp, flush);lv_display_set_buffers(disp, draw_buf, NULL, sizeof(draw_buf),LV_DISPLAY_RENDER_MODE_PARTIAL);
}void flush(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map) {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 *)px_map, w * h, true);tft.writePixelsDMA((lgfx::rgb565_t *)px_map, w * h);  // LGFXtft.endWrite();lv_display_flush_ready(disp);
}void init_touch() {lv_indev_t *indev = lv_indev_create();lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);  lv_indev_set_read_cb(indev, my_touchpad_read);
}void my_touchpad_read(lv_indev_t *indev, lv_indev_data_t *data) {uint16_t touchX, touchY;bool touched = tft.getTouch(&touchX, &touchY);if (!touched) {data->state = LV_INDEV_STATE_REL;return;}if (touchX < screenWidth && touchY < screenWidth) {data->state = LV_INDEV_STATE_PR;data->point.x = touchX;data->point.y = touchY;   }
}void setup() {tft.begin();tft.setRotation(1);tft.fillScreen(TFT_BLUE);lv_init();       // lvgl 初始化init_display();  // 显示和缓冲初始化init_touch();    // 触碰初始化// demos ------------------------------------------------------------//lv_demo_widgets();          // 34% memory used//lv_demo_benchmark();        // 38% memory used//lv_demo_keypad_encoder();   // 24% memory used//lv_demo_music();            // 56% memory used//get_started -------------------------------------------------------//lv_example_get_started_3(); // 2 button//lv_example_get_started_1(); // Hello World//lv_example_get_started_2(); // button couter//lv_example_get_started_4(); // Slider//others ------------------------------------------------------------//lv_example_observer_1();    // Slider//lv_example_observer_2();    // logged out//lv_example_observer_3();    // time & setlv_example_observer_4();    // Slider & Button//lv_example_observer_5();    // update//lv_example_observer_6();    // 10 button//widgets -----------------------------------------------------------//lv_example_image_3();//lv_example_animimg_1();//lv_example_arc_1();//lv_example_arc_2();//lv_example_bar_1();//lv_example_bar_2();//lv_example_bar_3();//lv_example_bar_4();//lv_example_bar_5();//lv_example_bar_6();//lv_example_bar_7();//lv_example_button_1();//lv_example_button_2();  // 24% memory used//lv_example_button_3();//lv_example_buttonmatrix_1();//lv_example_buttonmatrix_2();//lv_example_buttonmatrix_3();//lv_example_calendar_1();//lv_example_canvas_1 fail//lv_example_canvas_2();//lv_example_canvas_3();//lv_example_canvas_4();//lv_example_canvas_5();//lv_example_canvas_6();//lv_example_canvas_7();//lv_example_canvas_8 fail//lv_example_chart_1();//lv_example_chart_2();//lv_example_chart_3();//lv_example_chart_4();//lv_example_chart_5();//lv_example_chart_6();//lv_example_chart_7();//lv_example_chart_8();//lv_example_checkbox_1();//lv_example_checkbox_2();//lv_example_dropdown_1();//lv_example_dropdown_2();//lv_example_dropdown_3();//lv_example_image_1();//lv_example_image_2();//lv_example_image_4();//lv_example_imagebutton_1_fail//lv_example_keyboard_1();//lv_example_keyboard_2();//lv_example_label_1();//lv_example_label_2();//lv_example_label_3 fail//lv_example_label_4 fail//lv_example_label_5();//lv_example_led_1//lv_example_line_1//lv_example_menu_1//lv_example_menu_2//lv_example_menu_3//lv_example_menu_4//lv_example_menu_5//lv_example_msgbox_1//lv_example_obj_1//lv_example_obj_2//lv_example_roller_1//lv_example_roller_2 fail//lv_example_roller_3 fail//lv_example_scale_1();//lv_example_scale_2();//lv_example_scale_3();//lv_example_scale_4();//lv_example_scale_5();//lv_example_slider_1();//lv_example_slider_2();//lv_example_slider_3();//lv_example_slider_4();//lv_example_span_1();//lv_example_spinbox_1();//lv_example_spinner_1();//lv_example_switch_1();//lv_example_table_1();//lv_example_table_2();//lv_example_tabview_1();//lv_example_tabview_2();//lv_example_textarea_1();//lv_example_textarea_2();//lv_example_textarea_3();//lv_example_tileview_1();//lv_example_tileview_2 fail//lv_example_win_1();  
}void loop() {lv_task_handler();unsigned long tick_millis = millis() - lvgl_tick_millis;lvgl_tick_millis = millis();lv_tick_inc(tick_millis);yield();delay(5);
}

多选下拉列表效果展示:

【深圳晶彩智能ESP32-2432S028R实时观察LVGL9效果】
https://www.bilibili.com/video/BV1tTa3eSExr?vd_source=7350ed30aaee73c2cb1cac26a00a8b30


http://www.ppmy.cn/server/55789.html

相关文章

[FreeRTOS 功能应用] 事件组 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 事件组 概念 [FreeRTOS 内部实现] 事件组 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;事件组实战操作。(当task1和task2同时完成&#xff0c;才执行ta…

【数据分享】全国乡村旅游重点镇(乡)数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据&#xff08;可查看之前发布的文章&#xff09;&#xff01;文化和旅游部官网上也分享有很多与旅游相关的常用数据&#xff0c;我们基于官网发布的名单文件整理得到全国乡村…

基于SpringBoot+Vue的招生管理系统(带1w+文档)

基于SpringBootVue的招生管理系统(带1w文档&#xff09; 通过招生管理系统的研究可以更好地理解系统开发的意义&#xff0c;而且也有利于发展更多的智能系统&#xff0c;解决了人才的供给和需求的平衡问题&#xff0c;招生管理系统的开发建设&#xff0c;由于其开发周期短&…

Kafka 进阶指南

Kafka 进阶指南 引言 在掌握了 Kafka 的基本概念和操作后&#xff0c;我们可以进一步探索 Kafka 的高级特性和使用技巧&#xff0c;以提高其性能、可扩展性和可靠性。本指南将介绍 Kafka 的进阶主题&#xff0c;包括性能调优、扩展策略、数据复制、日志压缩、流处理和安全性。…

价格预言机的使用总结(一):Chainlink篇

文章首发于公众号&#xff1a;Keegan小钢 前言 价格预言机已经成为了 DeFi 中不可获取的基础设施&#xff0c;很多 DeFi 应用都需要从价格预言机来获取稳定可信的价格数据&#xff0c;包括借贷协议 Compound、AAVE、Liquity &#xff0c;也包括衍生品交易所 dYdX、PERP 等等。…

从零开始读RocketMq源码(一)生产者启动

目录 前言 获取源码 总概论 生产者实例 源码 A-01:设置生产者组名称 A-02:生产者服务启动 B-01&#xff1a;初始化状态 B-02&#xff1a;该方法再次对生产者组名称进行校验 B-03&#xff1a;判断是否为默认生产者组名称 B-04: 该方法是为了实例化MQClientInstance对…

elementPlus自定义el-select下拉样式

如何在f12元素选择器上找到下拉div呢&#xff1f; 给el-select添加 :popper-append-to-body"false" 即可&#xff0c;这样就可以将下拉框添加到body元素中去&#xff0c;否则当我们失去焦点&#xff0c;下拉就消失了&#xff0c;在元素中找不到el-select。剩下就可以…

c++11新特性-8-初始化列表

文章目录 初始化列表1.统一初始化2. std::initializer_list 初始化列表 1.统一初始化 //初始化整型 int a{12};//初始化数组 int a[] {1,2,3,4}; int a[] {1,2,3,4};//初始化指针 int* p new int{10}; double* p new double(1.23); int* arry new int[3]{1,2,3};2. std::i…