MicroPython[ESP32-S3]:LVGL设置DHT11温湿度动画

NO.1
本期功能

温湿度计动画

  1. 使用DHT11获取当前房间温湿度

  2. 使用LVGL绘制温湿度(渐变色仪表盘+动画)

img

NO.2
DHT11温湿度

官方文档

https://docs.micropython.org/en/latest/esp32/quickref.html#dht-driver

img

DHT11温湿度接线

ESP32-S3
DHT11
GND
GND
3V3
VCC
GPIO4
DATA

img

官方代码

import dhtimport machined = dht.DHT11(machine.Pin(4))d.measure()d.temperature() # eg. 23 (°C)d.humidity()    # eg. 41 (% RH)
NO.3
LVGL温湿度

官方文档

https://docs.lvgl.io/8.3/examples.html#base-object

查看对应MicroPython示例代码

img

引入温湿度依赖

import dhtfrom machine import Pinsensor = dht.DHT11(Pin(4))

本文代码

# 设置温湿度中文字体font_wendu=lv.font_load("S:./wendu.bin")font_shidu=lv.font_load("S:./shidu.bin")# 设置温湿度动画值def set_temp(bar, temp):    bar.set_value(temp, lv.ANIM.ON)# 设置温度样式style_indic = lv.style_t()style_indic.init()style_indic.set_bg_opa(lv.OPA.COVER)style_indic.set_bg_color(lv.palette_main(lv.PALETTE.RED))style_indic.set_bg_grad_color(lv.palette_main(lv.PALETTE.BLUE))style_indic.set_bg_grad_dir(lv.GRAD_DIR.VER)# 设置温度barbar = lv.bar(lv.scr_act())bar.add_style(style_indic, lv.PART.INDICATOR)bar.set_size(20, 200)bar.set_x(360)bar.set_y(80)bar.set_range(0, 40)# 设置温度文字label_bar=Nonelabel_bar = lv.label(scr)label_bar.set_style_text_font(font_wendu, 0)  # set the fontlabel_bar.set_text("温度")label_bar.set_x(350)label_bar.set_y(285)# 获取温度值measure=sensor.measure() temperature_end=sensor.temperature()# 设置数字显示font_num=lv.font_load("S:./num.bin")label_bar_num=Nonelabel_bar_num = lv.label(scr)label_bar_num.set_style_text_font(font_num, 0)# label_bar_num.set_text("30")label_bar_num.set_text(str(temperature_end))label_bar_num.set_x(360)label_bar_num.set_y(60)# 设置温度动画a = lv.anim_t()a.init()a.set_time(3000)# a.set_playback_time(3000)a.set_var(bar)a.set_values(0, temperature_end)#a.set_repeat_count(lv.ANIM_REPEAT_INFINITE)a.set_repeat_count(0)a.set_custom_exec_cb(lambda a, val: set_temp(bar,val))lv.anim_t.start(a)

然后设置定时获取温湿度并重新设置动画

temperature=Nonedef tem_hum_change():    global temperature_end,temperature,a    try:        measure=sensor.measure()         temperature=sensor.temperature()    except Exception as e:         print("tem_hum_change 监听消息错误",repr(e))    a = lv.anim_t()    a.init()    a.set_time(500)    # a.set_playback_time(3000)    a.set_var(bar)    a.set_values(temperature_end,temperature)    #a.set_repeat_count(lv.ANIM_REPEAT_INFINITE)    a.set_repeat_count(0)    a.set_custom_exec_cb(lambda a, val: set_temp(bar,val))    lv.anim_t.start(a)    label_bar_num.set_text(str(temperature))    # 记录每次最新的值,作为下次动画的起始点    temperature_end=temperature
NO.4
Tips

总结如下

  1. 需要准备一个DHT11的温湿度模块

  2. 按照文中接线和代码获取当前温湿度值

  3. 使用LVGl绘制温湿度图表和动画效果

这个温湿度是最常见也相对容易设置的一个,重要的是它不依赖于网络

可视化的界面容易感知当前环境,避免出现高温脱水,低温感冒的场景

参考文章

MicroPython[ESP32]:使用lvgl设置温度仪表盘动画

往期内容

MicroPython[ESP32-S3]:使用lv_font_conv制作中文字体文件然后加载和显示

MicroPython[ESP32-S3]:lvgl使用fontTools提取字体子集设置中文手写字体

MicroPython[ESP32-S3]:micropython-mqtt设置MQTT连接

END