场景介绍
今天程序猫带领大家如何获取树莓派传感器温湿度数据,并用MQTT进行广播。
实现过程
启动MQTT服务
1、终端启动Mosquitto服务
sudo systemctl start mosquitto
2、设置服务开机自动启动
sudo systemctl enable mosquitto
硬件连接
树莓派4b连接GPIO引脚与DHT11传感器;
硬件只涉及树莓派、DHT11传感器。
DHT11的信号引脚连接树莓派的GPIO17, DHT11的Vdd(+)和GND引脚(-)分别连接树莓派的电源正极和GND引脚。


实现思路
1、通过树莓派GPIO来连接并控制DHT11传感器,获得温度,湿度数据;
2、使用MQTT将树莓派所获取的温度与湿度数据广播;
3、订阅MQTT服务器的广播获取湿度与温度数据;
链接MQTTX客户端
配置MQTT基础信息,填写ip地址,默认端口1883
如果连接成功,则会弹出已连接
添加订阅主题
配置主题名Topic
读取传感器数据并发送到MQTT
编写脚本代码sensor_demo.py
1、配置MQTT :服务器地址 ,端口号,主题
2、传感器引脚配置
3、读取传感器数据
4、向MQTT发送消息
bash
import time
import board
import adafruit_dht
from datetime import datetime
import paho.mqtt.client as mqtt
import json
# MQTT配置
broker = "192.168.137.31"
port = 1883
topic = "DHT11_message"
# 传感器引脚配置
SENSOR_PIN = board.D17 # 使用CircuitPython标准命名(物理引脚11)
# SENSOR_PIN = board.GPIO17 # 替代:树莓派专用GPIO命名
# 初始化MQTT客户端
client = mqtt.Client()
client.connect(broker, port)
try:
# 添加 use_pulseio=False 参数
dhtDevice = adafruit_dht.DHT11(SENSOR_PIN, use_pulseio=False)
print("传感器初始化成功,开始数据采集......")
while True:
try:
# 读取温湿度数据
temperature = dhtDevice.temperature
humidity = dhtDevice.humidity
# 检查有效读数
if temperature is None or humidity is None:
raise RuntimeError("读取到无效值")
# 准备MQTT消息
recDate = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
msg = json.dumps({
'Tem': temperature,
'Hum': humidity,
'Date': recDate
})
# 发送消息
result = client.publish(topic, msg)
if result[0] == mqtt.MQTT_ERR_SUCCESS:
print(f"✓ [{recDate}] 发送成功: {msg}")
else:
print(f"✗ 发送失败,错误码: {result[0]}")
except RuntimeError as e:
print(f"传感器读取错误: {e}")
except Exception as e:
print(f"意外错误: {e}")
time.sleep(10.0) # 采集间隔10s
except KeyboardInterrupt:
print("程序被用户终止")
except RuntimeError as e:
print(f"初始化失败: {e}")
exit(1)
finally:
# 清理资源
if 'dhtDevice' in locals():
dhtDevice.exit()
client.disconnect()
print("资源已释放")
进入虚拟环境
树莓派终端输入命令:
bash
source adafruit_env/bin/activate

运行脚本
控制台输入命令
bash
python3 sensor_demo.py
控制台可以看到数据采集OK
订阅MQTT服务器的广播获取
打开MQTT客户端,看到接收消息成功。