基于 Raspberry Pi 与 MQTT 协议的多传感器 IoT 数据采集系统构建指南

举报
8181暴风雪 发表于 2025/10/27 18:22:06 2025/10/27
【摘要】 物联网的核心在于将物理世界的设备连接到数字世界,实现数据的采集、传输与分析。在这一过程中,选择合适的硬件平台和通信协议至关重要。Raspberry Pi 因其小巧灵活、功耗低且拥有丰富的 GPIO 接口,成为理想的边缘计算节点;而 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 总线通信,需要在系统中启用该功能:

  1. 进入桌面后打开终端,执行以下命令:
    sudo raspi-config
    
  2. 选择 Interfacing Options -> I2C -> Yes,确认启用。
  3. 同时可启用 SPI(若未来扩展其他 SPI 设备)。
  4. 重启树莓派使配置生效。

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 数据采集系统。通过合理的硬件选型、严谨的软件配置和高效的数据传输机制,我们实现了环境的实时监测。未来可以考虑以下改进方向:

  1. 增加更多传感器类型:如气压计、PM2.5 传感器等,丰富监测维度。
  2. 优化电源管理:采用太阳能充电或低功耗模式延长续航时间。
  3. 引入云平台集成:将本地数据同步至阿里云、AWS 等云端进行大数据分析。
  4. 增强安全性:为 MQTT 添加 TLS/SSL 加密,防止数据泄露。

希望本文能为您的 IoT 项目开发提供有益的参考。如果您在实践中遇到任何问题,欢迎留言讨论!


附录:常见问题排查手册

现象 可能原因 解决方案
MQTT 连接失败 防火墙阻止了端口 1883 关闭防火墙或开放相应端口
无法识别 DHT 传感器 接线错误或未安装正确驱动 检查接线,重新安装 Adafruit_DHT 库
光照传感器读数异常 I²C 地址冲突或供电不足 更换 I²C 地址跳线,检查电源稳定性
Python 脚本报错 NameError 变量名拼写错误 仔细检查变量名是否一致
Grafana 无法显示数据 MQTT 主题路径不匹配 检查 Grafana 中的 Topic Matcher 设置
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。