From 70048cf82ba9d9bd25b16d1d33e9b059e78cfba6 Mon Sep 17 00:00:00 2001 From: Levi5 <102035256+levi52@users.noreply.github.com> Date: Fri, 26 Apr 2024 08:57:34 +0800 Subject: [PATCH] Update README.md --- README.md | 513 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 513 insertions(+) diff --git a/README.md b/README.md index eecc5e7..d2ea226 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,515 @@ # ESP32_LVGL_TFT_DEMO 立创ESP32S3N8R8开发板+2.8寸电容触摸屏(ST7789+GT911)+LVGL.v8 + +# 配置 + +> 硬件:立创ESP32S3R8N8开发板 + 2.8寸TFT显示屏(ST7789) + 电容触摸(GT911) +> 软件:Visual Studio Code + PlatformIO + + +# 新建工程 + ++ 点击侧边`PlatformIO`插件,新建工程 + + ++ 依次设置工程名,开发板,框架 + + +# 屏幕测试 + +## 添加TFT_eSPI + ++ 添加屏幕驱动库`TFT_eSPI`,按如下图顺序 + + + ++ 添加TFT_eSPI到工程 + + ++ 打开配置文件,可以看到已成功添加库 + + +## 修改TFT_eSPI + ++ 打开`.pio\libdeps\esp32-s3-devkitc-1\TFT_eSPI\User_Setup.h`文件 + + ++ 根据屏幕驱动芯片解注释 + +```c++ +// Only define one driver, the other ones must be commented out +// #define ILI9341_DRIVER // Generic driver for common displays +//#define ILI9341_2_DRIVER // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172 +//#define ST7735_DRIVER // Define additional parameters below for this display +//#define ILI9163_DRIVER // Define additional parameters below for this display +//#define S6D02A1_DRIVER +//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI +//#define HX8357D_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high) +#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display +//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display +//#define R61581_DRIVER +//#define RM68140_DRIVER +//#define ST7796_DRIVER +//#define SSD1351_DRIVER +//#define SSD1963_480_DRIVER +//#define SSD1963_800_DRIVER +//#define SSD1963_800ALT_DRIVER +//#define ILI9225_DRIVER +//#define GC9A01_DRIVER +``` + ++ 根据屏幕大小设置宽高 + +```c++ +// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation +// #define TFT_WIDTH 80 +// #define TFT_WIDTH 128 +// #define TFT_WIDTH 172 // ST7789 172 x 320 +// #define TFT_WIDTH 170 // ST7789 170 x 320 +#define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 +// #define TFT_HEIGHT 160 +// #define TFT_HEIGHT 128 +// #define TFT_HEIGHT 240 // ST7789 240 x 240 +#define TFT_HEIGHT 320 // ST7789 240 x 320 +// #define TFT_HEIGHT 240 // GC9A01 240 x 240 +``` + ++ 根据连线设置引脚 + +```c++ +// ### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ### +// For ESP32 Dev board (only tested with ILI9341 display) +// The hardware SPI can be mapped to any pins +//#define TFT_MISO 19 +#define TFT_MOSI 17 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 16 // Data Command control pin +//#define TFT_RST 4 // Reset pin (could connect to RST pin) +#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST +``` + +## 修改main.cpp + +在屏幕上从上到下分别显示绿三色,以及白色文字,用来测试屏幕颜色显示是否正常。 + +```c++ +#include +#include +#include // Hardware-specific library +#define TFT_GREY 0x5AEB +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library +void setup() { + tft.init(); + tft.setRotation(0); + tft.fillScreen(TFT_GREY); + tft.setTextColor(TFT_WHITE, TFT_GREY); // Adding a background colour erases previous text automatically + tft.fillRect(0,0,240,50,TFT_RED); + tft.fillRect(0,50,240,50,TFT_GREEN); + tft.fillRect(0,100,240,50,TFT_BLUE); + tft.drawCentreString("Time flies",120,260,4); +} +void loop() { + // put your main code here, to run repeatedly: +} +``` + +## 下载调试 + ++ 编译下载 + + ++ 根据屏幕显示情况修改`User_Setup.h`文件 + +如果颜色反转(白色显示为黑色),如下图所示,则取消下一个注释,尝试两个选项,其中一个选项应该纠正反转。 + + +```c++ +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. +// #define TFT_INVERSION_ON +#define TFT_INVERSION_OFF +``` +修改后,如下图所示,白色正常显示,但是RGB顺序存在问题 + + +仅对于ST7735, ST7789和ILI9341,如果显示器上的蓝色和红色交换,则定义颜色顺序,一次尝试一个选项来找到显示的正确颜色顺序 + +```c++ +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue + #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red +``` +修改后,如下图所示,RGB顺序正常 + + +# LVGL测试 + +## 添加LVGL + ++ 根据实际情况,选择lvgl版本 + + + ++ 添加lvgl到工程 + + +## 修改LVGL + ++ 打开`.pio\libdeps\esp32-s3-devkitc-1\lvgl\lv_conf_template.h`文件 + + 将此文件重命名为`lv_conf.h` + + + ++ 使能lvgl + +```c++ +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ +#ifndef LV_CONF_H +#define LV_CONF_H +``` + ++ 设置周期 + +默认显示刷新周期。LVG将重新绘制改变的区域与这个周期时间 +输入设备读取周期毫秒 + +```c++ +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#define LV_DISP_DEF_REFR_PERIOD 1 /*[ms]*/ +/*Input device read period in milliseconds*/ +#define LV_INDEV_DEF_READ_PERIOD 1 /*[ms]*/ +``` + ++ 心跳使能 + +```c++ +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#define LV_TICK_CUSTOM 1 +#if LV_TICK_CUSTOM +``` + ++ 使能测试案例 + +```c++ +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 1 +#if LV_USE_DEMO_WIDGETS +#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif +``` + ++ 更改文件路径 + + 将`.pio\libdeps\esp32-s3-devkitc-1\lvgl\demos`文件夹移动至`.pio\libdeps\esp32-s3-devkitc-1\lvgl\src\demos` + ++ 修改main.cpp + + 将`.pio\libdeps\esp32-s3-devkitc-1\lvgl\examples\arduino\LVGL_Arduino\LVGL_Arduino.ino`文件内容复制 + + + 设置头文件 + + ```c++ + #include + #include + #include + #include // Hardware-specific library + #include "demos/lv_demos.h" + ``` + + + 设置宽高 + + ```c++ + static const uint16_t screenWidth = 320; + static const uint16_t screenHeight = 240; + ``` + + + 修改类型 + + `lv_disp_t`修改为`lv_disp_drv_t` + + `lv_indev_t`修改为`lv_indev_drv_t` + + + 注释掉触摸部分 + + +## 修改完成 + +最终`main.cpp`文件内容如下 +```c++ +#include +#include +#include +#include // Hardware-specific library +#include "demos/lv_demos.h" +/*Change to your screen resolution*/ +static const uint16_t screenWidth = 320; +static const uint16_t screenHeight = 240; +static lv_disp_draw_buf_t draw_buf; +static lv_color_t buf[ screenWidth * 10 ]; +TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */ +/* Display flushing */ +void my_disp_flush( lv_disp_drv_t *disp, 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 ); +} +/*Read the touchpad*/ +// void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data ) +// { +// uint16_t touchX, touchY; +// bool touched = tft.getTouch( &touchX, &touchY, 600 ); +// if( !touched ) +// { +// data->state = LV_INDEV_STATE_REL; +// } +// else +// { +// data->state = LV_INDEV_STATE_PR; +// /*Set the coordinates*/ +// data->point.x = touchX; +// data->point.y = touchY; +// Serial.print( "Data x " ); +// Serial.println( touchX ); +// Serial.print( "Data y " ); +// Serial.println( touchY ); +// } +// } +void setup() +{ + Serial.begin( 115200 ); /* prepare for possible serial debug */ + String LVGL_Arduino = "Hello Arduino! "; + LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch(); + Serial.println( LVGL_Arduino ); + Serial.println( "I am LVGL_Arduino" ); + lv_init(); + tft.begin(); /* TFT init */ + tft.setRotation( 3 ); /* Landscape orientation, flipped */ + /*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_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 ); + /*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 = screenWidth; + disp_drv.ver_res = screenHeight; + disp_drv.flush_cb = my_disp_flush; + 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 ); +#if 0 + /* Create simple label */ + lv_obj_t *label = lv_label_create( lv_scr_act() ); + lv_label_set_text( label, LVGL_Arduino.c_str() ); + lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 ); +#else + lv_demo_widgets(); // OK +#endif + Serial.println( "Setup done" ); +} +void loop() +{ + lv_timer_handler(); /* let the GUI do its work */ + delay( 5 ); +} +``` +## 编译下载 +显示效果如下图 + + +# 触摸测试 + +## 添加`bb_captouch` + + + +## 修改`main.cpp` + ++ 添加头文件 + + ```c++ + #include + ``` + ++ 设置触摸芯片引脚 + + ```c++ + // These defines are for a low cost ESP32 LCD board with the GT911 touch controller + #define TOUCH_SDA 4 + #define TOUCH_SCL 2 + #define TOUCH_INT 3 + #define TOUCH_RST 1 + ``` + ++ 设置参数 + + ```c++ + BBCapTouch bbct; + const char *szNames[] = {"Unknown", "FT6x36", "GT911", "CST820"}; + ``` + ++ 初始化 + + ```c++ + bbct.init(TOUCH_SDA, TOUCH_SCL, TOUCH_RST, TOUCH_INT); + ``` + ++ 修改`my_touchpad_read`函数 + + 这里的x,y坐标需要根据实际情况修改 + + + + ```c++ + /*Read the touchpad*/ + void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data ) + { + TOUCHINFO ti; + if(bbct.getSamples(&ti)) + { + data->state = LV_INDEV_STATE_PR; + /*Set the coordinates*/ + data->point.x = screenWidth - ti.y[0]; + data->point.y = ti.x[0]; + Serial.print( "Data x " ); + Serial.println( screenWidth - ti.y[0] ); + Serial.print( "Data y " ); + Serial.println( ti.x[0] ); + } + else + { + data->state = LV_INDEV_STATE_REL; + } + } + ``` + +## 修改完成 + +最终`main.cpp`文件内容如下 +```c++ +#include +#include +#include +#include // Hardware-specific library +#include "demos/lv_demos.h" +#include +// These defines are for a low cost ESP32 LCD board with the GT911 touch controller +#define TOUCH_SDA 4 +#define TOUCH_SCL 2 +#define TOUCH_INT 3 +#define TOUCH_RST 1 +BBCapTouch bbct; +const char *szNames[] = {"Unknown", "FT6x36", "GT911", "CST820"}; +/*Change to your screen resolution*/ +static const uint16_t screenWidth = 320; +static const uint16_t screenHeight = 240; +static lv_disp_draw_buf_t draw_buf; +static lv_color_t buf[ screenWidth * 10 ]; +TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */ +/* Display flushing */ +void my_disp_flush( lv_disp_drv_t *disp, 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 ); +} +/*Read the touchpad*/ +void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data ) +{ + // uint16_t touchX, touchY; + TOUCHINFO ti; + if(bbct.getSamples(&ti)) + { + data->state = LV_INDEV_STATE_PR; + /*Set the coordinates*/ + data->point.x = screenWidth - ti.y[0]; + data->point.y = ti.x[0]; + Serial.print( "Data x " ); + Serial.println( screenWidth - ti.y[0] ); + Serial.print( "Data y " ); + Serial.println( ti.x[0] ); + } + else + { + data->state = LV_INDEV_STATE_REL; + } +} +void setup() +{ + Serial.begin( 115200 ); /* prepare for possible serial debug */ + String LVGL_Arduino = "Hello Arduino! "; + LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch(); + Serial.println( LVGL_Arduino ); + Serial.println( "I am LVGL_Arduino" ); + lv_init(); + tft.begin(); /* TFT init */ + tft.setRotation( 3 ); /* Landscape orientation, flipped */ + bbct.init(TOUCH_SDA, TOUCH_SCL, TOUCH_RST, TOUCH_INT); + int iType = bbct.sensorType(); + Serial.printf("Sensor type = %s\n", szNames[iType]); + lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 ); + /*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 = screenWidth; + disp_drv.ver_res = screenHeight; + disp_drv.flush_cb = my_disp_flush; + 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 ); +#if 0 + /* Create simple label */ + lv_obj_t *label = lv_label_create( lv_scr_act() ); + lv_label_set_text( label, LVGL_Arduino.c_str() ); + lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 ); +#else + // uncomment one of these demos + lv_demo_widgets(); // OK +#endif + Serial.println( "Setup done" ); +} +void loop() +{ + lv_timer_handler(); /* let the GUI do its work */ + delay( 5 ); +} +``` + +## 编译下载 +触摸显示效果如下图所示 + + +# END + +
2024 Hi1L