温湿度传感器 - DHT11

罗大富 BigRich大约 4 分钟ESP32Python

本节课我们来学习温湿度传感器。

实验原理

无论是工业领域还是我们的日常生活,温度和湿度一直都是两个比较重要的指标,DHT11 和 DHT22 是 DHT 系列中使用最广泛的两种传感器。它们有着相同的引脚,用法一致,下图是两者的规格对比:

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

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

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

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

  • VCC:传感器供电引脚,建议使用 5V 电源。使用 5V 电源,传感器可以放置在 20 米外。在 3.3V 电源电压下,传感器可以放置在 1 米外;
  • Data:通过串行数据输出温度和湿度;
  • NCNot connected,无连接;
  • GND:接地;

硬件电路设计

物料清单(BOM 表):

材料名称数量
LCD1602 液晶屏 IIC1
DHT11 温湿度传感器1
杜邦线(跳线)若干
面包板1

将材料按照下图相连:

软件程序设计

MicroPython 的标准库中含有 DHT 库,可以导入模块即可直接使用,具体使用方法可以查看官方手册open in new window

实际上只有一个使用案例,这里我们可以看到 DHT11 和 DHT22 传感器是如何使用的

202504121654815

代码如下:

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)
上次编辑于:
贡献者: 罗大富BigRich