Funpack第2季第3期——FireBeetle-E移植lvgl图形库
用FireBeetle-E开发板作为控制单元,搭配显示屏移植lvgl图形库,动态显示任意一个及以上传感器采集到的数据,或者使用触摸屏对执行器进行控制。
标签
嵌入式系统
Funpack活动
ESP32
lvgl
MDYi
更新2023-01-03
北京交通大学
639

0.目录

  1. 项目要求

  2. 板卡介绍

  3. 开发环境

  4. 功能实现

  5. 成果展示

  6. 心得体会

  7. 附件

 

1.项目要求

lvgl图形库和应用:用FireBeetle-E开发板作为控制单元,搭配显示屏移植lvgl图形库,动态显示任意一个及以上传感器采集到的数据,或者使用触摸屏对执行器进行控制。

 

2.板卡介绍

FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。

它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。

通过和IFTTT等物联网平台的连接,你可轻松制作出你独有的特色物联网智能家居系统。

FireBeetle ESP32-E深度支持ArduinoIDE编程,并且即将支持Scratch图形化编程及MicroPython编程。 我们提供了详细的在线教程和应用案例,以及上千种免焊接的Gravity接口传感器与执行器,可轻松上手制作,大幅度降低你的学习时间。邮票孔的设计,让它可以方便的嵌入你设计的PCB上,大大缩减你的原型开发成本以及原型测试时间。

Fi-FpELFX8F4R5B3gZ4R4jv-ktp8

 

3.开发环境

本次任务使用VSCODE,安装PlatformIO,板卡选择ESP32 Pico Kit(Espressif)。

安装库文件如下:

  • bodmer/TFT_eSPI@2.4.70

  • lvgl/lvgl@^8.3.2

  • paulstoffregen/OneWire@^2.3.7

  • milesburton/DallasTemperature@^3.11.0

 

4.功能实现

根据项目要求,将任务分为屏幕驱动、lvgl移植与温度采集三部分。

4.1 屏幕驱动

屏幕使用1.54寸TFT-LCD屏,分辨率240x240,通过FPC软排线与开发板进行连接。

FjnHeiNLqQOcVcGawN9qcOXPnX60

屏幕驱动使用TFT_eSPI库,在User_Setup_Select.h中注释掉其他屏幕配置,使用自定义配置。

User_Setup.h文件中进行自定义配置,主要内容如下:

#define USER_SETUP_INFO "User_Setup"
#define ST7789_DRIVER
#define TFT_WIDTH  240
#define TFT_HEIGHT 240
#define TFT_DC  25
#define TFT_CS  14
#define TFT_RST 26
#define TOUCH_CS -1

字体与SPI配置保持默认即可。

编译后可先测试屏幕能否点亮,如果不能点亮注意使用的引脚是否正确。

4.2 lvgl移植

在VSCODE中可以快速的进行lvgl移植,在PlatformIO的Libraries中搜索lvgl安装即可。

把lvgl_conf_template.h复制一份并重命名为lvgl_conf.h,修改lvgl_conf.h中的15行,将0改为1,即可通过编译。

/* clang-format off */
#if 1 /*Set it to "1" to enable content*/

编译通过后复制“.pio\libdeps\pico32\lvgl\examples\arduino\LVGL_Arduino”目录下LVGL_Arduino.ino文件中的内容至main.cpp中,修改屏幕尺寸,再次编译后下载即可显示lvgl的demo。

这里的温度采集主要通过chart控件进行显示,使用lv_example_chart_2例程。

在该例程中展示了2条曲线,由于只需要1条,注释掉第2条曲线ser2即可。历程中的图表控件需要修改一些配置,主要如下:

lv_chart_set_type(chart1, LV_CHART_TYPE_LINE);   /*Show lines and points too*/
lv_chart_set_range(chart1, LV_CHART_AXIS_PRIMARY_Y, 20, 40);    //设置左侧Y轴的范围
lv_chart_set_range(chart1, LV_CHART_AXIS_SECONDARY_Y, 20, 40);//设置右侧Y轴的范围
lv_chart_set_axis_tick(chart1, LV_CHART_AXIS_PRIMARY_Y, 5, 10, 5, 10, true, 40);//设置Y轴刻度的刻度
lv_chart_set_point_count(chart1, CHART_SET_POINT_COUNT);//设置点的个数

数据的刷新在static void add_data(*lv_timer_t timer)函数中进行,后续将lv_chart_set_next_value();中的第3个参数为温度值即可显示数据。

后续将使用到的代码整合到lv_mychart.cpplv_mychart.h中。

4.3 温度采集

温度采集传感器使用防水DS18B20传感器,数据线连接至D12引脚(引脚号4)。

共用到两个库,分别为OneWireDallasTemperature,前者是单总线库,后者是在前者基础上针对Dallas温度传感器封装的库。

以下代码即可测试DS18B20的工作状态。

#include <OneWire.h>
#include <DallasTemperature.h>
​
#define ONE_WIRE_BUS 4                  // 定义DS18B20数据口连接UNO的2脚
​
OneWire oneWire(ONE_WIRE_BUS);              // 声明连接在单总线上的单总线设备
DallasTemperature sensors(&oneWire);        // 声明一个传感器对象
​
void setup(){
    Serial.begin(9600);                     // 设置串口通信波特率
    sensors.begin();                        // 初始总线
}
​
void loop(){
    sensors.requestTemperatures();              // 向总线上的设备发送温度转换请求,默认情况下该方法会阻塞
    Serial.print("此时测量的温度为:");
    Serial.print(sensors.getTempCByIndex(0));   // 获取索引号0的传感器摄氏温度数据,并串口输出
    Serial.println(" ℃\n");
    delay(500);
}

后续将使用到的代码整合到DS18B20.cppDS18B20.h中。

4.4 代码整合

由于DS18B20的数据返回较慢,使用阻塞式的方法会影响其他工作,因此选择非阻塞式方法通过填入false参数sensors.setWaitForConversion(false); 即可变为非阻塞方式。

static void add_data(*lv_timer_t timer)函数中先将上一次结果转换,在填入chart1后请求下一次转换,即可避免等待。主要代码如下:

static void add_data(lv_timer_t* timer)
{
    LV_UNUSED(timer);
    float temp = getTemperature();
    Serial.println(temp);
    lv_chart_set_next_value(chart1, ser1, temp);
    requestTemperature();
}

 

5.成果展示

视频见B站演示。

FhSuC-qe3qVuPQJ7uyqRlpqKTDa4

 

6.心得体会

  • VSCODE与PlatformIO比Arduino的编译速度快,效率高。

  • lvgl的使用熟悉后非常方便,可以将UI界面做的更加美观,并且可以实现高刷新率。

 

7.附件

链接:https://pan.baidu.com/s/1gRHW8Xqb1Lnm3WzESaTjjw?pwd=5e8h

提取码:5e8h

团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号