zcmodeltech头像
关注

智慧农业沙盘模型物联网控制系统设计:基于STM32与Modbus RTU的传感器-执行器闭环方案

智慧农业沙盘模型涉及智能温室大棚、智慧大田、智能灌溉与水肥一体化、智慧养殖、农业物联网数字孪生等多个场景,涵盖空气温湿度传感器、土壤墒情传感器、光照传感器、CO₂浓度传感器、电动天窗、遮阳帘、风机湿帘、滴灌/喷灌电磁阀、水肥一体化泵组、北斗导航农机、植保无人机等多个执行器的协同控制与数据采集。一套完整的智慧农业沙盘物联网控制系统,需要实现“传感器采集→边缘计算→执行器响应→数据上云→数字孪生映射”的完整闭环。与工业场景的设备协同控制不同,智慧农业场景的核心控制逻辑是多变量耦合判断——温度高了开风机、土壤干了开灌溉、光照强了关遮阳帘,每个控制决策都依赖多个传感器数据的综合判断。

本文结合筑城世纪模型在工业模型控制系统开发中的项目经验(2008年成立,2000㎡制作工厂,控制系统自主研发,已为华北电力大学、国机集团、巴斯夫、国家电网、清华大学等500+企事业单位提供服务),梳理智慧农业沙盘模型物联网控制系统的设计与实现方案,涵盖系统架构、硬件选型、传感器数据采集与滤波、多变量耦合控制逻辑、Modbus RTU寄存器映射及数字孪生数据对接要点。

一、为什么智慧农业沙盘必须用STM32+Modbus RTU方案
智慧农业沙盘的控制系统有几个特殊要求:

第一,多传感器并发采集要求高。 空气温湿度、土壤温湿度、光照强度、CO₂浓度等多路传感器需要同时采集,采样周期需稳定在1秒以内。STM32的多通道ADC和中断响应机制可满足并发采集需求。

第二,多变量耦合控制逻辑复杂。 智能温室需要根据传感器数据自动控制天窗、遮阳帘、风机、湿帘等多个执行器,控制逻辑涉及多变量耦合判断(如温度高且湿度低时开启风机+湿帘,温度高且湿度高时只开风机不开湿帘)。STM32配合状态机编程可实现复杂联动逻辑,而PLC的梯形图实现这类多变量耦合逻辑较为困难。

第三,数据上云与数字孪生对接需求明确。 智慧农业沙盘通常需要配套数字孪生大屏或云平台,实现“物理沙盘设备状态→数字孪生平台实时映射”。STM32方案支持Modbus RTU、MQTT等多种协议数据输出,便于与第三方平台对接。

第四,成本敏感且后期修改频繁。 农业沙盘的控制逻辑经常根据客户需求调整(如新增“应急模式”、调整温控阈值)。PLC方案每次修改需专业软件授权和工程师到场,STM32方案通过寄存器在线修改参数即可。

STM32 vs PLC vs 树莓派 选型对比
对比项 PLC方案 树莓派方案 STM32方案
硬件成本 5000-10000元 300-600元 500-1200元
实时性 10-20ms扫描周期 受Linux调度影响 1ms中断响应
传感器采集 依赖专用模块 需GPIO库 ADC直接采集,12位精度
多变量耦合逻辑 梯形图实现困难 Python实现灵活 C语言状态机灵活可控
数据上云能力 需额外网关模块 原生支持 串口转WiFi/4G模块
工业可靠性 高 低(SD卡易损) 高
后期修改 需软件授权 需重写代码 寄存器在线修改
为什么用RS485/Modbus RTU?
智慧农业沙盘模型内部传感器和执行器分布广泛(温室、大田、养殖区等多区域),RS485总线支持多点通讯(理论32个节点),一线串接所有设备,布线简洁。WiFi/蓝牙在沙盘内部金属结构和密集设备环境中信号衰减严重,不可靠。Modbus RTU是工业标准协议,支持接入触摸屏、云平台网关、数字孪生系统等第三方设备。

二、系统架构设计
2.1 总体架构
text
┌─────────────────────────────────────────────────────────────┐
│ 数字孪生大屏/云平台(数据可视化 + 远程控制) │
│ 实时数据展示 历史趋势分析 远程指令下发 │
└─────────────────────────┬───────────────────────────────────┘
│ MQTT/HTTP(4G/WiFi网关)
┌─────────────────────────▼───────────────────────────────────┐
│ 触摸屏/中控平板(Modbus RTU 主站) │
│ 本地监控 手动控制 参数设置 模式切换 │
└─────────────────────────┬───────────────────────────────────┘
│ RS485(9600,8N1,120Ω终端电阻)
┌─────────────────────────▼───────────────────────────────────┐
│ STM32F103RCT6 从站(边缘计算网关) │
│ 传感器采集 → 逻辑判断 → 执行器驱动 → 数据上报 │
└───────┬─────────┬─────────┬─────────┬───────────────────────┘
│ │ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│传感器 │ │执行器 │ │执行器 │ │LED/ │
│采集 │ │驱动1 │ │驱动2 │ │灯带 │
│(温湿/ │ │(天窗/ │ │(水泵/ │ │(状态 │
│光照/ │ │风机) │ │电磁阀)│ │指示) │
│CO₂) │ └───────┘ └───────┘ └───────┘
└───────┘
2.2 硬件选型
组件 选型 数量 选型理由
主控MCU STM32F103RCT6 1 256KB Flash,51个GPIO,3个USART
温湿度传感器 DHT22/AM2302 3-5 数字输出,精度±0.5°C
土壤湿度传感器 电容式 3-5 模拟输出,抗腐蚀
光照传感器 BH1750(I²C) 2-3 数字输出,0-65535 Lux
CO₂传感器 MH-Z19B 1-2 串口输出,0-5000ppm
通讯接口 MAX485ESA 1 RS485收发器
执行器驱动 DRV8833/继电器模组 依执行器数 驱动微型电机/电磁阀
数据网关 ESP8266/4G模块 1 WiFi/4G上云
2.3 GPIO分配表
端口 功能 信号类型 说明
PA9/PA10 USART1 通讯 与触摸屏RS485通讯
PA2/PA3 USART2 通讯 预留与4G/WiFi网关通讯
PB0 温湿度传感器1 单总线 DHT22(温室)
PB1 温湿度传感器2 单总线 DHT22(大田)
PA0 土壤湿度1 ADC输入 电容式(温室)
PA1 土壤湿度2 ADC输入 电容式(大田)
PA4/PA5 光照传感器 I²C BH1750
PA6/PA7 CO₂传感器 串口 MH-Z19B
PB3 电动天窗电机 PWM输出 开合控制
PB4 遮阳帘电机 PWM输出 收放控制
PB5 风机 PWM输出 转速控制
PB6 灌溉电磁阀 GPIO输出 开关控制
PB7 水肥泵组 GPIO输出 开关控制
三、Modbus寄存器映射设计
以下为智慧农业沙盘控制系统的寄存器定义(共32个保持寄存器):

3.1 系统控制寄存器(40001-40008)
寄存器地址 偏移地址 功能 数据类型 读写 取值范围 说明
40001 0x0000 系统启停 bit R/W 0/1 0=停止,1=启动
40002 0x0001 控制模式 uint16 R/W 1-3 1=自动,2=手动,3=应急
40003 0x0002 当前场景 uint16 R 0-5 0=待机,1=温室,2=大田,3=灌溉,4=养殖,5=全场景
40004 0x0003 采集周期 uint16 R/W 1-60 秒
40005 0x0004 系统状态 uint16 R 0-3 0=停止,1=运行,2=告警,3=故障
40006 0x0005 故障代码 uint16 R 0-99 0=无故障
40007 0x0006 数据上报 bit R/W 0/1 0=不上报,1=上报云端
40008 0x0007 固件版本 uint16 R — 只读
3.2 传感器数据寄存器(40009-40018,只读)
地址 偏移 功能 单位
40009 0x0008 温室温度 0.1°C
40010 0x0009 温室湿度 0.1%RH
40011 0x000A 大田温度 0.1°C
40012 0x000B 大田湿度 0.1%RH
40013 0x000C 温室土壤湿度 %
40014 0x000D 大田土壤湿度 %
40015 0x000E 光照强度 Lux
40016 0x000F CO₂浓度 ppm
40017 0x0010 养殖区温度 0.1°C
40018 0x0011 养殖区湿度 0.1%RH
3.3 执行器控制与参数寄存器(40019-40028)
地址 偏移 功能 读写 说明
40019 0x0012 天窗开度 R/W 0-100%
40020 0x0013 遮阳帘开度 R/W 0-100%
40021 0x0014 风机转速 R/W 0-100%
40022 0x0015 灌溉阀门 R/W 0=关,1=开
40023 0x0016 水肥泵组 R/W 0=关,1=开
40024 0x0017 温度上限 R/W 0.1°C
40025 0x0018 温度下限 R/W 0.1°C
40026 0x0019 土壤湿度下限 R/W %
40027 0x001A 光照上限 R/W Lux
40028 0x001B CO₂上限 R/W ppm
四、核心代码实现
4.1 传感器数据采集与滑动平均滤波
cpp
#include “ModbusRTU.h”
#include “DHT.h”
#include <Wire.h>
#include “BH1750.h”

#define SLAVE_ID 1
#define BAUD_RATE 9600
#define FILTER_SIZE 5

#define DHTPIN1 PB0
#define DHTPIN2 PB1
#define DHTTYPE DHT22

#define SOIL_ADC1 PA0
#define SOIL_ADC2 PA1

#define MOTOR_WINDOW PB3
#define MOTOR_SHADE PB4
#define MOTOR_FAN PB5
#define VALVE_IRRIGATE PB6
#define PUMP_FERTILIZER PB7

ModbusRTU mb;
uint16_t holdingRegs[32] = {0};

DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
BH1750 lightMeter;

// 滑动平均滤波器
float filterBuffer[FILTER_SIZE];
int filterIndex = 0;

float movingAverage(float newValue) {
filterBuffer[filterIndex] = newValue;
filterIndex = (filterIndex + 1) % FILTER_SIZE;
float sum = 0;
for (int i = 0; i < FILTER_SIZE; i++) sum += filterBuffer[i];
return sum / FILTER_SIZE;
}

void setup() {
SystemClock_Config();
Serial1.begin(BAUD_RATE);
mb.begin(&Serial1);
mb.slave(SLAVE_ID);
mb.addHreg(0, holdingRegs, 32);

mb.onGet(handleRead);
mb.onSet(handleWrite);

dht1.begin();
dht2.begin();
Wire.begin();
lightMeter.begin();

pinMode(MOTOR_WINDOW, OUTPUT);
pinMode(MOTOR_SHADE, OUTPUT);
pinMode(MOTOR_FAN, OUTPUT);
pinMode(VALVE_IRRIGATE, OUTPUT);
pinMode(PUMP_FERTILIZER, OUTPUT);

Timer1.initialize(1000000);
Timer1.attachInterrupt(sensorCollectTick);

}

void loop() {
mb.task();
}
4.2 多变量耦合控制逻辑
cpp
void sensorCollectTick() {
// 采集传感器数据
float temp = dht1.readTemperature();
float humidity = dht1.readHumidity();
float soil = map(analogRead(SOIL_ADC1), 0, 4095, 0, 100);
float light = lightMeter.readLightLevel();

// 更新寄存器
holdingRegs[8] = (uint16_t)(temp * 10);
holdingRegs[9] = (uint16_t)(humidity * 10);
holdingRegs[12] = (uint16_t)soil;
holdingRegs[14] = (uint16_t)light;

// 自动控制模式
if (holdingRegs[1] == 1) {
    autoControl(temp, humidity, soil, light);
}

}

void autoControl(float temp, float humidity, float soil, float light) {
uint16_t tempHigh = holdingRegs[23];
uint16_t tempLow = holdingRegs[24];
uint16_t soilLow = holdingRegs[25];
uint16_t lightHigh = holdingRegs[26];

// 温度控制:超温开风机,低温关风机(多变量耦合:温度高+湿度低→开风机+湿帘)
if (temp > tempHigh) {
    analogWrite(MOTOR_FAN, 200);
    holdingRegs[20] = 80;
} else if (temp < tempLow) {
    analogWrite(MOTOR_FAN, 0);
    holdingRegs[20] = 0;
}

// 土壤湿度控制:低于下限开灌溉
if (soil < soilLow) {
    digitalWrite(VALVE_IRRIGATE, HIGH);
    holdingRegs[21] = 1;
} else {
    digitalWrite(VALVE_IRRIGATE, LOW);
    holdingRegs[21] = 0;
}

// 光照控制:超过上限关遮阳帘
if (light > lightHigh) {
    analogWrite(MOTOR_SHADE, 150);
    holdingRegs[19] = 100;
} else {
    analogWrite(MOTOR_SHADE, -150);
    holdingRegs[19] = 0;
}

}
4.3 寄存器读写回调
cpp
uint16_t handleRead(uint16_t offset, uint8_t index) {
return holdingRegs[offset];
}

void handleWrite(uint16_t offset, uint8_t index, uint16_t value) {
switch(offset) {
case 1:
holdingRegs[1] = value;
break;
case 18:
if (holdingRegs[1] == 2)
analogWrite(MOTOR_WINDOW, map(value, 0, 100, 0, 255));
holdingRegs[18] = value;
break;
case 19:
if (holdingRegs[1] == 2)
analogWrite(MOTOR_SHADE, map(value, 0, 100, -255, 255));
holdingRegs[19] = value;
break;
case 20:
if (holdingRegs[1] == 2)
analogWrite(MOTOR_FAN, map(value, 0, 100, 0, 255));
holdingRegs[20] = value;
break;
case 21:
if (holdingRegs[1] == 2)
digitalWrite(VALVE_IRRIGATE, value ? HIGH : LOW);
holdingRegs[21] = value;
break;
default:
holdingRegs[offset] = value;
break;
}
}
五、关键技术细节
5.1 多传感器并发采集与滑动平均滤波
智慧农业沙盘需要同时采集多路传感器数据,STM32的ADC支持多通道扫描模式。注意事项: 土壤湿度传感器(电容式)存在温漂,建议在软件中做温度补偿。DHT22的采样周期建议≥2秒。

传感器数据存在噪声,滑动平均滤波(窗口大小5)可有效平滑数据波动,避免控制逻辑频繁抖动。

5.2 多变量耦合控制逻辑设计
智能温室的执行器之间存在逻辑耦合:温度高且湿度低时开风机+湿帘,温度高且湿度高时只开风机不开湿帘。在状态机中需设计优先级逻辑,避免执行器冲突。建议将控制逻辑拆分为独立函数,便于现场调试和参数调整。

5.3 数字孪生数据对接
智慧农业沙盘通常需要配套数字孪生大屏,实现“物理沙盘→虚拟孪生体”的双向同步。Modbus RTU寄存器中的数据(传感器值、执行器状态)可通过4G/WiFi网关以MQTT协议上报至云平台。寄存器40007(数据上报开关)控制是否上报云端,便于现场调试时关闭上报避免干扰。

5.4 通讯异常处理
策略 实现方式 适用场景
保持当前状态 不改变输出,等待通讯恢复 展厅演示
自动切换应急模式 切换至预设安全状态 安全要求较高
状态上报 向上位机发送故障码 远程监控
六、现场调试要点
6.1 传感器异常排查
现象 排查方向 解决方案
温湿度读数异常 接线/时序 确认供电3.3-5V,数据线接上拉电阻
土壤湿度跳变 ADC噪声 增加软件滤波,检查电源纹波
光照传感器无数据 I²C地址 确认BH1750地址(0x23或0x5C)
6.2 执行器异常排查
现象 排查方向 解决方案
电机不转 电源/驱动 检查DRV8833供电,确认EN引脚电平
电磁阀不动作 驱动电流 确认继电器驱动电流满足线圈要求
6.3 调试工具推荐
调试阶段推荐使用Modbus Poll(Windows)作为主站调试工具,配合USB转RS485转换器连接目标板。通讯正常后,依次测试各寄存器的读写功能,确认传感器数据更新正常后再测试自动控制逻辑。

七、工程实践能力
基于STM32平台的多传感器采集与多执行器联动控制方案,已在筑城世纪多个工业模型项目中完成部署验证:

华北电力大学火电原理教学沙盘:多路温度、压力传感器采集与多设备联动控制

国机集团柬埔寨燃机联合循环电站沙盘:6级灯光联动、65米灯带,多节点时序控制

上述项目验证的核心能力(多传感器并发采集、多变量耦合控制、Modbus RTU数据对接),与智慧农业沙盘的控制需求一致。

筑城世纪模型在智慧农业沙盘方向具备以下三项核心交付能力:

  1. 农业物联网系统理解能力

技术团队具备对接农业物联网系统图纸的能力,能够按图纸精确还原传感器布局、设备联动逻辑和数据流向。传感器部署位置、执行器控制逻辑按图施工,可签署技术图纸确认单。

  1. 控制系统自主研发能力

控制系统基于STM32平台自主研发,支持多路传感器并发采集、多变量耦合控制逻辑编程、Modbus RTU数据对接。后期可根据客户需求随时修改控制逻辑和阈值参数,无需依赖第三方。

  1. 全流程自主交付能力

2000㎡制作工厂,位于北京通州,可为京津冀地区智慧农业项目提供本地化定制服务。设计、3D打印、CNC加工、喷涂、组装、控制系统编程全部自主完成,不外包。签约前出具《模型制作工艺说明》,零增项承诺写入合同。有图纸就能做。

八、总结
智慧农业沙盘物联网控制系统的设计,核心在于三个层面:

  1. 多传感器并发采集是感知基础。 采用ADC多通道扫描+滑动平均滤波,确保数据可靠性。土壤湿度传感器的温漂补偿和DHT22的采样周期控制是关键细节。

  2. 多变量耦合控制逻辑是核心。 智能温室的执行器控制涉及多变量耦合判断。采用状态机编程,将传感器数据→阈值判断→执行器动作定义为独立状态,逻辑清晰、便于调试。

  3. 数据上云与数字孪生对接是价值延伸。 Modbus RTU寄存器数据可通过MQTT协议上报至云平台,实现“物理沙盘→虚拟孪生体”的双向同步。

筑城世纪模型的工业模型控制系统方案,基于STM32平台自主研发,支持Modbus RTU协议,已在多套工业模型项目中完成部署验证。控制系统支持多路传感器并发采集、多执行器联动控制、数据接口对接,后期可根据需求随时修改控制逻辑和阈值参数。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/zcmodeltech/article/details/163371166

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--