《ESP32-Arduino开发》GUI设计 LVGL 开发环境搭建教程(从工程目录到模拟器)
前言:最近闲着无聊,看到手头正好有一块tft彩屏,想着拿来玩玩。既然用到了显示屏,自然是离不开ui设计,lvgl是嵌入式一个开源图形库,具备“Light”(轻量)和"Versatile"(可用性强)等特点。对于我而言,最难的莫过于最初的环境搭建了,许多学习的热情在此刻被逐渐浇灭。但功夫不负有心人,花了一天终于是学会了个大概。
跟随我的步伐,教你从0到1搭建LVGL开发环境!
文章目录
- 1.准备工作
- 2.工程创建(基于VScode+PlatformIO)
- 1.创建Platform工程
- 2.向platform工程中添加库文件
- 3.配置彩屏文件
- 4.测试彩屏是否可用
- 5.配置LVGL
- 6.测试LVGL案例
- 7.next?
- 3.LVGL模拟器的使用(基于VS2019)
1.准备工作
硬件:
1. ESP32开发版
2. 1.44TFT彩屏 ST7735S驱动【淘宝】(学生党,买不起贵的彩屏,其他彩屏类似,官方内置了很多驱动库,认准自己屏幕的驱动,稍作修改即可)
知识储备:
1. LVGL官网: https://lvgl.io/
2. LVGL文档:【官网文档】 (可能需要科学上网) 【github】
3. 其他推荐文档
- 百问教程:http://lvgl.100ask.org/8.1/intro/index.html
- 正点原子手把手教学视频:https://www.bilibili.com/video/BV1ug4y1q7ha?p=1
库文件下载
一个完善的LVGL工程文件,其目录下至少包含以下库文件
库文件 | 说明 | 链接 |
---|---|---|
lvgl | lvgl主库 | https://github.com/lvgl/lvgl |
lv_demos | lvgl官方示例库 | https://github.com/lvgl/lv_demos |
TFT_eSPI | tft彩屏驱动库 | https://github.com/Bodmer/TFT_eSPI |
TFT_Touch | tft彩屏触摸屏驱动库 | https://github.com/Bodmer/TFT_Touch |
将这些库都下载到本地以做备用!
2.工程创建(基于VScode+PlatformIO)
我这里使用的是VScode+PlatformIO环境(搭建教程见入口),用arduino IDE开发类似。
1.创建Platform工程
在platform.ini配置文件中加入monitor_speed = 115200,其作用就是修改串口频率,lvgl官方例程使用的都是115200的频率
2.向platform工程中添加库文件
说明:lvgl,TFT_eSPI,TFT_Touch都是能在platform平台上直接下载到的,除lv_demos除外,需要手动添加,因此,为了统一,我这里全部统一为手动添加。
右击 .pio\libdeps\esp32doit-devkit-v1
从资源管理器中打开,在这个目录下添加所需的库文件
打开.vscode/c_cpp_properties.json
,添加新添加库文件的路径
下面的也复制一份
注:没标错就是没错,标错的查看路径是否正确,这里没配置成功的话,到后面编译时报错xx.h文件找不到,99%的原因都是在这里,由于是手动添加,因此platform.ini配置文件不用添加导入的库文件,但要添加lib_deps字段(后边留空),否则编译的时候会自动修改上述的json文件的
3.配置彩屏文件
打开.pio\build\esp32doit-devkit-v1\TFT_eSPI\User_Setup_Select.h配置文价进行修改
配置文件只能取消注释一个,取消注释多个会报错,官方内置了60多个常见的屏幕驱动的配置文件,当然,也可以用户自己设定一个配置文件,就是./User_Setup.h配置文件,取消注释并到该文件下进行相关选项的配置,
由于这里已经有ST7735的配置文件了,我就直接用官方的了。
进入.pio\build\esp32doit-devkit-v1\TFT_eSPI\User_Setups\Setup7_ST7735_128x128.h文件中,进行略微的修改
注:所有的配置文件,一定要抱着非必要的,不知道其作用的就不改的原则进行修改,否则将会吃很多亏的(亲身经历)
这里附一张ESP32引脚图
4.测试彩屏是否可用
按上述修改后就可以测试彩屏是否正常配置了,按顺序连接好线后,打开
.\src\main.cpp
文件,加入官方提供的颜色测试代码,在.pio\build\esp32doit-devkit-v1\TFT_eSPI\examples\Test and diagnostics\Colour_Test\Colour_Test.ino
,如下
#include <SPI.h>
#include <TFT_eSPI.h> // Hardware-specific library
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
void setup(void) {tft.init();tft.fillScreen(TFT_BLACK);// Set "cursor" at top left corner of display (0,0) and select font 4tft.setCursor(0, 0, 4);// Set the font colour to be white with a black backgroundtft.setTextColor(TFT_WHITE, TFT_BLACK);// We can now plot text on screen using the "print" classtft.println("Intialised default\n");tft.println("White text");tft.setTextColor(TFT_RED, TFT_BLACK);tft.println("Red text");tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.println("Green text");tft.setTextColor(TFT_BLUE, TFT_BLACK);tft.println("Blue text");delay(5000);
}void loop() {// 设置文字颜色并打印tft.invertDisplay( false ); // Where i is true or falsetft.fillScreen(TFT_BLACK);tft.setCursor(0, 0, 4);tft.setTextColor(TFT_WHITE, TFT_BLACK);tft.println("Invert OFF\n");tft.println("White text");tft.setTextColor(TFT_RED, TFT_BLACK);tft.println("Red text");tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.println("Green text");tft.setTextColor(TFT_BLUE, TFT_BLACK);tft.println("Blue text");delay(5000);// Binary inversion of colours// 反转屏幕颜色tft.invertDisplay( true ); // Where i is true or falsetft.fillScreen(TFT_BLACK);tft.setCursor(0, 0, 4);// 设置文字颜色并打印tft.setTextColor(TFT_WHITE, TFT_BLACK);tft.println("Invert ON\n");tft.println("White text");tft.setTextColor(TFT_RED, TFT_BLACK);tft.println("Red text");tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.println("Green text");tft.setTextColor(TFT_BLUE, TFT_BLACK);tft.println("Blue text");delay(5000);
}
代码各个函数的用途很好理解,上传到ESP32开发版上后查看文字的颜色是否跟文字描述的颜色相符,不符则看前2张图上的说明,彩屏若配置不成功,那后面的lvgl自然也无法显示了
5.配置LVGL
同TFT_eSPI库,lvgl也有配置文件进行修改
打开.pio\libdeps\esp32doit-devkit-v1\lvgl\lv_conf_template.h
,复制一份文件到同目录下,并重命名为lv_conf.h
将if后面的0改为1
将LV_TICK_CUSTOM修改为1
其他的配置就根据自己需求修改
6.测试LVGL案例
打开.pio\libdeps\esp32doit-devkit-v1\lvgl\examples\arduino\LVGL_Arduino\LVGL_Arduino.ino
文件,复制代码到/src/main.cpp
中,官方给的案例包含触摸功能测试,但由于我的彩屏没有触摸功能,因此需要对代码进行修改,如下
#include <lvgl.h>
#include <TFT_eSPI.h>
/*If you want to use the LVGL examples,make sure to install the lv_examples Arduino libraryand uncomment the following line.
#include <lv_examples.h>
*/#include <lv_demo.h>TFT_eSPI tft = TFT_eSPI(); /* TFT instance *//*屏幕的宽高在这里修改*/
static const uint32_t screenWidth = 128;
static const uint32_t screenHeight = 128;static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[ screenWidth * 10 ];//开启日志后调用的函数,启用该功能需要修改lvgl_conf.h的对应功能
#if LV_USE_LOG != 0
/* Serial debugging */
void my_print( lv_log_level_t level, const char * file, uint32_t line, const char * fn_name, const char * dsc )
{Serial.printf( "%s(%s)@%d->%s\r\n", file, fn_name, line, dsc );Serial.flush();
}
#endif/* 刷新屏幕 */
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( 115200 ); /* prepare for possible serial debug */Serial.println( "Hello Arduino! (V8.0.X)" );Serial.println( "I am LVGL_Arduino" );lv_init();#if LV_USE_LOG != 0lv_log_register_print_cb( my_print ); /* register print function for debugging */
#endiftft.begin(); /* TFT init */tft.setRotation( 3 ); /* 旋转屏幕,n * 90度 ,3表示270度*/// 建立一个屏幕宽*10大小的缓冲区lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 );/*初识化屏幕*/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 );/*初识化输入设备*/static lv_indev_drv_t indev_drv;lv_indev_drv_init( &indev_drv );indev_drv.type = LV_INDEV_TYPE_POINTER;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, "Hello Arduino! (V8.0.X)" );lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 );
#else// 取消注释会启用对应的案例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
#endifSerial.println( "Setup done" );
}void loop()
{lv_timer_handler(); /* 在循环中让lvgl处理一些相应的事件 */delay( 5 );
}
由于屏幕太小了,无法放下整个案例,hhh
7.next?
既然是ui设计,如何设计一个属于ui呢?这就需要学习LVGL官方的组件了,如文字,滑动条,输入框等等,这种开发方式可能就跟我之前学的pyqt5类似吧,从不同组件中挑选符合自己的积木,最终搭成堡垒,当然,你也可以从别人的lvgl的UI中移植过来,用C语言开发的lvgl的UI部分都是通用的,下面给出一个简单UI示例
//创建一个标签,如同画板(lv_src_act()用于获取当前活跃的屏幕)lv_obj_t *label = lv_label_create( lv_scr_act() );// 在画板上写上文字lv_label_set_text( label, "Hello World!I'm fine!" );// 设置画板上的对齐方式,也就是布局lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 );
那UI部分有了,如何使用呢?
其实上上案例中的代码是对于所有的arduino开发板都通用的,基本就是套模板使用,当然,更深层次的使用就需要自己慢慢探索了
不想麻烦?当然,这里也提供一整个工程文件下载方式(包括模拟器工程),下载导入platform工程即可【传送门】
3.LVGL模拟器的使用(基于VS2019)
每设计一个UI就要刷固件岂不是很麻烦?因此,借助LVGL模拟器,可以直接在电脑上查看自己设计的UI,满足心中预想后就可移植到Arduino工程中。
由于文章篇幅过大,因此在下一篇博客中再介绍—>【传送门】
《ESP32-Arduino开发》GUI设计 LVGL 开发环境搭建教程(从工程目录到模拟器)相关推荐
- Arduino框架下联盛德W801开发环境搭建教程
Arduino框架下联盛德W801开发环境搭建教程 联盛德W801拥有自己的SDK集成开发工具,能做到这一点非常令人敬佩和了不起.国内好多芯片厂商都需要依托第三方开发工具集来实现对自己产品的开发.多元 ...
- IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天
IOS开发基础之网易新闻环境搭建异步请求json,AFN网络封装第1天 视频资料是2015年的,但是AFN是导入框架的关键文件,我尝试使用cocoapods安装最新的AFN,虽然成功了,但是版本太高, ...
- eclipse--android开发环境搭建教程
引言 在windows安装Android的开发环境不简单也说不上算复杂,但由于国内无法正常访问google给android开发环境搭建带来不小的麻烦.现将本人搭建过程记录如下,希望会对投身androi ...
- 五部搞定Android开发环境部署——费UC噶不过详细的Android开发环境搭建教程
五步搞定Android开发环境部署--非常详细的Android开发环境搭建教程 引言 在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立 ...
- Minecraft我的世界 forge mdk1.13(1.14)开发环境搭建教程及经验
Minecraft我的世界 forge mdk1.13(1.14)开发环境搭建教程及经验 1.前言 2. 1.13与1.12的区别 在forgegradle方面 在mdk开发方面 3.安装JDK和ID ...
- php linux下开发教程,linux下php环境搭建教程_后端开发
linux下php环境搭建要领:起首猎取PHP.Apache以及MySQL装置包:然后装置Apache,并修正设置文件httpd.conf:接着装置MySQL,并做基础设置:末了装置PHP,并设置ph ...
- 虚拟机IOS开发环境搭建教程
来源:http://www.cnblogs.com/xiaoyaoju/archive/2013/05/21/3091171.html 安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB ...
- IOS开发 之百度地图API环境搭建
1 前言 由于工作需要,要开始捣腾百度地图了,今天上午初始牛刀,各种碰壁,无奈之下,中午睡了一觉,养精蓄锐,以备下午大战三百回合,所幸下午中午把百度地图Demo捣腾出来了,在此与大家分享,环境搭建教程 ...
- IOS开发学习 IDE环境搭建教程
IOS开发学习 IDE环境搭建教程是本文要介绍的内容,在坛子里逛了一圈,发现一篇好的文章,与友们分享一下,要有耐心的看整个过程,不多说,直接进入话题. 安装条件: 硬件:一台拥有支持虚拟技术的64位双 ...
最新文章
- Ubuntu 18.04 固件的烧录方法
- 关于最长公共子序列的执行过程
- phpstuday 修改网站访问目录
- java无向图代码实例_Java 图示例 · JavaTutorialNetwork 中文系列教程 · 看云
- 腾讯产品面试题 | 如何把剃须刀卖给张飞?
- 小程序 array.map_Array.map解释了4个复杂级别:从5岁到功能程序员。
- Python Base64模块的使用
- 测试用例集-8.公交卡测试用例
- end_request: I/O error
- T - hiho字符串 HihoCoder - 1485 (..map的使用把)
- 变量、变量类型与cin的基本用法详解(C++)
- linux 共享内存区及进程间通信
- uniapp php接口如何写,uni-app入门教程之接口的基本使用
- mysql nutch,nutch结合mysql配置
- 微信公众号迁移流程和公众号迁移公证书办理步骤
- python以写模式打开的文件无法进读操作_以写模式打开的文件无法进行读操作。...
- Mac OS X 内核Rootkit开发指南
- java游戏服务器面试_服务器 面试
- 微软认知服务应用秘籍 – 漫画翻译篇
- 今日头条阅读量怎么刷_今日头条阅读量怎么刷 今日头条怎么增加阅读量