软硬件
硬件
- ESP32C3
- ST7735的0.96寸彩屏 分辨率160*80
软件
- PlatformIO 以下简称pio
- Arduino rc2.x
- TFT_eSPI
- LVGL8.2
适配
屏幕驱动
- 采用TFT_eSPI
- 具体过程见本博客另一篇文章
- 《记一次ESP32C3基于tft_espi库驱动st7735的0.96寸彩屏》
LVGL
- 下载LVGL
- 丢到pio项目文件夹中的lib文件夹中
- 复制一份lvgl文件夹中的
lv_conf_template.h
到pio项目文件夹的lib文件夹中,并命名为lv_conf.h
- 修改
#if 0 /*Set it to "1" to enable content*/
为#if 1
- 修改
`#define LV_MEM_CUSTOM 0
为1 - 修改
#define LV_TICK_CUSTOM 0
为1 - 修改
#define LV_USE_LOG 0
为1 - 修改
#define LV_LOG_PRINTF 0
为1 - 保存
Demo
运行效果图
代码
#include "Arduino.h"
#include <lvgl.h>
#include <TFT_eSPI.h>
/*Change to your screen resolution*/
static const uint16_t screenWidth = 160;
static const uint16_t screenHeight = 80;
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 );
}
void setup()
{
Serial.begin( 9600 ); /* 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 */
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 );
#if 1
/* 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, -30 );
lv_obj_t *label2 = lv_label_create( lv_scr_act() );
lv_label_set_text( label2, "lable2 lable2 lable2" );
lv_obj_align( label2, LV_ALIGN_CENTER, 0, -15 );
#else
/* Try an example from the lv_examples Arduino library
make sure to include it as written above.
lv_example_btn_1();
*/
// uncomment one of these demos
lv_demo_widgets(); // OK
// lv_demo_benchmark(); // OK
// lv_demo_keypad_encoder(); // works, but I haven't an encoder
// lv_demo_music(); // NOK
// lv_demo_printer();
// lv_demo_stress(); // seems to be OK
#endif
Serial.println( "Setup done" );
pinMode(0,OUTPUT);
digitalWrite(0,HIGH);
}
void loop()
{
lv_timer_handler(); /* let the GUI do its work */
delay( 5 );
}