温湿度传感器 - DHT11
大约 4 分钟ESP32Python
本节课我们来学习温湿度传感器。
实验原理
无论是工业领域还是我们的日常生活,温度和湿度一直都是两个比较重要的指标,DHT11 和 DHT22 是 DHT 系列中使用最广泛的两种传感器。它们有着相同的引脚,用法一致,下图是两者的规格对比:

如果拆下传感器的外壳,其实里面只有一个 NTC 热敏电阻和一个湿度传感元件。

湿度传感部件有两个电极,中间有一个保湿基底(通常是盐或导电塑料聚合物)。随着湿度的升高,基板吸收水蒸气,导致离子的释放和两个电极之间电阻的降低。电阻的变化与湿度成正比,可以测量湿度来估计相对湿度。

DHT11 与 DHT22 还包括用于测量温度的 NTC(热敏电阻)。热敏电阻是一种电阻随温度变化的电阻器。从技术上讲,所有电阻器都是热敏电阻,因为它们的电阻随温度略有变化,但这种变化通常非常小,难以测量。热敏电阻的设计使其电阻随温度而急剧变化(每度 100Ω 或更大),而且电阻随着温度的升高而减小。

DHT11 和 DHT22 传感器的连接都相对简单。它们有四个引脚:

VCC
:传感器供电引脚,建议使用 5V 电源。使用 5V 电源,传感器可以放置在 20 米外。在 3.3V 电源电压下,传感器可以放置在 1 米外;Data
:通过串行数据输出温度和湿度;NC
:Not connected
,无连接;GND
:接地;
硬件电路设计
物料清单(BOM 表):
材料名称 | 数量 |
---|---|
LCD1602 液晶屏 IIC | 1 |
DHT11 温湿度传感器 | 1 |
杜邦线(跳线) | 若干 |
面包板 | 1 |
将材料按照下图相连:

软件程序设计
MicroPython 的标准库中含有 DHT
库,可以导入模块即可直接使用,具体使用方法可以查看官方手册
实际上只有一个使用案例,这里我们可以看到 DHT11 和 DHT22 传感器是如何使用的

代码如下:
import time
from machine import Pin
from dht import DHT11
# 定义 DHT11 控制对象
dht11 = DHT11(Pin(13))
while True:
try:
dht11.measure() #调用 DHT 类库中测量数据的函数
temp = dht11.temperature()
humid = dht11.humidity()
print(f"温度:{temp}°C, 湿度:{humid}RH")
except OSError as e:
print(f"出现异常:{e},正在重试...")
# 如果延时时间过短,DHT11 温湿度传感器不工作
time.sleep(2)
注意
由于 DHT11 温湿度传感器在第一次读取的时候,会出现 OSError 的异常,当你再次运行的时候,即可正常运行,因此,我们只需要捕获第一次出现的错误即可。
最后,我们就可以把从传感器中读取到的数据显示在 LCD1602 屏幕上,需要提前把 I2C LCD1602 的驱动文件 上传到 ESP32 中,
注意
本实验需要用到 I2C 驱动代码,代码在 第 12 节课 中。
代码如下:
import time
from machine import Pin, SoftI2C
from dht import DHT11
from libs.i2c_lcd import I2cLcd
# 定义 DHT11 控制对象
dht11 = DHT11(Pin(13))
# 定义 SoftI2C 控制对象
i2c = SoftI2C(sda=Pin(19), scl=Pin(18), freq=100000)
# 获取 I2C 从机地址
address = i2c.scan()[0]
# 定义 I2CLCD 对象
lcd = I2cLcd(i2c, address, 2, 16)
while True:
try:
# 调用 DHT11 的测量方法
dht11.measure()
temp = dht11.temperature()
humid = dht11.humidity()
print(f"温度:{temp}°C, 湿度: {humid}RH")
# 清屏
lcd.clear()
# 显示
lcd.putstr(f"Temp: {temp}\xDFC\n")
lcd.putstr(f"Humid: {humid}RH")
except OSError as e:
print(f"捕获到异常:{e}, 重试中...")
# 延时太短,DHT11 不工作
time.sleep(2)