1. 项目概述
随着工业4.0的推进,智能制造已成为制造业发展的必然趋势。本文介绍了一套基于STM32和MQTT协议的小型工厂设备监控系统,可实现对工厂设备的实时监控和数据分析,有效提高生产效率和安全性。
系统主要包括三个部分:
- 设备端:使用STM32 MCU连接各种传感器,采集设备运行数据并通过MQTT协议发送
- 本地服务器:运行MQTT Broker接收数据,使用InfluxDB存储,Grafana可视化
- 管理端:通过Web界面实时监控设备状态
2. 系统设计
2.1 系统架构
系统整体架构如下图所示:
2.2 硬件设计
设备端硬件主要包括:
- STM32F103 MCU
- DHT11温湿度传感器
- BMP280压力传感器
- YF-S201流量传感器
- ESP8266 WiFi模块
硬件连接示意图如下:
2.3 软件设计
软件架构如下:
主要软件模块:
- STM32固件:基于FreeRTOS,实现传感器数据采集和MQTT通信
- MQTT Broker:使用Mosquitto
- 数据存储:InfluxDB时序数据库
- 数据可视化:Grafana
3. 代码实现
3.1 STM32固件核心代码
/* 初始化传感器 */
void sensor_init(void)
{
DHT11_Init(); // 初始化DHT11温湿度传感器
BMP280_Init(); // 初始化BMP280压力传感器
Flow_Sensor_Init(); // 初始化YF-S201流量传感器
}
/* 采集传感器数据任务 */
void vTaskSensorRead(void *pvParameters)
{
float temp, humi, press, flow;
while(1)
{
// 读取各传感器数据
DHT11_Read_Data(&temp, &humi);
press = BMP280_ReadPressure();
flow = Flow_Sensor_Read();
/* 打包数据为JSON格式 */
sprintf(mqttMsg, "{\"temp\":%.1f,\"humi\":%.1f,\"press\":%.1f,\"flow\":%.2f}",
temp, humi, press, flow);
/* 发送MQTT消息到主题"sensor/data" */
MQTT_Publish("sensor/data", mqttMsg, strlen(mqttMsg), 0);
vTaskDelay(1000); // 每秒采集一次数据
}
}
/* MQTT连接任务 */
void vTaskMQTTConnect(void *pvParameters)
{
while(1)
{
if(!MQTT_IsConnected())
{
MQTT_Connect("STM32Client"); // 尝试连接MQTT Broker
}
vTaskDelay(5000); // 每5秒检查一次连接状态
}
}
int main(void)
{
/* 初始化硬件 */
SystemInit();
sensor_init();
MQTT_Init();
/* 创建FreeRTOS任务 */
xTaskCreate(vTaskSensorRead, "SensorRead", 128, NULL, 1, NULL);
xTaskCreate(vTaskMQTTConnect, "MQTTConnect", 128, NULL, 2, NULL);
/* 启动FreeRTOS调度器 */
vTaskStartScheduler();
while(1);
}
说明:
- 使用FreeRTOS创建两个任务:传感器数据读取和MQTT连接维护
- 传感器数据以JSON格式打包,便于后续处理
- 使用MQTT_Publish函数发布数据到指定主题
- 主函数中初始化硬件并创建任务,然后启动FreeRTOS调度器
3.2 服务器端配置
MQTT Broker配置(mosquitto.conf):
listener 1883
allow_anonymous true
说明:
- 设置MQTT Broker监听1883端口
- 允许匿名连接,简化开发阶段的认证过程
InfluxDB数据接收脚本(Python):
import paho.mqtt.client as mqtt
from influxdb import InfluxDBClient
import json
# MQTT回调函数
def on_message(client, userdata, message):
payload = json.loads(message.payload)
json_body = [
{
"measurement": "sensor_data",
"tags": {
"device": "STM32"
},
"fields": payload
}
]
influx_client.write_points(json_body)
# 连接MQTT Broker
mqtt_client = mqtt.Client()
mqtt_client.on_message = on_message
mqtt_client.connect("localhost", 1883)
mqtt_client.subscribe("sensor/data")
# 连接InfluxDB
influx_client = InfluxDBClient('localhost', 8086, 'root', 'root', 'factory_db')
mqtt_client.loop_forever()
说明:
- 使用paho-mqtt库创建MQTT客户端,连接到本地MQTT Broker
- 订阅"sensor/data"主题,接收传感器数据
- 使用InfluxDB-Python库连接到本地InfluxDB数据库
- 在on_message回调函数中,将接收到的JSON数据转换为InfluxDB的数据点格式
- 使用write_points函数将数据写入InfluxDB
- mqtt_client.loop_forever()保持脚本运行,持续监听MQTT消息
4. 系统功能展示
4.1 Grafana数据可视化
Grafana是一个强大的开源数据可视化工具,本项目中主要用于创建实时监控仪表板。以下是Grafana的主要配置步骤:
-
数据源配置:
- 添加InfluxDB数据源
- 设置URL: http://localhost:8086
- 选择数据库: factory_db
-
仪表板创建:
- 新建仪表板
- 添加面板,选择InfluxDB数据源
- 使用InfluxQL查询语言编写查询
-
面板类型:
- 折线图: 显示温度、湿度、压力、流量随时间的变化趋势
- 仪表盘: 显示当前各参数值
- 热力图: 展示参数分布情况
-
时间范围设置:
- 支持实时更新和历史数据查看
- 可设置自动刷新间隔
示例查询:
SELECT mean("temp") AS "temperature",
mean("humi") AS "humidity",
mean("press") AS "pressure",
mean("flow") AS "flow_rate"
FROM "sensor_data"
WHERE $timeFilter
GROUP BY time($__interval) fill(null)
4.2 告警设置
Grafana提供了强大的告警功能,可以基于数据设置各种告警规则:
-
告警规则设置:
- 在面板编辑中启用告警
- 设置条件,如: 当温度>30°C持续5分钟
- 配置告警频率和等待时间
-
通知渠道:
- 邮件通知
- Slack消息
- WebHook回调
-
告警状态:
- OK: 正常状态
- Pending: 满足条件但未达到持续时间
- Alerting: 触发告警
-
告警历史:
- 记录所有告警事件
- 支持查看和分析历史告警
告警流程图:
通过这些详细的告警设置,管理人员可以及时发现并处理异常情况,大大提高了生产效率和安全性。
4.3 数据分析功能
除了实时监控,Grafana还提供了强大的数据分析功能:
-
数据聚合:
- 支持各种聚合函数:平均值、最大值、最小值等
- 可按不同时间间隔聚合:小时、天、周、月
-
数据对比:
- 支持同比、环比分析
- 可创建多时间序列对比图表
-
数据导出:
- CSV格式导出原始数据
- 图表导出为图片或PDF
-
自定义查询:
- 支持直接编写InfluxQL查询语句
- 可创建复杂的多指标分析图表
示例:温度趋势分析查询
SELECT mean("temp") AS "avg_temp",
max("temp") AS "max_temp",
min("temp") AS "min_temp"
FROM "sensor_data"
WHERE $timeFilter
GROUP BY time(1h) fill(null)
5. 项目总结
5.1 系统优势
- 实时性: 基于MQTT协议的实时数据传输,保证了监控的及时性。
- 可扩展性: 采用模块化设计,易于添加新的传感器和功能。
- 可视化能力: 利用Grafana强大的可视化功能,直观展示设备状态。
- 告警机制: 灵活的告警设置,帮助及时发现并处理异常情况。
- 数据分析: 支持历史数据查询和分析,辅助决策制定。