0.目录
-
项目要求
-
板卡介绍
-
开发环境
-
功能实现
-
成果展示
-
心得体会
- 附件
1.项目要求
lvgl图形库和应用:用FireBeetle-E开发板作为控制单元,搭配显示屏移植lvgl图形库,动态显示任意一个及以上传感器采集到的数据,或者使用触摸屏对执行器进行控制。
2.板卡介绍
FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。
它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。
通过和IFTTT等物联网平台的连接,你可轻松制作出你独有的特色物联网智能家居系统。
FireBeetle ESP32-E深度支持ArduinoIDE编程,并且即将支持Scratch图形化编程及MicroPython编程。 我们提供了详细的在线教程和应用案例,以及上千种免焊接的Gravity接口传感器与执行器,可轻松上手制作,大幅度降低你的学习时间。邮票孔的设计,让它可以方便的嵌入你设计的PCB上,大大缩减你的原型开发成本以及原型测试时间。
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软排线与开发板进行连接。
屏幕驱动使用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.cpp与lv_mychart.h中。
4.3 温度采集
温度采集传感器使用防水DS18B20传感器,数据线连接至D12引脚(引脚号4)。
共用到两个库,分别为OneWire和DallasTemperature,前者是单总线库,后者是在前者基础上针对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.cpp与DS18B20.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站演示。
6.心得体会
-
VSCODE与PlatformIO比Arduino的编译速度快,效率高。
-
lvgl的使用熟悉后非常方便,可以将UI界面做的更加美观,并且可以实现高刷新率。
7.附件
链接:https://pan.baidu.com/s/1gRHW8Xqb1Lnm3WzESaTjjw?pwd=5e8h
提取码:5e8h