Funpack2-3:用FireBeetle-ESP32-E开发板移植 lvgl图形库实现传感器采集数据动态显示
用FireBeetle-ESP32-E开发板作为控制单元,搭配显示屏移植lvgl图形库,动态显示 任意一个及以上传感器采集到的数据。
标签
Funpack活动
显示
都市木头
更新2023-01-06
863

用FireBeetle-ESP32-E开发板移植lvgl图形库实现动态显示传感器采集到的数据

一、项目介绍

(一)任务要求

用FireBeetle-ESP32-E开发板作为控制单元,搭配显示屏移植lvgl图形库,动态显示任意一个及以上传感器采集到的数据。

(二)材料选择

主控板:基于ESP-WROOM-32E双核芯片的FireBeetle ESP32-E(DFR0654)

传感器:水质浊度传感器Turbidity sensor(SEN0189)

显示屏:0.96”160x80 TFT高清彩屏(DFR0847)

二、硬件介绍

(一)FireBeetle ESP32-E

        FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。通过和IFTTT等物联网平台的连接,可轻松制作出你独有的特色物联网智能家居系统。

  • Type-C: USB接口:4.75v-5.5v
  • pH2.0锂电池接口:3.5-4.2v
  • 2/D9 LED灯:使用2/09号脚控制的LED灯
  • 充电指示灯:指示充电方式的红色LED,通过三种方式指示充电状态:1充满电或末充电时熄灭2、充电时常亮3、USB供电,末连接锂电池时高频闪烁
  • RST复位引脚:单击复位按钮,将程序复位
  • 5/D8 WS2812指示灯:使用5/D8引脚控制的WS2812RGB灯珠
    低功耗焊盘:此焊盈专为低功耗设计,默认为连接状态,使用小刀轻轻刮粉中间的细线即可断开,断开后可降低500u4静态功耗,通过程序控制主控进入睡眠模式后可将功耗降低至131A。注意:焊盘断开后仅UsE方式供电可驱动RGE灯
  • GD显示接口:DFRobot专用显示屏接口,详情后文GD显示接口
  • ESP32模组:乐鑫公司推出的最新ESP32-E模组
  • 按钮:连接27/D4的按钮

        FireBeetle ESP32-E多达22个物理GPIO,其中34-39 仅用作输入管脚,其他的既可以作为输入又可以作为输出管脚。 所有逻辑电压均为3.3V。

  • Control :FireBeetle的使能以及复位引脚
  • Touch:具有电容触摸功能的引脚
  • Analog :具有模拟功能的引脚
  • Port PIN: 芯片默认的物理引脚号,可直接使用此数字控制对应引脚
  • IDE :在arduino IDE中,FireBeetle将引脚号码进行了重映射,您也可以直接使用此符号控制对应引脚
  • RTC PIN: FireBeetle具有低功耗功能,在进入deepsleep模式下仅RTC pin可以被使用
  • Power :FireBeetle将供电电源以及稳压后的3.3v电源通过引脚引出,方便用户使用
  • GND :FireBeetle的公共地引脚

Power

  • GND-这是所有电源和逻辑的公共接地
  • VCC -这是USB/锂电池输入的正电压(5V-USB 供电时输出USB电压, 3.7V-锂电池供电时输出电池电压)
  • 3V3-这是3.3V稳压器的输出,可以提供500mA峰值

Control

  • RST - 与ESP32的复位引脚相连,可将程序复位
  • EN - 这是3.3V稳压器的使能引脚。它已上拉,因此接地能够禁用3.3V稳压器

GPIO

  • D2至D13-这些都是通用引脚,通常我们将其当作数字引脚使用,也可以使用其复用功能。
  • A0至A4-这些都是模拟输入引脚,其中A0-A3仅能作为输入引脚使用。
  • SDA -I2C(线)数据引脚。
  • SCL -I2C(线)时钟引脚。
  • SCK / MOSI / MISO-这些是硬件SPI引脚,您可以将它们用作日常的GPIO引脚(但建议使其保持空闲状态,因为它们最适合用于高速SPI硬件)。

UART

        ESP32共有2个UART端口, 其中UART0用于与PC通信

(二)Turbidity sensor浊度传感器模块

​​        浊度传感器是利用光学原理,通过液体溶液中的透光率和散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过的光少,电流小,再通过电阻将流过的电流转换为电压信号。 应用范围:可以用于洗衣机、洗碗机等产品的水污浊程度的测量。通过测量水的污浊程度来判断所洗物品洁净程度,确定最佳的洗涤时间和漂洗次数,用较少的能耗和耗水量获得满足要求的洗净比。也可以用于工业现场控制,环境污水采集等需要浊度检测控制的场合 说明:本传感器模块通过数模切换开关,可以选择输出的是模拟量或者数字量。如果选择输出是模拟量,利用A/D转换器进行采样处理,单片机就可以获知当前水的污浊度。如果选择输出是数字量,通过模块上的电位器调节触发阈值,当浊度达到设置好的阈值后,Dout指示灯会被点亮,传感器模块输出由高电平变成低电平,单片机通过监测该电平的变化,就可以知道水的浊度超标,从而预警或者联动其他设备。注意:传感器探头顶部不防水,请小心使用。

        本项目采用模拟量输出,实测最大输出为4096。

技术参数

  • 工作电压:5VDC
  • 工作电流:40mA (MAX)
  • 响应时间:<500ms
  • 绝缘电阻:100MΩ (Min)
  • 输出方式:
    • 模拟量输出:0-4.5V
    • 数字量输出:高/低电平信号(可以通过调节电位器选择对应阈值)
  • 操作温度:-30℃—80℃
  • 存储温度:-10℃—80℃
  • 重量:30g
  • 转接板尺寸:38mm28mm10mm

接口说明

        "D/A"输出选择开关:

                “A”模拟量输出,输出数值会随着液体浊度的增大而减小

                “D”数字量输出,高低电平可由阈值调节

        阈值开关:调节旋钮,调整触发高低电平的临界值,按min方向旋转,会提高触发的阈值,即需要更高的浊度才能触发。

(三)0.96”160x80 TFT高清彩屏

​​        这是一款小巧精致的0.96英寸TFT彩屏,采用无边框PCB设计,体积小巧,并且拥有160*80高清分辨率16-bit(RGB565)色彩显示,显示效果极佳,可应用于可穿戴、移动设备、智能家居等产品中。

        它支持DFRobot GDI显示接口,搭配支持GDI的主控时可以通过FPC线连接,即插即用,有效减少接线步骤。

        它支持3.3V和5V,全屏的最大工作电流不超过15mA,并兼容多个主控:UNO、Leonardo、ESP32、ESP8266、FireBeetle M0等。

特性

  • TFT材质,提供更好的显示效果
  • GDI接口,无需焊接
  • PCB更窄,易于集成进项目

技术规格

  • 工作电压:3.3V-5V
  • IPS可视角度:60/60/60/60
  • 颜色深度:16位色深(RGB565)
  • 像素个数:160列 × 80行
  • 接口方式:SPI
  • 驱动芯片:ST7735
  • 亮度:250 (Typ) cd/m2
  • 全屏点亮功耗:15mA
  • 工作温度:-30℃~+70℃
  • 显示面积:10.8 x 21.7 mm
  • 尺寸:13.5 x 34 mm

三、功能实现及主要代码

(一)实现思路

        根据官方说明,FireBeetle ESP32-E深度支持ArduinoIDE编程,ArduinoIDE带有丰富的例程和库资源,包括官方推荐的TFT_eSPI驱动库和LVGL图形界面库,而LVGL是当前非常流行的开源GUI库,但还没有用过,所以就采用最新版的ArduinoIDE2.0作为开发平台,并尝试采用LVGL8.3版进行界面设计。

        Turbidity sensor浊度传感器模块,可以用来测量水污浊程度,用于家用电器和工业现场控制,环境污水采集等需要浊度检测控制的场合。本传感器模块通过数模切换开关可以选择输出的是模拟量或者数字量。如果选择输出是数字量,只有当浊度达到设置好的阈值后才有数据变化,动态效果不明显;如果选择输出是模拟量,利用A/D转换器进行采样处理,单片机就可以获知当前水的污浊度,可以实时输出连续的变化信息,为了便于演示,所以选择动态效果明显的模拟量输出模式。

        显示器在选择时基于成本考虑,选择了没有触摸功能的0.96英寸160*80TFT彩屏,就只能有动态显示而缺少交互性了,不过掌握了基本移植方法后触摸功能的实现也就比较简单了。

(二)实现过程及方法

        软件设计方面整个项目可分为四步走:

1、Arduino及库资源的安装配置

        Arduino及库资源的安装不多介绍,需要注意:

        (1)要使Arduino支持FireBeetle ESP32-E主控,需要在文件/首选项中添加IDE中的json链接http://download.dfrobot.top/FireBeetle/package_DFRobot_index.json,这样才能下载主控的核心,有时网络不稳定,要多试几次。​​

        (2)要正确选择开发板以及串口,开发板插入不同的USB口对应的串口号是不一样的,错了就不能烧录程序了。

​​        (3)lvgl库安装使用自带的库管理即可,搜索lvgl并安装lvgl库(为了便于参考使用lvgl示例库初次使用最好也装上);还需安装屏幕驱动,继续搜索TFT_eSPI并安装最新版本。

​​2、lvgl图形库的移植

  只装上库是无法通过编译的,需要按照官方文档的要求进行配置,官方文档有详细操作步骤供参考。

lvgl库

        LVGL有自己的配置文件lv_conf.h。当安装了LVGL后,遵循以下配置步骤:
1.转到已安装的Arduino库的目录文件夹libraries
2.将lvgl文件夹下的lv_conf_template.h文件复制出来和lvgl文件夹并列,并重命名为lv_conf.h
3.打开lv_conf.h,并将第一个 #if 0 改为 #if 1,以启用文件的内容
4.根据屏幕色深设置在LV_COLOR_DEPTH中显示的颜色深度
5.将外部定义时钟的宏打开,以使用Arduino的时钟函数接口,将定义 #define LV_TICK_CUSTOM 改为 1


​​lv_examples库

        打开arduino库文件夹libraries将lv_examples文件夹下的 lv_ex_template.h文件复制出来和lv_examples文件夹并列,并重命名为 lv_ex_conf.h。打开lv_ex_conf.h文件并修改第一个 #if 0 为 #if 1使能你想要使用的例程,以lv_ex_…()开头的例程是一直使能的。

显示驱动配置

用户配置文件选择

  打开TFT_eSPI/User_Setup_Select.h,找到:

​#include <User_Setup.h> // Default setup is root library folder​​​

   并删掉它前面的注释符号,这是用来选择驱动配置文件的,TFT_eSPI有很多默认配置文件,这里我们选择User_Setup,自己来配置屏幕。接下来打开User_Setup.h。要选择屏幕驱动、定义引脚并配置SPI速度,部分显示驱动还会有自己的专有配置项,用编辑器的查找来搜索一下自己显示驱动的型号。

// Section 2. Define the pins that are used to interface with the display here

   启用CS引脚也是在这里完成的:

// For FireBeetle 2 ESP32-E IoT
#define TFT_DC 25 // Data Command control pin 25/D2 数据/命令
#define TFT_CS 14 // Chip select control pin 14/D6 TFT片选
#define TFT_RST 26 // Reset pin (could connect to Arduino RESET pin) 26/D3 复位
//#define TOUCH_CS 4 // 4/D12 触摸

        显示部分参考官方示例LVGL_Arduino.ino。

#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 */

#if LV_USE_LOG != 0
/* Serial debugging */
void my_print(const char *buf) {
Serial.printf(buf);
Serial.flush();
}
#endif

/* 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);
}

3、传感器数据的采集

        传感器数据的采集部分参考官方教程示例代码1。

sensorValue = analogRead(A0);// read the input on analog pin 0
float voltage = sensorValue * (5.0 / 4096.0); // Convert the analog reading (which goes from 0 - 4095) to a voltage (0 - 5V)
Serial.println(voltage); // print out the value you read

4、动态显示传感器数据

/* add data */
lv_obj_t * bar;
int sensorValue;

static void my_timer(lv_timer_t * timer)
{
sensorValue = analogRead(A0);// read the input on analog pin 0
float voltage = sensorValue * (5.0 / 4096.0); // Convert the analog reading (which goes from 0 - 4095) to a voltage (0 - 5V)
Serial.println(voltage); // print out the value you read
lv_bar_set_value(bar, int((4096 - sensorValue)/40.96), LV_ANIM_ON);
}

void lv_bar(void)
{
static lv_style_t style_indic;

lv_style_init(&style_indic);
lv_style_set_bg_opa(&style_indic, LV_OPA_COVER);
lv_style_set_bg_color(&style_indic, lv_palette_main(LV_PALETTE_BLUE));
lv_style_set_bg_grad_color(&style_indic, lv_palette_main(LV_PALETTE_BROWN));
lv_style_set_bg_grad_dir(&style_indic, LV_GRAD_DIR_HOR);


bar = lv_bar_create(lv_scr_act());
lv_obj_add_style(bar, &style_indic, LV_PART_INDICATOR);
lv_obj_set_size(bar, 150, 15);
lv_obj_center(bar);

lv_obj_t * label1 = lv_label_create(lv_scr_act());

lv_label_set_text(label1, "Turbidity sensor");
lv_obj_align(label1, LV_ALIGN_TOP_MID, 0, 0);

lv_obj_t * label2 = lv_label_create(lv_scr_act());
lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/
lv_obj_set_width(label2, 150);
lv_label_set_text(label2, "I am FireBeetle Board ESP32 E!");
lv_obj_align(label2, LV_ALIGN_BOTTOM_MID, 0, 0);


lv_timer_create(my_timer, 1, NULL);
}


void setup() {
// put your setup code here, to run once:
Serial.begin(9600); /* prepare for possible serial debug */
Serial.println("//\n// Start! \n//");
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();

#if LV_USE_LOG != 0
lv_log_register_print_cb(my_print); /* register print function for debugging */
#endif
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);
delay(1000);

lv_bar();
}

void loop() {
// put your main code here, to run repeatedly:
lv_timer_handler(); /* let the GUI do its work */
delay(100);
}

四、心得体会及未来的计划建议

        这次项目主要有三点收获,一是对Android的2.0界面进行了熟悉。二是首次成功移植并使用了LVGL图形开发动态界面。三是对传感器的采集进一步的熟悉。有一点遗憾就是,因为采用的显示屏是非触摸屏,对显示的互动环节有缺少,后续有触摸屏情况下将进一步摸索LVGL图形开发。

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