深圳晶彩智能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> // demos
LGFX 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); // LGFX
tft.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 & set
lv_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