首页 > 编程语言 >嵌入式C++、STM32F103、MQTT、InfluxDB存储和Grafana可视化:工厂设备的实时监控和数据分析系统流程(代码示例)

嵌入式C++、STM32F103、MQTT、InfluxDB存储和Grafana可视化:工厂设备的实时监控和数据分析系统流程(代码示例)

时间:2024-07-22 11:54:09浏览次数:15  
标签:STM32F103 temp 示例 InfluxDB MQTT client 传感器 告警 数据分析系统

1. 项目概述

随着工业4.0的推进,智能制造已成为制造业发展的必然趋势。本文介绍了一套基于STM32和MQTT协议的小型工厂设备监控系统,可实现对工厂设备的实时监控和数据分析,有效提高生产效率和安全性。

系统主要包括三个部分:

  1. 设备端:使用STM32 MCU连接各种传感器,采集设备运行数据并通过MQTT协议发送
  2. 本地服务器:运行MQTT Broker接收数据,使用InfluxDB存储,Grafana可视化
  3. 管理端:通过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的主要配置步骤:

  1. 数据源配置:

  2. 仪表板创建:

    • 新建仪表板
    • 添加面板,选择InfluxDB数据源
    • 使用InfluxQL查询语言编写查询
  3. 面板类型:

    • 折线图: 显示温度、湿度、压力、流量随时间的变化趋势
    • 仪表盘: 显示当前各参数值
    • 热力图: 展示参数分布情况
  4. 时间范围设置:

    • 支持实时更新和历史数据查看
    • 可设置自动刷新间隔

示例查询:

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提供了强大的告警功能,可以基于数据设置各种告警规则:

  1. 告警规则设置:

    • 在面板编辑中启用告警
    • 设置条件,如: 当温度>30°C持续5分钟
    • 配置告警频率和等待时间
  2. 通知渠道:

    • 邮件通知
    • Slack消息
    • WebHook回调
  3. 告警状态:

    • OK: 正常状态
    • Pending: 满足条件但未达到持续时间
    • Alerting: 触发告警
  4. 告警历史:

    • 记录所有告警事件
    • 支持查看和分析历史告警

告警流程图:

通过这些详细的告警设置,管理人员可以及时发现并处理异常情况,大大提高了生产效率和安全性。

4.3 数据分析功能

除了实时监控,Grafana还提供了强大的数据分析功能:

  1. 数据聚合:

    • 支持各种聚合函数:平均值、最大值、最小值等
    • 可按不同时间间隔聚合:小时、天、周、月
  2. 数据对比:

    • 支持同比、环比分析
    • 可创建多时间序列对比图表
  3. 数据导出:

    • CSV格式导出原始数据
    • 图表导出为图片或PDF
  4. 自定义查询:

    • 支持直接编写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 系统优势

  1. 实时性: 基于MQTT协议的实时数据传输,保证了监控的及时性。
  2. 可扩展性: 采用模块化设计,易于添加新的传感器和功能。
  3. 可视化能力: 利用Grafana强大的可视化功能,直观展示设备状态。
  4. 告警机制: 灵活的告警设置,帮助及时发现并处理异常情况。
  5. 数据分析: 支持历史数据查询和分析,辅助决策制定。

标签:STM32F103,temp,示例,InfluxDB,MQTT,client,传感器,告警,数据分析系统
From: https://blog.csdn.net/qq_40431685/article/details/140568961

相关文章

  • 嵌入式C++、InfluxDB、Spark、MQTT协议、和Dash:树莓派集群物联网数据中心设计与实现(代
    1.项目概述随着物联网技术的快速发展,如何高效地收集、存储和分析海量IoT设备数据成为一个重要课题。本文介绍了一个基于树莓派集群搭建的小型物联网数据中心,实现了从数据采集到分析可视化的完整流程。该系统采用轻量级组件,适合资源受限的边缘计算环境。主要功能包括:通......
  • 即使通过了示例测试用例,Dijkstra 算法也不起作用
    所以我遵循了维基百科关于Dijkstra算法和Brilliants的伪代码。https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Pseudocodehttps://brilliant.org/wiki/dijkstras-short-路径查找器/这是我的代码,它不起作用。谁能指出我的代码中的缺陷吗?#Usespyt......
  • 使用vue-router创建一个简单示例
    以下是一个完整的Vue.js应用示例,展示了如何创建一个简单的Vue.js应用,并使用VueRouter实现不同组件页面之间的导航。这个示例包括组件页面、路由配置以及如何构建和搭建这些页面。1.创建项目首先,创建一个新的Vue3项目:npminitvue@latest按照提示完成项目初始化......
  • 超好用!空号检测接口使用与调用示例
    空号检测接口是通过调用第三方提供的API接口,实现对手机号码是否为空号的检测服务。它可以帮助快速、准确地识别出无效号码,避免无效的通信,提高通信效率,适用于短信群发、电话营销、注册验证等场景。一、在选择空号检测接口时,你可以考虑以下因素:1.数据准确性:确保接口提供的检......
  • STM32H7基于STM32CubeMX的以太网示例
    本自述文件适用于STM32CubeIDE版本1.9.0和STM32CubeH7版本1.10.0。对于较旧的工具版本,请参阅存储库中的此自述文件的较旧版本基于LwIP和FreeRTOS的简单以太网示例,运行在STNucleo和Discovery板上。这些例子附在ST社区的FAQ文章中。下面也提供了同样的步骤#特性*固定IP地址192......
  • STM32H7基于STM32CubeMX的以太网示例
    本自述文件适用于STM32CubeIDE版本1.9.0和STM32CubeH7版本1.10.0。对于较旧的工具版本,请参阅存储库中的此自述文件的较旧版本基于LwIP和FreeRTOS的简单以太网示例,运行在STNucleo和Discovery板上。这些例子附在ST社区的FAQ文章中。下面也提供了同样的步骤#特性*固定IP地址192......
  • STM32H7基于STM32CubeMX的以太网示例
    本自述文件适用于STM32CubeIDE版本1.9.0和STM32CubeH7版本1.10.0。对于较旧的工具版本,请参阅存储库中的此自述文件的较旧版本基于LwIP和FreeRTOS的简单以太网示例,运行在STNucleo和Discovery板上。这些例子附在ST社区的FAQ文章中。下面也提供了同样的步骤#特性*固定IP地址192......
  • xlsx 前端插件 导出 elment表格示例
    安装yarnaddxlsxyarnaddfile-savergit文档:https://github.com/rockboom/SheetJS-docs-zh-CNnpm地址:https://www.npmjs.com/package/xlsx代码<template> <divclass='box'> pageC <el-buttontype="primary"size="defa......
  • 在 PowerShell 中,可以编写脚本来检测本地加载和远程加载的情况。这通常涉及到检查计算
    在PowerShell中,可以编写脚本来检测本地加载和远程加载的情况。这通常涉及到检查计算机上的特定服务或应用程序的状态或配置。以下是一些示例脚本和方法,可以用来实现这些检测:检测本地加载示例:检查本地服务的运行状态powershellCopyCode#检查本地服务状态$serviceName="M......
  • 在 PowerShell 中,"本地加载"和"远程加载"通常指的是运行脚本或命令的位置或方式。以下
    在PowerShell中,"本地加载"和"远程加载"通常指的是运行脚本或命令的位置或方式。以下是关于本地加载和远程加载的一些基本概念和示例:本地加载本地加载指的是在当前计算机上执行PowerShell脚本或命令。这些脚本和命令直接在本地计算机上运行,无需通过网络连接到其他计算机或服......