基于STM32的大棚温湿度测量设备的远程监测设计:Modbus RTU、MQTT、阿里云物联网平台(代码示例)

在这里插入图片描述

一、项目概述

目标和用途

随着物联网技术的快速发展,越来越多的设备需要通过网络进行数据交互与监控。本项目旨在设计并实现一个基于Modbus通信协议的通用物联网网关,能够从Modbus RTU总线设备获取数据,并通过MQTT协议将数据上传到阿里云物联网平台。用户可以通过PC网页或智能手机APP实时查看设备的运行状态。以大棚温湿度测量设备的远程监测为例,展示如何使用该网关进行数据采集和监控。

技术栈关键词

  • 单片机:STM32F429

  • 无线通信模块:ESP8266

  • 通信协议:Modbus RTU, MQTT

  • 云平台:阿里云物联网平台

  • 编程语言:C/C++

二、系统架构

系统架构设计

系统架构包括以下几个关键组件:

  1. 数据采集模块:使用STM32F429通过RS485接口与Modbus RTU设备通信,获取温湿度等数据。

  2. 数据处理模块:STM32F429对获取的数据进行解析、处理和校验。

  3. 无线通信模块:ESP8266负责将处理后的数据通过MQTT协议发送到阿里云物联网平台。

  4. 用户界面:用户可以通过PC网页或智能手机APP实时查看数据,进行远程监控。

选择合适的硬件和技术栈

  • 单片机:选择STM32F429,提供强大的计算能力和丰富的外设接口,适合实时数据处理。

  • 通信模块:使用ESP8266进行无线网络连接,支持MQTT协议,适合物联网应用。

  • 传感器:选择支持Modbus RTU协议的温湿度传感器(如DHT22),以便获取环境数据。

系统架构图

RS485
数据处理
MQTT协议
数据展示
数据展示
Modbus RTU 设备
STM32F429
ESP8266
阿里云物联网平台
PC网页
智能手机APP

三、环境搭建和注意事项

环境搭建

  1. 开发环境:

    • 单片机开发:安装STM32CubeIDE或Keil进行STM32开发。

    • 无线模块开发:安装Arduino IDE或PlatformIO用于ESP8266开发。

  2. 库文件:

    • STM32使用mbedFreeRTOS库。

    • ESP8266使用PubSubClient库实现MQTT功能。

  3. 云平台配置:

    • 注册阿里云账号并创建物联网实例。

    • 配置设备,获取设备ID和秘钥,以便进行数据上传。

注意事项

  • 电源管理:确保STM32和ESP8266的电源稳定,避免因电源问题导致的数据丢失。

  • RS485连接:通过适当的电阻和布线方式连接RS485设备,确保通信稳定。

  • 安全性:在使用MQTT协议时,确保使用加密连接(如TLS)以增强数据安全性。

四、代码实现过程

模块划分

项目主要分为以下几个模块:

  1. Modbus通信模块

  2. 数据处理模块

  3. MQTT上传模块

1. Modbus通信模块

该模块负责从Modbus RTU设备获取数据。

流程图
开始
初始化UART
发送Modbus请求
接收Modbus响应
解析响应数据
返回解析数据
结束
示例代码
#include "stm32f4xx_hal.h"
#include "modbus.h"

// Modbus RTU 读取函数
void Modbus_Read_Temperature_Humidity() {
    
    
    uint8_t request[] = {
    
    0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B}; // 请求包
    HAL_UART_Transmit(&huart1, request, sizeof(request), HAL_MAX_DELAY);
    
    uint8_t response[7]; // 根据设备返回的数据长度定义响应数组
    HAL_UART_Receive(&huart1, response, sizeof(response), HAL_MAX_DELAY);

    // 解析响应数据
    if (response[0] == 0x01 && response[1] == 0x03) {
    
    
        float temperature = ((response[3] << 8) | response[4]) / 10.0;
        float humidity = ((response[5] << 8) | response[6]) / 10.0;
        // 在这里可以将温湿度存储或发送到MQTT
    }
}

2. 数据处理模块

此模块对获取的温湿度数据进行处理,以便进行后续的数据上传。

流程图
有效
无效
开始
获取温湿度数据
检查数据有效性
进行数据处理
准备MQTT数据包
结束
返回错误信息
示例代码
void Process_Data(float temperature, float humidity) {
    
    
    // 检查数据有效性
    if (temperature < -40 || temperature > 125) {
    
    
        // 数据无效,处理错误
        return;
    }
    if (humidity < 0 || humidity > 100) {
    
    
        // 数据无效,处理错误
        return;
    }

    // 进行数据处理(如滤波、平均等)
    // 这里可以添加复杂的处理逻辑

    // 准备MQTT数据包
    char mqtt_payload[100];
    snprintf(mqtt_payload, sizeof(mqtt_payload), "{\"temperature\": %.1f, \"humidity\": %.1f}", temperature, humidity);
    Publish_To_MQTT(mqtt_payload);
}

3. MQTT上传模块

此模块负责将处理后的数据通过MQTT协议上传到阿里云物联网平台。

流程图
开始
连接MQTT服务器
发送数据包
确认接收
结束
示例代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// MQTT相关参数
const char* mqtt_server = "your_mqtt_server";
const char* mqtt_user = "your_username";  // 如果需要
const char* mqtt_password = "your_password"; // 如果需要
const char* topic = "your/topic";

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    
    
    // 初始化WiFi连接
    WiFi.begin("your_SSID", "your_PASSWORD");
    while (WiFi.status() != WL_CONNECTED) {
    
    
        delay(1000);
    }

    // 初始化MQTT客户端
    client.setServer(mqtt_server, 1883);
}

void Publish_To_MQTT(const char* payload) {
    
    
    if (!client.connected()) {
    
    
        // 重新连接
        while (!client.connected()) {
    
    
            if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
    
    
                // 连接成功
            } else {
    
    
                delay(5000);
            }
        }
    }
    client.publish(topic, payload);
}

五、项目总结

主要功能

本项目实现了一个基于Modbus协议的物联网网关,能够通过RS485接口与Modbus RTU设备进行数据交互,并通过MQTT协议将数据上传至阿里云物联网平台。用户可以通过PC网页或智能手机APP实时查看设备的运行状态。

实现过程

  1. 环境搭建:选择合适的硬件(STM32F429和ESP8266),并配置开发环境及所需库文件。确保RS485接口与Modbus设备的连接正确,提供稳定的电源。

  2. 系统设计:设计系统架构并选择适合的通信协议。实现了Modbus RTU设备的数据读取、数据处理与校验,以及通过MQTT协议将数据上传至云端的完整流程。

  3. 代码实现:分模块实现代码,包括Modbus通信、数据处理、MQTT上传等功能,确保代码逻辑清晰、易于维护。每个模块的功能都经过详细测试,确保数据准确性和可靠性。

  4. 用户界面:通过阿里云物联网平台的功能,用户可以方便地通过网页或APP查看传感器数据,监控设备状态,进行远程管理。

项目亮点

  • 通用性:该网关可支持各种Modbus RTU设备,具有良好的扩展性。

  • 实时监控:通过MQTT协议实现实时数据上传,用户可随时获取设备的运行状态。

  • 云平台集成:与阿里云物联网平台的深度集成,支持数据存储和大数据分析。