转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]
如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

如果你正在折腾物联网小项目,用树莓派读取温湿度一定是个经典开局。DHT11 作为最亲民的传感器之一,配合新版 adafruit-circuitpython-dht 库,代码更 Pythonic,异常处理也更优雅。本文只讲新版方案,带你从零到跑通。

硬件清单

物品 说明
树莓派 4B/3B+/Zero W 任意型号均可
DHT11 模块 建议买已集成上拉电阻的三针模块
杜邦线 母对母或公对母,至少 3 根

接线图

DHT11 与树莓派的连接非常简单:

DHT11 树莓派 GPIO
VCC 5V (Pin 2) 或 3.3V (Pin 1)
DATA GPIO4 (Pin 7)
GND GND (Pin 6)

注意:如果你的 DHT11 是裸板(非模块),务必在 DATA 和 VCC 之间焊接一个 4.7kΩ ~ 10kΩ 的上拉电阻,否则信号不稳定,读取频繁报错。

环境准备

1. 更新系统与安装依赖

sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip libgpiod2 -y

libgpiod2 是新版库底层依赖,必须安装,否则运行时会报错找不到 libgpiod。

2. 安装新版 Python 库

pip3 install adafruit-circuitpython-dht

这就是新版方案的核心库。它基于 CircuitPython 生态,统一了各类传感器的 API 风格,相比旧版 Adafruit_DHT 更现代、维护更活跃。


核心代码

新建文件 dht11_new.py

import time
import board
import adafruit_dht

# 初始化传感器,board.D4 对应 GPIO4 (Pin 7)
# 如果接的是 GPIO17,则写 board.D17,以此类推
dht_device = adafruit_dht.DHT11(board.D4)

print("开始读取 DHT11 数据,按 Ctrl+C 退出...")

while True:
    try:
        # 读取温湿度
        temperature = dht_device.temperature  # 单位:摄氏度
        humidity = dht_device.humidity        # 单位:%

        print(f"🌡️ 温度: {temperature}°C")
        print(f"💧 湿度: {humidity}%")
        print("-" * 24)

    except RuntimeError as error:
        # DHT11 的物理特性决定了它偶尔会读取失败
        # 这里捕获异常后继续循环,不用退出程序
        print(f"⚠️ 读取异常: {error.args[0]}")
        time.sleep(2)
        continue

    except KeyboardInterrupt:
        print("\n👋 程序已退出")
        dht_device.exit()
        break

    except Exception as error:
        dht_device.exit()
        raise error

    # DHT11 最小采样间隔约 1~2 秒,不宜过频
    time.sleep(2)

代码亮点解析

特性 说明
board.D4 使用 BCM 编码,直观对应 GPIO 编号,再也不用记 Pin 号是几
RuntimeError 捕获 新版库在读取失败时抛出此异常,属于正常现象,捕获后重试即可
dht_device.exit() 优雅释放资源,避免 GPIO 占用导致下次运行报错

运行与测试

python3 dht11_new.py

正常输出应类似:

开始读取 DHT11 数据,按 Ctrl+C 退出...
🌡️ 温度: 25°C
💧 湿度: 60%
------------------------
⚠️ 读取异常: DHT sensor not found, check wiring
🌡️ 温度: 25°C
💧 湿度: 61%
------------------------

看到 DHT sensor not found 不用慌,只要偶尔出现且后续能恢复,就是正常的通信抖动。如果持续报错,请检查接线或补焊上拉电阻。


常见问题速查

Q:提示 No module named 'board' A:确认执行了 pip3 install adafruit-circuitpython-dht,且使用的是 python3 命令运行。

Q:提示 Unable to set line 4 to input A:当前用户没有 GPIO 权限。执行 sudo usermod -a -G gpio $USER 后重新登录,或直接 sudo python3 dht11_new.py 临时解决。

Q:读数一直是 None 或固定不变 A:大概率是 DATA 引脚缺少上拉电阻,或者杜邦线接触不良。换一根线或换一个 GPIO 口试试。


写在最后

新版 adafruit-circuitpython-dht 的 API 设计非常统一,如果你以后升级到 DHT22(AM2302),只需把代码里的 DHT11 改成 DHT22,其余逻辑完全不变。这种一致性正是 CircuitPython 生态的魅力所在。

下一步,你可以把读到的数据写入 InfluxDB、通过 MQTT 上报到 Home Assistant,或者搭一个 Flask 网页实时展示——传感器跑通了,后面的玩法就自由了。

更多推荐