温湿度计动画
-
使用DHT11获取当前房间温湿度
-
使用LVGL绘制温湿度(渐变色仪表盘+动画)
官方文档
https://docs.micropython.org/en/latest/esp32/quickref.html#dht-driver
DHT11温湿度接线
ESP32-S3 |
DHT11 |
GND |
GND |
3V3 |
VCC |
GPIO4 |
DATA |
官方代码
import dht
import machine
d = dht.DHT11(machine.Pin(4))
d.measure()
d.temperature() # eg. 23 (°C)
d.humidity() # eg. 41 (% RH)
官方文档
https://docs.lvgl.io/8.3/examples.html#base-object
查看对应MicroPython示例代码
引入温湿度依赖
import dht
from machine import Pin
sensor = 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)
# 设置温度bar
bar = 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=None
label_bar = lv.label(scr)
label_bar.set_style_text_font(font_wendu, 0) # set the font
label_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=None
label_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=None
def 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
总结如下
-
需要准备一个DHT11的温湿度模块
-
按照文中接线和代码获取当前温湿度值
-
使用LVGl绘制温湿度图表和动画效果
这个温湿度是最常见也相对容易设置的一个,重要的是它不依赖于网络
可视化的界面容易感知当前环境,避免出现高温脱水,低温感冒的场景
参考文章
《MicroPython[ESP32]:使用lvgl设置温度仪表盘动画》
往期内容
《MicroPython[ESP32-S3]:使用lv_font_conv制作中文字体文件然后加载和显示》
《MicroPython[ESP32-S3]:lvgl使用fontTools提取字体子集设置中文手写字体》
《MicroPython[ESP32-S3]:micropython-mqtt设置MQTT连接》
END