单片机/MCU论坛
直播中

HonestQiao

8年用户 520经验值
擅长:嵌入式技术
私信 关注

【FireBeetle 2 ESP32-S3开发板体验】基于GDI接口的高清IPS屏的LVGL使用(方法通用所有支持接口的屏)

显示效果

这次的FireBeetle 2 ESP32-S3开发板不仅提供了CAM(Camera)接口,还提供了GDI接口:
FireBeetle 2 ESP32-S3

一、GDI接口和显示屏了解

这个GDI接口,是为DFRbot专用GDI显示屏准备的接口,使用18pin-FPC线连接屏幕,连接屏幕更加便捷。

像下面这样类似摄像头,使用FPC连接即可:
image.png

GDI显示屏的连接:

GDI

我手头刚好有一个DFRobot的GDI接口显示屏:
productImage

官方介绍如下:

这是一款1.47英寸,分辨率为172×320的彩色高清IPS显示屏 。采用驱动芯片ST7789V3、SPI通讯接口,显示屏显示区域占比大,边框宽度仅 1mm,圆弧边角,外形小巧美观,显示效果精细、清晰,还原真实色彩。显示屏上可高清显示各种文字、图像、动画、甚至是视频,基于 Arduino 的图像显示 GDL 库和 LVGL 库,可以做出酷炫的动态效果,适合DIY电子项目。可广泛应用于迷你游戏机、迷你气象站、背包挂件、迷你时钟、迷你视频播放、礼物制作、小型仪表显示等场景。

FireBeetle 2 ESP32-S3开发板 的GDI 接口具体定义如下:

image.png

这个接口,可以专用于GDI接口的显示屏,也可以用一个FPC转接板,当作普通引脚使用:
image.png

在Arduino开发环境中,DFRobot为GDI接口的显示屏,提供了 DFRobot_GDL库 专门用于屏幕显示操作。

不过,我更想使用更为通用的LVGL,而且LVGL官方也为Arduino开发环境提供了良好的支持。

二、LVGl环境的扩展库支持

在 FireBeetle 2 ESP32-S3开发板 的Arduino开发环境中,要支持LVGL,需要使用如下的Arduino扩展库:
image.png

image.png

使用上述的 TFT_eSPI 本身已经可以驱动通常的SPI显示屏,是一款较为常用的显示屏支持库。而LVGL是基于TFT_eSPI,来提供运行支持的。

需要注意的是,不要安装上面显示出来的lv_arduino,这个太老了,早已不在提供支持。

安装上述库的时候,如果提示还要安装其他依赖库,选择一并安装即可。

三、TFT_eSPI配置

在Arduino中充分利用FireBeetle 2 ESP32-S3的16MB Flash做SPIFFS 一文中,曾将详细说过Arduino IDE安装后的相关目录。

TFT_eSPI扩展库安装后,其安装文件为与 扩展库目录下,如:
image.png

上述目录中,User_Setup_Select.h头文件控制调用哪个配置文件,User_Setups目录中则包含已经做好预配的多种配置文件。

一般对于自己的显示屏,先找找看有没有类似的配置文件,如果有的话,再检查GPIO配置是否一致,如果一致可直接使用,否则可以复制一个,修改为实际使用的。

参考Setup72_ESP32_ST7789_172x320.h,复制为 Setup72_ESP32_ST7789_172x320_GDI.h,参考前面的FireBeetle 2 ESP32-S3开发板的GDI说明,修改对应的GPIO配置:
image.png

然后,在Arduino IDE的示例菜单中,选择如下的Demo进行测试:
image.png

实测效果如下:

现在,TFT_eSPI已将配置好了,显示屏可以正常使用了。

不过,咱们继续,一鼓作气,把LVGL给整上。

四、LVGL配置

LVGL的配置文件只需要一个lv_conf.h,可以从 如下目录,将lvgl/lv_conf_template.h 拷贝出来改名为lc_conf.h即可,具体如下:
image.png

其他先不用做任何修改,然后再从示例中打开示例代码 LVGL_Arduino.ino:
image.png

修改设置对应的屏幕尺寸:

static const uint16_t screenWidth  = 172;
static const uint16_t screenHeight = 320;

修改旋转方向:

tft.setRotation( 0 );

修改显示的文字:【只能为英文字符,后续再分享中文字体的】

lv_label_set_text( label, "Hello Ardino and LVGL!");

再去掉关于touch的部分:

/*Read the touchpad*/
void my_touchpad_read( lv_indev_drv_t * indev_drv, 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 );
    }
}

去掉:

uint16_t calData[5] = { 275, 3620, 264, 3532, 1 };
    tft.setTouch( calData );

去掉:

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 );

处理完成后,编译下载运行,具体结果如下:
image.png

好了,现在已经能够正常运行LVGL了,可以开始LVGL的学习使用了。

五、LVGL演示的运行

LVGL本身提供了很多演示示例,可以在Arduino+FireBeetle 2 ESP32-S3开发板上运行。

要运行示例,配置文件lc_conf.h,需要参考做如下的修改:
image.png

上图左边为配置模版lvgl/lv_conf_template.h,右边为实际使用的配置文件lc_conf.h

然后,按照下图,将对应的demos和examples目录,拷贝到lvgl下的src目录中:
image.png

其中:

  • examples:为各项功能的分项展示
  • demos:一个具体的项目展示

再修改LVGL_Arduino.ino,添加demo和examples头文件的调用

#include <lvgl.h>
#include "demos/lv_demos.h"
#include "examples/lv_examples.h"
#include <TFT_eSPI.h>

要调用examples中的示例,可以先查看页面,获取对应的示例入口:

LVGL官方examples页面: Examples — LVGL documentation
image.png

然后在代码中,如下的位置,添加example入口 lv_example_get_started_1(),具体如下:

/* Try an example. See all the examples
     online: https://docs.lvgl.io/master/examples.html
     source codes: https://github.com/lvgl/lvgl/tree/e7f88efa5853128bf871dde335c0ca8da9eb7731/examples */
  Serial.println( "lv_example:" );
  //lv_example_btn_1();
  lv_example_get_started_1();

  /*Or try out a demo. Don't forget to enable the demos in lv_conf.h. E.g. LV_USE_DEMOS_WIDGETS*/
  // Serial.println( "lv_demo:" );
  // lv_demo_widgets();
  // lv_demo_benchmark();
  // lv_demo_keypad_encoder();
  // lv_demo_music();
  // lv_demo_printer();
  // lv_demo_stress();

编译下载运行,结果如下:
image.png

屏幕上运行结果,和官方在线Examples页面展示一致。

同时,右下角还显示了当前的FPS和CPU占用率。这可以通过lc_conf.h的LV_USE_PERF_MONITOR来控制是否呈现。

要调用demos,可以先查看LVGL官方的demos介绍:lvgl/demos at master · lvgl/lvgl (github.com)

然后,修改代码,打开对应的demo入口。
image.png

上述demo的入口为 lv_demo_widgets():

/* Try an example. See all the examples
     online: https://docs.lvgl.io/master/examples.html
     source codes: https://github.com/lvgl/lvgl/tree/e7f88efa5853128bf871dde335c0ca8da9eb7731/examples */
  // Serial.println( "lv_example:" );
  // lv_example_btn_1();
  // lv_example_get_started_1();

  /*Or try out a demo. Don't forget to enable the demos in lv_conf.h. E.g. LV_USE_DEMOS_WIDGETS*/
  Serial.println( "lv_demo:" );
  lv_demo_widgets();
  // lv_demo_benchmark();
  // lv_demo_keypad_encoder();
  // lv_demo_music();
  // lv_demo_printer();
  // lv_demo_stress();

编译下载运行,结果如下:
image.png

如果觉得方向不合适的话,可以修改如下几个部分的参数:

static const uint16_t screenWidth  = 320;
static const uint16_t screenHeight = 172;

TFT_eSPI tft = TFT_eSPI(screenHeight, screenWidth);

tft.setRotation( 3 );

其中,setRotation的参数为0 1 2 3,分别表示旋转:0度、90度、180度、270度,根据实际需要设置即可。

然后编译下载运行,结果如下:
image.png

六、总结

得益于DFRobot的良好设计,GDI屏幕的连接上没有任何难度,也得益于Arduino开发平台的强大和可扩展性,使得LVGL能够良好的运行。

LVGL真的太方便了,适配的平台多,支持的功能也全面,效果也废话的出色,想要获得更好效果的同学,务必要了解了解,学习学习,保准不会失望。

显示效果

回帖(1)

sipower

2023-8-5 19:02:06
你的板板排针还没有焊
1 举报
  • HonestQiao: 先不用焊,已经能玩很多东西了!

更多回帖

发帖
×
20
完善资料,
赚取积分