基于 Raspberry Pi 与 MQTT 协议的多传感器 IoT 数据采集系统构建指南
物联网的核心在于将物理世界的设备连接到数字世界,实现数据的采集、传输与分析。在这一过程中,选择合适的硬件平台和通信协议至关重要。Raspberry Pi 因其小巧灵活、功耗低且拥有丰富的 GPIO 接口,成为理想的边缘计算节点;而 MQTT 协议则以其轻量级、发布/订阅机制和高可靠性,成为 IoT 领域的事实标准通信协议。本文将带领读者构建一个基于这两者的多传感器数据采集系统。
| 组件 | 作用 | 备注 |
|---|---|---|
| Raspberry Pi | 核心控制器与数据处理中心 | 建议使用 Raspberry Pi 4B |
| 温湿度传感器 | 采集环境温度与湿度数据 | DHT22/AM2302 |
| 光照强度传感器 | 测量环境光照强度 | BH1750FVI |
| MQTT Broker | 消息中间件,负责消息路由 | Mosquitto (开源) |
| 电源模块 | 为传感器提供稳定供电 | 根据所选传感器调整电压 |
| SD 卡 | 存储操作系统及应用程序 | ≥16GB Class10 |
上表列出了构建该系统所需的主要硬件组件及其功能。请注意,实际选型可根据具体需求进行调整。
二、硬件准备与连接
2.1 硬件清单
以下是本次实验所使用的详细硬件列表:
| 序号 | 名称 | 型号/规格 | 数量 | 用途 |
|---|---|---|---|---|
| 1 | Raspberry Pi | Raspberry Pi 4 Model B | 1 | 主控单元 |
| 2 | 温湿度传感器 | DHT22 | 1 | 采集温度(℃)、湿度(%RH) |
| 3 | 光照传感器 | BH1750FVI | 1 | 测量光照强度 (Lux) |
| 4 | 面包板 | MB102 | 1 | 电路原型搭建 |
| 5 | 杜邦线 | 公对母 | 若干 | 连接各个模块 |
| 6 | MicroSD 卡 | 32GB Class10 | 1 | 系统存储 |
| 7 | 5V/3A 电源适配器 | - | 1 | 为树莓派供电 |
| 8 | USB Type-C 数据线 | - | 1 | 连接树莓派与电脑 |
| 9 | 小型风扇(可选) | - | 1 | 辅助散热 |
2.2 硬件连接示意图
Raspberry Pi GPIO Pinout:
VCC ----> [Sensor VCC]
GND ----> [Sensor GND]
DATA --> [Sensor Data Pin] (e.g., DHT22 Data Pin to GPIO4)
↑
└─ [Light Sensor SDA to GPIO2]
└─ [Light Sensor SCL to GPIO3] (I²C interface)
注:具体引脚分配请参考后续软件篇中的 Python 代码注释。
三、软件环境搭建
3.1 操作系统烧录
推荐使用 Raspberry Pi Imager 工具将官方镜像写入 MicroSD 卡。本文选择 Raspberry Pi OS (Legacy, 64-bit) Full 版本,它预装了必要的驱动和支持包。
3.2 启用 I²C 与 SPI 接口
由于部分传感器(如 BH1750FVI)使用 I²C 总线通信,需要在系统中启用该功能:
- 进入桌面后打开终端,执行以下命令:
sudo raspi-config - 选择
Interfacing Options->I2C->Yes,确认启用。 - 同时可启用
SPI(若未来扩展其他 SPI 设备)。 - 重启树莓派使配置生效。
3.3 MQTT Broker 部署
我们选用流行的开源 MQTT Broker——Mosquitto。安装过程如下:
# 更新软件源列表
sudo apt update && sudo apt upgrade -y
# 安装 Mosquitto Server
sudo apt install mosquitto mosquitto-clients -y
# 启动服务并设为开机自启
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
默认情况下,Mosquitto 运行在本机的 1883 端口。可以通过以下命令测试连通性:
mosquitto_pub -t "test/topic" -m "Hello from Raspberry Pi!"
mosquitto_sub -t "test/topic"
若能正常收到消息 “Hello from Raspberry Pi!”,则说明 MQTT Broker 已成功运行。
四、传感器驱动程序与数据采集
4.1 安装依赖库
我们需要安装 Adafruit_DHT 库来读取 DHT22 传感器的数据,以及 smbus2 库用于 I²C 设备的通信。
pip3 install adafruit-circuitpython-dht smbus2 RPi.GPIO
4.2 Python 数据采集脚本示例
以下是一个简单的 Python 脚本示例,用于周期性地读取温湿度和光照强度,并通过 MQTT 发布数据:
import time
import board
import busio
import adafruit_dht
from smbus2 import SMBus, i2c_msg
import json
import paho.mqtt.client as mqtt
# ================= 配置参数 =================
MQTT_BROKER = "localhost" # MQTT Broker 地址
MQTT_PORT = 1883 # MQTT 端口号
MQTT_TOPIC = "sensors/data" # 发布主题
PUBLISH_INTERVAL = 5 # 发布间隔(秒)
# ================= 初始化传感器 ================
# DHT22 温湿度传感器 (GPIO4)
dht = adafruit_dht.DHT22(board.D4)
# BH1750FVI 光照传感器 (I²C)
i2c = busio.I2C(board.SCL, board.SDA)
BH1750_ADDRESS = 0x23 # 默认 I²C 地址
COMMAND_CONTINUOUS_HIGHRES = bytearray([0x10]) # 连续高分辨率模式命令
def read_light():
with i2c:
i2c.writeto(BH1750_ADDRESS, COMMAND_CONTINUOUS_HIGHRES)
time.sleep(0.18) # 等待转换完成
data = i2c.readfrom(BH1750_ADDRESS, 2)
light = (data[0] << 8) | data[1]
return light / 1.2 # 转换为 Lux (近似值)
# ================= MQTT 客户端设置 ================
client_id = f'raspberrypi_{hex(id(this))[2:]}' # 唯一客户端 ID
mqtt_client = mqtt.Client(client_id=client_id)
mqtt_client.connect(MQTT_BROKER, MQTT_PORT)
try:
while True:
print("Fetching sensor data...")
# 读取温湿度
try:
temperature = dht.temperature
humidity = dht.humidity
except RuntimeError:
print("Warning: Could not read from DHT sensor!")
temperature = None
humidity = None
# 读取光照强度
try:
light = read_light()
except Exception as e:
print(f"Error reading light sensor: {e}")
light = None
# 构造 JSON payload
payload = {
"timestamp": int(time.time()),
"temperature": round(temperature, 2) if temperature else None,
"humidity": round(humidity, 2) if humidity else None,
"light": round(light) if light else None
}
# 发布到 MQTT
print(f"Publishing: {json.dumps(payload)}")
mqtt_client.publish(MQTT_TOPIC, json.dumps(payload), qos=1)
time.sleep(PUBLISH_INTERVAL)
except KeyboardInterrupt:
print("\nExiting gracefully...")
finally:
mqtt_client.disconnect()
注意:上述代码仅为示例,实际应用中需添加错误处理、日志记录等功能。
五、数据可视化与远程访问
为了方便查看采集到的数据,可以使用 Grafana 或其他可视化工具对接 MQTT Broker。以下是几种常见方案:
| 方案 | 优点 | 缺点 |
|---|---|---|
| Grafana + MQTT Plugin | 功能强大,支持多种图表类型 | 初始配置稍复杂 |
| Node-RED | 拖拽式编程,快速集成第三方服务 | 性能较低,不适合大规模部署 |
| Home Assistant | 完整的家庭自动化平台 | 依赖特定生态体系 |
| Custom Web App | 完全自定义,灵活性最高 | 开发周期较长 |
对于小型项目,推荐使用 Grafana 进行简单的折线图展示。只需安装相应的 MQTT Data Source 插件即可轻松创建仪表盘。
六、总结与展望
本文介绍了如何利用 Raspberry Pi、各类传感器和 MQTT 协议构建一个基础的 IoT 数据采集系统。通过合理的硬件选型、严谨的软件配置和高效的数据传输机制,我们实现了环境的实时监测。未来可以考虑以下改进方向:
- 增加更多传感器类型:如气压计、PM2.5 传感器等,丰富监测维度。
- 优化电源管理:采用太阳能充电或低功耗模式延长续航时间。
- 引入云平台集成:将本地数据同步至阿里云、AWS 等云端进行大数据分析。
- 增强安全性:为 MQTT 添加 TLS/SSL 加密,防止数据泄露。
希望本文能为您的 IoT 项目开发提供有益的参考。如果您在实践中遇到任何问题,欢迎留言讨论!
附录:常见问题排查手册
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| MQTT 连接失败 | 防火墙阻止了端口 1883 | 关闭防火墙或开放相应端口 |
| 无法识别 DHT 传感器 | 接线错误或未安装正确驱动 | 检查接线,重新安装 Adafruit_DHT 库 |
| 光照传感器读数异常 | I²C 地址冲突或供电不足 | 更换 I²C 地址跳线,检查电源稳定性 |
| Python 脚本报错 NameError | 变量名拼写错误 | 仔细检查变量名是否一致 |
| Grafana 无法显示数据 | MQTT 主题路径不匹配 | 检查 Grafana 中的 Topic Matcher 设置 |
- 点赞
- 收藏
- 关注作者
评论(0)