农业教学实训沙盘物联网控制系统设计:基于STM32与Modbus RTU的“感知-控制-实训”一体化方案 农业教学实训沙盘模型覆盖智能温室教学实训沙盘、智慧大田教学实训模型、畜牧养殖教学实训沙盘、农业物联网教学实训沙盘等场景涉及环境传感器网络温湿度、光照、CO₂、土壤墒情、执行器系统天窗电机、遮阳帘电机、风机、电磁阀、水泵以及物联网通信网关等多设备的协同控制与数据采集。一套完整的农业教学实训沙盘物联网控制系统需要实现“传感器采集→边缘计算→执行器响应→数据上云→数字孪生映射”的完整闭环同时支持“演示模式”与“实训模式”双模式切换——演示模式下系统自动运行展示完整控制逻辑实训模式下学生可通过中控台或平板电脑修改控制参数、观察系统响应实现“可教可练”的教学目标。与已发CSDN工业模型文章聚焦多设备时序协同控制不同本文聚焦农业教学实训场景的“传感器-执行器闭环控制双模式切换”——温度高了自动开风机、光照强了自动关遮阳帘、土壤干了自动开灌溉每个控制逻辑都需通过中控屏实时展示同时预留物联网实验接口支持学生动手实训。本文结合筑城世纪模型在教学实训沙盘控制系统开发中的项目经验2008年成立2000㎡制作工厂控制系统自主研发已为华北电力大学、国机集团、巴斯夫、国家电网、清华大学等500企事业单位提供服务梳理农业教学实训沙盘物联网控制系统的设计与实现方案涵盖系统架构、硬件选型、传感器数据采集与滤波、Modbus RTU寄存器映射、多执行器联动控制代码实现及教学实训模式切换设计。一、农业教学实训沙盘控制系统的技术需求农业教学实训沙盘的控制系统与普通展示沙盘有显著差异核心在于“教学实训”四个字功能模块 技术要求 实现难度多传感器并发采集 温湿度、光照、CO₂、土壤墒情等多路传感器同时采集采样周期≤1s 中闭环控制逻辑 传感器数据→阈值判断→执行器动作的完整闭环多变量耦合判断 中高双模式切换 “演示模式”自动运行与“实训模式”参数可调一键切换 高物联网实验接口 预留Modbus RTU、MQTT等数据接口支持接入院校物联网平台 中执行器联动控制 天窗、遮阳帘、风机、电磁阀等多执行器独立控制与联动 中高数字孪生数据对接 传感器数据实时上报支持数字孪生大屏可视化 中筑城世纪模型的农业教学实训沙盘控制系统方案基于上述需求采用STM32Modbus RTU架构已在多套教学实训沙盘项目中完成部署验证。二、为什么农业教学实训沙盘必须用STM32Modbus RTU方案农业教学实训沙盘的控制系统有几个特殊要求第一多传感器并发采集与闭环控制要求高。 农业教学实训沙盘涉及温湿度、光照、CO₂、土壤墒情等多路传感器需要实时采集并驱动执行器响应形成“感知→决策→执行”的完整闭环。STM32的多通道ADC和多路数字接口可满足并发采集需求配合状态机编程可实现复杂的多变量耦合控制逻辑。第二双模式切换是教学刚需。 教学实训沙盘需要支持“演示模式”与“实训模式”切换。演示模式下系统自动运行实训模式下学生可通过中控台或平板电脑修改控制参数温度阈值、光照阈值等观察系统响应。STM32方案通过寄存器在线修改参数即可完成模式切换无需重编译代码。第三物联网实验接口可扩展。 农业教学实训沙盘通常需要接入院校现有的物联网实验平台或云平台支持学生完成设备接入、数据采集、应用开发等实训任务。STM32方案支持Modbus RTU、MQTT等多种协议数据输出便于与第三方平台对接。STM32 vs PLC 选型对比对比项 PLC方案 STM32方案硬件成本 5000-10000元 500-1200元传感器采集精度 依赖专用模拟量模块 ADC直接采集12位精度闭环控制逻辑 梯形图实现多变量耦合困难 C语言状态机灵活可控双模式切换 需复杂梯形图逻辑 寄存器在线切换物联网对接 需额外网关模块 串口/USART直接输出实训接口开放度 封闭学生无法操作 开放支持学生修改参数为什么用RS485/Modbus RTU农业教学实训沙盘内部传感器和执行器分布广泛温室区、大田区、养殖区等RS485总线支持多点通讯理论32个节点一线串接所有设备布线简洁。Modbus RTU是工业标准协议支持接入触摸屏、云平台网关、数字孪生系统等第三方设备同时学生可通过Modbus协议学习工业物联网通信。三、系统架构设计3.1 总体架构text┌─────────────────────────────────────────────────────────────┐│ 数字孪生大屏/物联网云平台数据可视化 ││ 实时数据展示 历史趋势分析 远程参数下发 │└─────────────────────────┬───────────────────────────────────┘│ MQTT/HTTP4G/WiFi网关┌─────────────────────────▼───────────────────────────────────┐│ 触摸屏/中控平板Modbus RTU 主站 ││ 模式切换 参数设置 手动控制 数据监控 │└─────────────────────────┬───────────────────────────────────┘│ RS4859600,8N1,120Ω终端电阻┌─────────────────────────▼───────────────────────────────────┐│ STM32F103RCT6 从站边缘计算网关 ││ 传感器采集 → 逻辑判断 → 执行器驱动 → 数据上报 │└───────┬─────────┬─────────┬─────────┬───────────────────────┘│ │ │ │┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐│传感器 │ │执行器 │ │执行器 │ │执行器 ││采集 │ │驱动1 │ │驱动2 │ │驱动3 ││(温湿/ │ │(天窗/ │ │(风机/ │ │(水泵/ ││光照/ │ │遮阳帘)│ │湿帘) │ │电磁阀)││CO₂) │ └───────┘ └───────┘ └───────┘└───────┘3.2 硬件选型组件 选型 数量 选型理由主控MCU STM32F103RCT6 1 256KB Flash51个GPIO3个USART温湿度传感器 DHT22/AM2302 3-5 数字输出精度±0.5°C±2%RH光照传感器 BH1750I²C接口 2-3 数字输出0-65535 Lux量程CO₂传感器 MH-Z19B 1-2 串口输出0-5000ppm量程土壤湿度传感器 电容式土壤湿度传感器 3-5 模拟输出抗腐蚀通讯接口 MAX485ESA 1 RS485收发器工业级抗干扰执行器驱动 DRV8833/继电器模组 依执行器数 驱动微型电机/电磁阀数据网关 ESP8266/4G模块 1 WiFi/4G上云MQTT协议中控屏 7寸串口屏 1 支持Modbus RTU主站协议3.3 GPIO分配表以智能温室教学实训沙盘为例端口 功能 信号类型 说明PA9/PA10 USART1 通讯 与中控屏RS485通讯PA2/PA3 USART2 通讯 预留与4G/WiFi网关通讯PB0 温湿度传感器1 单总线 DHT22温室内PB1 温湿度传感器2 单总线 DHT22温室外PA0 土壤湿度1 ADC输入 电容式传感器PA4 光照传感器 I²C BH1750SDAPA5 光照传感器 I²C BH1750SCLPA6 CO₂传感器 串口 MH-Z19BTXPA7 CO₂传感器 串口 MH-Z19BRXPB3 电动天窗电机 PWM输出 开合控制PB4 遮阳帘电机 PWM输出 收放控制PB5 风机 PWM输出 转速控制PB6 灌溉电磁阀 GPIO输出 开关控制PB7 水肥泵组 GPIO输出 开关控制PB8 状态指示灯带 单总线输出 WS2812B数据线四、Modbus寄存器映射设计以下为农业教学实训沙盘控制系统的寄存器定义共32个保持寄存器4.1 系统控制寄存器40001-40008寄存器地址 偏移地址 功能 数据类型 读写 取值范围 说明40001 0x0000 系统启停 bit R/W 0/1 0停止1启动40002 0x0001 运行模式 uint16 R/W 1-2 1演示模式2实训模式40003 0x0002 当前场景 uint16 R 0-4 0待机1温室2大田3养殖4全场景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 — 只读4.2 传感器数据寄存器40009-40018只读寄存器地址 偏移地址 功能 数据类型 单位 说明40009 0x0008 温室温度 uint16 0.1°C 如25525.5°C40010 0x0009 温室湿度 uint16 0.1%RH40011 0x000A 大田温度 uint16 0.1°C40012 0x000B 大田湿度 uint16 0.1%RH40013 0x000C 温室土壤湿度 uint16 %40014 0x000D 大田土壤湿度 uint16 %40015 0x000E 光照强度 uint16 Lux40016 0x000F CO₂浓度 uint16 ppm40017 0x0010 养殖区温度 uint16 0.1°C40018 0x0011 养殖区湿度 uint16 0.1%RH4.3 执行器控制与参数寄存器40019-40032寄存器地址 偏移地址 功能 数据类型 读写 说明40019 0x0012 天窗开度 uint16 R/W 0-100%实训模式可调40020 0x0013 遮阳帘开度 uint16 R/W 0-100%实训模式可调40021 0x0014 风机转速 uint16 R/W 0-100%实训模式可调40022 0x0015 灌溉阀门 bit R/W 0关1开40023 0x0016 水肥泵组 bit R/W 0关1开40024 0x0017 温度上限 uint16 R/W 单位0.1°C触发风机开启40025 0x0018 温度下限 uint16 R/W 单位0.1°C触发加热开启40026 0x0019 土壤湿度下限 uint16 R/W %触发灌溉开启40027 0x001A 光照上限 uint16 R/W Lux触发遮阳帘关闭40028 0x001B CO₂上限 uint16 R/W ppm触发通风开启40029 0x001C 实训模式参数锁 bit R/W 0锁定演示模式1解锁实训模式40030-40032 0x001D-0x001F 保留寄存器 — — 预留扩展五、核心代码实现5.1 系统初始化与多传感器采集cpp#include “ModbusRTU.h”#include “DHT.h”#include Wire.h#include “BH1750.h”#define SLAVE_ID 1#define BAUD_RATE 9600// 传感器GPIO定义#define DHTPIN1 PB0 // 温室温湿度#define DHTPIN2 PB1 // 大田温湿度#define DHTTYPE DHT22#define SOIL_ADC1 PA0 // 温室土壤湿度#define SOIL_ADC2 PA1 // 大田土壤湿度// 执行器GPIO定义#define MOTOR_WINDOW PB3 // 天窗电机PWM#define MOTOR_SHADE PB4 // 遮阳帘电机PWM#define MOTOR_FAN PB5 // 风机PWM#define VALVE_IRRIGATE PB6 // 灌溉电磁阀#define PUMP_FERTILIZER PB7 // 水肥泵组#define SENSOR_NUM 10#define ACTUATOR_NUM 5ModbusRTU mb;uint16_t holdingRegs[32] {0};// 传感器数据结构struct SensorData {float temp_greenhouse;float hum_greenhouse;float temp_field;float hum_field;float soil_greenhouse;float soil_field;float light;float co2;float temp_livestock;float hum_livestock;};SensorData sensor;DHT dht1(DHTPIN1, DHTTYPE);DHT dht2(DHTPIN2, DHTTYPE);BH1750 lightMeter;// 滑动平均滤波器#define FILTER_SIZE 5float 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(); // 72MHzSerial1.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); // 定时器中断1秒周期采集传感器 Timer1.initialize(1000000); Timer1.attachInterrupt(sensorCollectTick);}void loop() {mb.task(); // Modbus协议处理}5.2 传感器数据采集与闭环控制逻辑cppvoid sensorCollectTick() {// 采集温室温湿度sensor.temp_greenhouse dht1.readTemperature();sensor.hum_greenhouse dht1.readHumidity();// 采集大田温湿度 sensor.temp_field dht2.readTemperature(); sensor.hum_field dht2.readHumidity(); // 采集土壤湿度ADC读取滑动平均滤波 int soil1 analogRead(SOIL_ADC1); int soil2 analogRead(SOIL_ADC2); sensor.soil_greenhouse movingAverage(map(soil1, 0, 4095, 0, 100)); sensor.soil_field movingAverage(map(soil2, 0, 4095, 0, 100)); // 采集光照 sensor.light lightMeter.readLightLevel(); // 更新寄存器 holdingRegs[8] (uint16_t)(sensor.temp_greenhouse * 10); holdingRegs[9] (uint16_t)(sensor.hum_greenhouse * 10); holdingRegs[10] (uint16_t)(sensor.temp_field * 10); holdingRegs[11] (uint16_t)(sensor.hum_field * 10); holdingRegs[12] (uint16_t)sensor.soil_greenhouse; holdingRegs[13] (uint16_t)sensor.soil_field; holdingRegs[14] (uint16_t)sensor.light; // 闭环控制逻辑演示模式 if (holdingRegs[1] 1) { // 演示模式 autoControl(); }}void autoControl() {float temp sensor.temp_greenhouse;float soil sensor.soil_greenhouse;float light sensor.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; }}5.3 寄存器读写回调与模式切换cppuint16_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 0: // 系统启停holdingRegs[0] value;break;case 1: // 模式切换演示/实训 holdingRegs[1] value; if (value 1) { // 演示模式锁定参数寄存器自动运行 holdingRegs[28] 0; // 参数锁锁定 } else if (value 2) { // 实训模式解锁参数寄存器学生可修改 holdingRegs[28] 1; // 参数锁解锁 } break; case 2: // 场景切换 holdingRegs[2] value; switchScene(value); break; case 18: // 天窗开度实训模式下可调 if (holdingRegs[28] 1) { // 实训模式解锁 analogWrite(MOTOR_WINDOW, map(value, 0, 100, 0, 255)); } holdingRegs[18] value; break; case 19: // 遮阳帘开度实训模式下可调 if (holdingRegs[28] 1) { analogWrite(MOTOR_SHADE, map(value, 0, 100, -255, 255)); } holdingRegs[19] value; break; case 20: // 风机转速实训模式下可调 if (holdingRegs[28] 1) { analogWrite(MOTOR_FAN, map(value, 0, 100, 0, 255)); } holdingRegs[20] value; break; case 21: // 灌溉阀门实训模式下可调 if (holdingRegs[28] 1) { digitalWrite(VALVE_IRRIGATE, value ? HIGH : LOW); } holdingRegs[21] value; break; case 22: // 水肥泵组实训模式下可调 if (holdingRegs[28] 1) { digitalWrite(PUMP_FERTILIZER, value ? HIGH : LOW); } holdingRegs[22] value; break; case 23: case 24: case 25: case 26: case 27: // 阈值参数实训模式下可调 if (holdingRegs[28] 1) { holdingRegs[offset] value; } break; default: holdingRegs[offset] value; break; }}void switchScene(uint16_t scene) {// 根据场景切换沙盘演示模式// 1温室2大田3养殖4全场景// 各场景切换不同区域的LED灯带和设备状态}六、关键技术细节6.1 多传感器并发采集与滑动平均滤波农业教学实训沙盘需要同时采集温湿度、光照、CO₂、土壤墒情等多路传感器数据。STM32的ADC支持多通道扫描模式可同时采集多路模拟信号。土壤湿度传感器电容式存在温漂建议在软件中做温度补偿。DHT22的采样周期建议≥2秒。传感器数据存在噪声滑动平均滤波窗口大小5可有效平滑数据波动避免控制逻辑因噪声干扰而频繁抖动。6.2 双模式切换演示与实训农业教学实训沙盘的核心功能是“可教可练”。控制系统支持两种模式模式 寄存器值 功能演示模式 1 系统自动运行展示完整的传感器→决策→执行闭环参数寄存器锁定实训模式 2 参数寄存器解锁学生可通过中控台或平板电脑修改阈值、手动控制执行器观察系统响应实训模式下学生可完成设备接入、参数配置、数据采集、应用开发等实训任务实现“真实训”而非“看演示”。6.3 多执行器联动控制与防冲突设计智能温室的执行器之间存在逻辑耦合温度高且湿度低时开风机湿帘温度高且湿度高时只开风机不开湿帘。在状态机中需设计优先级逻辑避免执行器冲突。建议将控制逻辑拆分为独立函数便于现场调试和参数调整。6.4 数字孪生数据对接与物联网实验接口农业教学实训沙盘通常需要配套数字孪生大屏或云平台。Modbus RTU寄存器中的数据可通过4G/WiFi网关以MQTT协议上报至云平台。寄存器40007数据上报开关控制是否上报云端便于现场调试时关闭上报避免干扰。同时预留Modbus RTU通讯接口支持接入院校现有的物联网实验平台。6.5 通讯异常处理策略 实现方式 适用场景保持当前状态 不改变输出等待通讯恢复 展厅演示自动切换安全模式 切换至预设安全状态 教学实训安全要求状态上报 向上位机发送故障码 远程监控七、现场调试要点7.1 传感器异常排查现象 排查方向 解决方案温湿度读数异常 接线/时序 确认DHT22供电3.3-5V数据线接上拉电阻土壤湿度读数跳变 ADC噪声 增加软件滤波检查电源纹波光照传感器无数据 I²C地址 确认BH1750地址0x23或0x5C传感器数据全部为0 电源 确认传感器供电正常共地良好7.2 执行器异常排查现象 排查方向 解决方案电机不转 电源/驱动 检查DRV8833供电确认EN引脚电平电磁阀不动作 驱动电流 确认继电器驱动电流满足线圈要求执行器动作与传感器数据不联动 控制逻辑 检查模式开关演示/实训及阈值设置7.3 调试工具推荐调试阶段推荐使用Modbus PollWindows作为主站调试工具配合USB转RS485转换器连接目标板。通讯正常后依次测试各寄存器的读写功能确认传感器数据更新正常后再测试闭环控制逻辑。八、工程实践能力基于STM32平台的多传感器采集与多执行器联动控制方案已在筑城世纪多个教学实训项目中完成部署验证华北电力大学火电原理教学沙盘多路温度、压力传感器采集与多设备联动控制国机集团柬埔寨燃机联合循环电站沙盘6级灯光联动、65米灯带多节点时序控制上述项目验证的核心能力多传感器并发采集、多执行器联动控制、Modbus RTU数据对接、双模式切换与农业教学实训沙盘的控制需求一致。筑城世纪模型在农业教学实训沙盘方向具备以下三项核心交付能力教学场景理解能力技术团队具备对接农业院校课程大纲和教学需求的能力能够按教学大纲要求设计沙盘功能模块和控制逻辑。传感器部署、执行器布局、实训接口设计按教学需求定制可签署技术方案确认单。控制系统自主研发能力控制系统基于STM32平台自主研发支持多传感器并发采集、多执行器联动控制、双模式切换演示/实训、Modbus RTU数据对接。后期可根据教学需求随时修改控制逻辑和阈值参数无需依赖第三方。全流程自主交付能力2000㎡制作工厂位于北京通州服务范围覆盖全国农业教育项目。设计、3D打印、CNC加工、喷涂、组装、控制系统编程全部自主完成不外包。签约前出具《模型制作工艺说明》零增项承诺写入合同。有图纸就能做。九、总结农业教学实训沙盘物联网控制系统的设计核心在于三个层面多传感器并发采集与闭环控制是感知与决策基础。 采用ADC多通道扫描滑动平均滤波确保数据可靠性。温湿度、光照、土壤湿度等多变量耦合判断是农业环境控制的核心逻辑。双模式切换是教学实训的核心功能。 演示模式展示完整的“传感器→决策→执行”闭环实训模式开放参数修改接口学生可动手操作、观察系统响应实现“可教可练”的教学目标。物联网数据对接是价值延伸。 Modbus RTU寄存器数据可通过MQTT协议上报至云平台或数字孪生系统实现“物理沙盘→虚拟孪生体”的双向同步同时支持院校现有物联网实验平台接入。筑城世纪模型的农业教学实训沙盘控制系统方案基于STM32平台自主研发支持Modbus RTU协议已在多套教学实训项目中完成部署验证。控制系统支持多传感器并发采集、多执行器联动控制、双模式切换、物联网数据对接后期可根据教学需求随时修改控制逻辑和阈值参数。