智慧农业沙盘模型物联网控制系统设计:基于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 holdingRegs32 = {0};

DHT dht1(DHTPIN1, DHTTYPE);

DHT dht2(DHTPIN2, DHTTYPE);

BH1750 lightMeter;

// 滑动平均滤波器

float filterBufferFILTER_SIZE;

int filterIndex = 0;

float movingAverage(float newValue) {

filterBufferfilterIndex = newValue;

filterIndex = (filterIndex + 1) % FILTER_SIZE;

float sum = 0;

for (int i = 0; i < FILTER_SIZE; i++) sum += filterBufferi;

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 = holdingRegs23;

uint16_t tempLow = holdingRegs24;

uint16_t soilLow = holdingRegs25;

uint16_t lightHigh = holdingRegs26;

复制代码
// 温度控制:超温开风机,低温关风机(多变量耦合:温度高+湿度低→开风机+湿帘)
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 holdingRegsoffset;

}

void handleWrite(uint16_t offset, uint8_t index, uint16_t value) {

switch(offset) {

case 1:

holdingRegs1 = value;

break;

case 18:

if (holdingRegs1 == 2)

analogWrite(MOTOR_WINDOW, map(value, 0, 100, 0, 255));

holdingRegs18 = value;

break;

case 19:

if (holdingRegs1 == 2)

analogWrite(MOTOR_SHADE, map(value, 0, 100, -255, 255));

holdingRegs19 = value;

break;

case 20:

if (holdingRegs1 == 2)

analogWrite(MOTOR_FAN, map(value, 0, 100, 0, 255));

holdingRegs20 = value;

break;

case 21:

if (holdingRegs1 == 2)

digitalWrite(VALVE_IRRIGATE, value ? HIGH : LOW);

holdingRegs21 = value;

break;

default:

holdingRegsoffset = 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协议,已在多套工业模型项目中完成部署验证。控制系统支持多路传感器并发采集、多执行器联动控制、数据接口对接,后期可根据需求随时修改控制逻辑和阈值参数。

相关推荐
想你依然心痛1 小时前
HarmonyOS 5.0智慧农业开发实战:构建分布式农业物联网与区块链农产品溯源系统
人工智能·分布式·物联网·区块链·智慧农业·harmonyos·开发实战
邪修king1 小时前
Re:Linux系统篇(六):动静态库 & 链接机制【完整透彻版】
linux·运维·服务器
WD1372980155711 小时前
WD5030L,超高集成度、大电流输出、高效率低发热,限流24V转12V,6A
stm32·单片机·嵌入式硬件·51单片机
~光~~13 小时前
【xv6学习】L0_环境配置
单片机·嵌入式硬件·学习
重生的黑客14 小时前
Linux 进程程序替换与自定义 Shell:从 exec 函数族到命令行解释器
linux·运维·服务器·shell
北极糊的狐14 小时前
阿里云服务器-命令2-Linux 系统实时资源监视器 top 命令详解(进程级实时资源监控)
linux·运维·服务器
珠***格14 小时前
分布式光伏电站:四可装置如何实现 “可观、可测、可控、可调”
网络·人工智能·分布式·架构·能源
三言老师15 小时前
clear与history历史命令管理实操
linux·运维·服务器·网络·centos
映翰通网络16 小时前
TI开发板上的边缘AI工具链:先认清OpenCV、GStreamer和TIDL
人工智能·嵌入式硬件·opencv·计算机视觉·ti