
刚把DHT11模块焊完排针接在树莓派上的朋友,大概率翻三四篇旧教程还跑不通第一个采集脚本——上周我刚折腾过,把踩完坑整理的可复现步骤写下来,照着敲就行。
先把前置环境装对
- 先确认你用的是树莓派(或支持GPIO的Linux开发板,Windows接USB转GPIO模块要提前装好对应驱动),打开终端执行更新和pip安装命令:
sudo apt update && sudo apt install python3-pip -y - 装依赖的时候别搜三四年前的老教程用已经停更的Adafruit_DHT旧库,直接用目前还在维护的版本:
pip3 install adafruit-circuitpython-dht paho-mqtt - 接线别接错:DHT11的VCC接3.3V引脚(别手滑接5V,部分批次模块会直接烧坏),GND接开发板GND,DATA引脚接你选的GPIO口,比如我接的是GPIO4,记好这个引脚号后面写代码要改。
要是接完线一直读不出数据,先晃一晃杜邦线看看是不是松了,十次有八次是接触问题,别上来就死磕代码改参数。
写能直接跑的采集上报代码
在当前目录新建名为dht_upload.py的文件,把下面的代码粘进去,只需要改标注出来的几个参数就行:
import time
import adafruit_dht
import paho.mqtt.client as mqtt
import board
# 初始化传感器,接了别的引脚就把D4换成对应board.Dxx编号
dht_device = adafruit_dht.DHT11(board.D4)
# MQTT配置,我用的是免费公共物联网平台,换自己平台参数即可
MQTT_BROKER = "mqtts.heclouds.com"
MQTT_PORT = 1883
MQTT_TOPIC = "$sys/替换成你的产品ID/替换成你的设备名/dp/post"
CLIENT_ID = "替换成你的设备名"
USERNAME = "替换成你的产品ID"
PASSWORD = "替换成你的设备密钥"
client = mqtt.Client(CLIENT_ID)
client.username_pw_set(USERNAME, PASSWORD)
client.connect(MQTT_BROKER, MQTT_PORT, 60)
while True:
try:
temperature = dht_device.temperature
humidity = dht_device.humidity
if humidity is not None and temperature is not None:
payload = f'{{"temp":{temperature},"humi":{humidity}}}'
client.publish(MQTT_TOPIC, payload)
print(f"上报成功:温度{temperature}℃ 湿度{humidity}%")
else:
print("读取失败,重试中")
except RuntimeError:
# DHT系列传感器读失败是常态,不用停脚本,等2秒重试就好
time.sleep(2)
continue
except Exception as e:
dht_device.exit()
raise e
time.sleep(10) # 上报间隔看你用的平台限流要求,别设太密
- 代码里需要自己改的只有两处核心参数:传感器对应的引脚编号、MQTT连接的平台认证信息,别的逻辑不用动。
- 保存文件后,直接在终端执行命令就能跑:
python3 dht_upload.py - 要是第一次运行报GPIO权限错误,加sudo执行就行,嫌麻烦就把当前用户加到gpio用户组,之后就不用每次加sudo。
跑通之后想改逻辑也简单,不想用公共平台就把MQTT地址换成自己的服务器,想做本地展示套个Flask几行代码就能出个简单的网页看数据。对了,别一开始就买一堆花里胡哨的传感器堆配件,先把这一个温湿度的流程跑通,后面接什么传感器逻辑都是通的。
评论一下?