【毕业设计课题】基于 STM32 的智能农业大棚监测与控制系统
本文提供了一套完整的智慧农业大棚监控系统解决方案,涵盖硬件选型、软件架构、通信协议到控制策略。系统基于STM32+FreeRTOS平台,集成SHT30/BH1750等传感器,通过ESP8266/ESP32实现MQTT云端通信,支持灌溉和卷帘的自动控制。方案包含详细的硬件接口防护措施、任务划分设计、低功耗可靠性优化,并提供关键代码示例,可实现环境数据采集、云端可视化和设备远程控制。适用于温室种植、科
·
本文提供从需求分析、系统架构、硬件与软件设计、云平台接入、通信协议、测试与部署到成本估算的全流程可落地方案,附关键代码与工程结构建议。
关键词
- STM32、FreeRTOS、IIC/ADC/UART、MQTT/HTTP、ESP8266/ESP32、SHT30/BH1750、土壤湿度、卷帘电机、灌溉控制、云平台(EMQX/OneNet/阿里云/腾讯云)、低功耗、看门狗、EMC 防护
你将获得
- 系统化方案:从传感器采集到云端可视化的端到端设计
- 可复制工程:架构图、引脚表、主题/数据模型、控制策略、测试清单
- 上手代码:HAL + FreeRTOS 关键片段,便于快速搭建验证
目录
- 1. 项目概述与需求
- 2. 系统总体架构
- 3. 硬件设计
- 4. 软件架构与任务划分
- 5. 控制策略(灌溉/卷帘)
- 6. 通信协议与云平台接入
- 7. 关键代码片段(HAL + FreeRTOS)
- 8. 数据存储与可靠性设计
- 9. 工程结构与命名建议
1. 项目概述与需求
- 监测:空气温度/湿度、土壤湿度、光照强度,周期采集、异常告警。
- 控制:灌溉(泵/电磁阀)、卷帘(上/下,限位保护),支持自动/手动/远程。
- 联网:MQTT/HTTP 上报,远程参数与控制,历史可视化与告警通知。
- 可靠性:掉电自恢复、看门狗、掉线重连、EMC 防护、异常自检与降级。
- 扩展性:支持 CO₂、风速雨量、摄像头、4G/NB-IoT 等模块化扩展。
应用场景:蔬菜瓜果育苗、温室花卉、科研试验大棚、教学演示等。
2. 系统总体架构

设计要点:传感器与执行器电气隔离/抗干扰;控制策略本地闭环,云端仅作监控与策略下发;网络不稳定时启用本地兜底阈值。
3. 硬件设计
3.1 主控与外设选型
- MCU:STM32F103C8T6(入门常用)、STM32G0(低功耗)、STM32F411(性能更高)。
- 温湿度:SHT30/SHT31(I²C,高精度,抗干扰);或 DHT22(性价比高)。
- 土壤湿度:
- 电容式模拟探头(0–3.3V):直接 ADC 采样+标定
- 工业 4–20 mA/0–10 V:采样电阻/分压→ADC,精度与抗干扰更优
- 光照:BH1750(I²C,勒克斯直接输出)或 LDR+分压+ADC(成本低)。
- 网络:ESP8266(UART)、ESP32(UART/并行),蜂窝 SIM7600/SIM7070 可选。
- 执行器:
- 灌溉:12/24V 直流水泵或 AC 水泵 + 继电器/SSR;注意回灌与防干转
- 卷帘:DC 电机用 H 桥(BTS7960/L298N),AC 电机双继电器互锁/接触器
- 限位:常闭触点,失效安全
- 电源:AC-DC 12/24V → DC-DC 5V/3.3V 分级供电;TVS/ESD、保险丝、共模电感、RC 吸收。
3.2 接口与防护建议
- I²C 4.7k 上拉,线长>30cm 选屏蔽线或分段节点;必要时隔离。
- ADC 前级 RC 滤波+TVS;模拟地与数字地分区,单点汇接。
- 继电器线圈并二极管/RC;电机端并 TVS/压敏;AC 端口加 RC 吸收回路。
- 限位常闭,端口硬件上拉/下拉,避免悬空抖动;输入加 RC 去抖。
- 串口与无线模块共地,模块上电电容缓冲,预留电源裕量。
3.3 参考引脚分配
| 功能 | 引脚 | 说明 |
|---|---|---|
| I2C1_SCL/SDA | PB6/PB7 | SHT30 与 BH1750 共总线 |
| ADC_IN0 | PA0 | 土壤湿度模拟输入 |
| UART1_TX/RX | PA9/PA10 | 连接 ESP8266/ESP32 |
| RELAY_PUMP | PB0 | 灌溉继电器控制 |
| RELAY_UP/DOWN | PB1/PB10 | 卷帘上/下互锁控制 |
| LIMIT_UP/DOWN | PA1/PA2 | 卷帘行程开关输入 |
| SWD | PA13/PA14 | 调试与下载 |
4. 软件架构与任务划分
- 开发环境:STM32CubeIDE 或 Keil MDK + CubeMX 生成 HAL。
- RTOS:推荐 FreeRTOS;小型场景可裸机实现,但需注意时序与可靠性。
- 中间件:cJSON(配置/消息解析)、环形缓冲、NTP(通过模块同步)。
任务建议(优先级从低到高):
LogTask(低):环形日志、异常持久化。SensorTask(中):周期采集温湿度/土壤/光照,滤波与异常检测。MqttTask(中):联网、心跳、上报与指令处理、重连退避。ControlTask(高):灌溉与卷帘控制,互锁与限位安全。WatchdogTask(高):统一喂狗,检测任务卡死/超时。
系统流程:上电自检 → 载入参数 → 启动网络 → 拉取策略 → 正常采集与控制 → 周期上报 → 异常降级与告警。
5. 控制策略(灌溉/卷帘)
- 灌溉(阈值 + 滞回):
- 例:
soil < 30% → 开泵;soil > 40% → 关泵,避免频繁启停。 - 安全限制:最大连续运行时间、最小冷却间隔、缺水/干转检测。
- 时段优化:清晨/傍晚优先,结合光照与气温。
- 例:
- 卷帘(多条件 + 互锁 + 限位):
- 过亮/过热自动下卷;过暗/过冷上卷;支持手动强制,超时回退自动。
- 互锁保证同向单通:上/下命令互斥;限位到位立即断电。
- 优先级:安全 > 手动 > 自动;掉网/掉电后恢复到可预期状态。
6. 通信协议与云平台接入
6.1 云平台选择
- 入门/教学:OneNet、自建 EMQX/Mosquitto(上手快)。
- 商用/规模:阿里云 IoT、腾讯云 IoT(设备管理与安全完善)。
6.2 MQTT 主题与消息(示例)
- 主题
- 上报:
greenhouse/{deviceId}/telemetry - 下发:
greenhouse/{deviceId}/control - 心跳:
greenhouse/{deviceId}/status
- 上报:
上报 JSON:
{
"ts": 1730698800000,
"env": {"t": 26.3, "h": 62.1, "lux": 15800},
"soil": {"moisture": 31.5},
"state": {"pump": 0, "shade": "stop"},
"rssi": -58,
"fw": "1.2.0"
}
控制下发 JSON:
{
"cmd": "set",
"pump": {"mode": "auto", "force": 0, "maxOnSec": 300},
"shade": {"action": "up", "timeoutSec": 25},
"threshold": {"soilLow": 30, "soilHigh": 40, "luxHigh": 20000, "luxLow": 5000}
}
6.3 连接与保活
- QoS1;KeepAlive 60s;遗嘱消息标记离线。
- 重连退避:1→2→4→…≤60s;断线缓存上报(环形队列 10–50 条)。
7. 关键代码片段(HAL + FreeRTOS)
任务创建(示例):
void app_create_tasks(void) {
xTaskCreate(sensor_task, "SensorTask", 512, NULL, tskIDLE_PRIORITY+2, NULL);
xTaskCreate(control_task, "ControlTask", 512, NULL, tskIDLE_PRIORITY+3, NULL);
xTaskCreate(mqtt_task, "MqttTask", 1024, NULL, tskIDLE_PRIORITY+2, NULL);
xTaskCreate(watchdog_task, "WdtTask", 256, NULL, tskIDLE_PRIORITY+4, NULL);
}
I²C 读取 SHT30(简化示例):
bool sht30_read(float *tempC, float *rh) {
uint8_t cmd[2] = {0x24, 0x00};
HAL_I2C_Master_Transmit(&hi2c1, 0x44<<1, cmd, 2, 50);
vTaskDelay(pdMS_TO_TICKS(15));
uint8_t buf[6] = {0};
if (HAL_I2C_Master_Receive(&hi2c1, 0x44<<1, buf, 6, 50) != HAL_OK) return false;
uint16_t t_raw = (buf[0]<<8)|buf[1];
uint16_t h_raw = (buf[3]<<8)|buf[4];
*tempC = -45.0f + 175.0f * (t_raw / 65535.0f);
*rh = 100.0f * (h_raw / 65535.0f);
return true;
}
ADC 读取土壤湿度(滑动平均):
float read_soil_moisture(void) {
const int N = 16;
uint32_t acc = 0;
for (int i=0;i<N;i++) {
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
acc += HAL_ADC_GetValue(&hadc1);
}
float avg = (float)acc / N;
return (avg / 4095.0f) * 100.0f; // 需结合实物标定修正
}
卷帘互锁与限位:
void shade_control(Action act) {
if (act == ACTION_UP) {
if (limit_up_triggered()) { relay_off_all(); return; }
relay_down_off();
relay_up_on();
} else if (act == ACTION_DOWN) {
if (limit_down_triggered()) { relay_off_all(); return; }
relay_up_off();
relay_down_on();
} else {
relay_off_all();
}
}
看门狗与任务心跳:
void watchdog_task(void *arg) {
for(;;) {
if (all_tasks_healthy()) {
HAL_IWDG_Refresh(&hiwdg);
}
vTaskDelay(pdMS_TO_TICKS(500));
}
}
8. 数据存储与可靠性设计
- 参数存储:阈值/模式/校准因子存于 Flash(双分区 A/B + 校验),掉电不丢。
- 日志与离线缓存:环形缓冲 + 简单 wear-leveling;上电后补发未上报数据。
- 异常降级:传感器失联→使用最近可信值/默认阈值;网络掉线→本地自动策略继续。
- 看门狗:IWDG 必开;任务心跳+超时复位;启动自检与失败安全状态。
- 低功耗(可选):使用 STOP/Standby 模式;降低采样与上报频率;唤醒源为定时器/外部中断。
9. 工程结构与命名建议
firmware/
Core/
Drivers/
Middlewares/
App/
sensors/ // sht30.c, bh1750.c, soil_adc.c
control/ // pump.c, shade.c, safety.c
net/ // mqtt_client.c, at_driver.c
storage/ // flash_kv.c, ringbuf.c
tasks/ // sensor_task.c, control_task.c, mqtt_task.c
utils/ // log.c, time_sync.c
FreeRTOSConfig.h
app_main.c
命名风格:动词+名词(函数),含义明确(变量),避免缩写;模块内聚,接口清晰。
结语
以上方案兼顾可实现性与可扩展性,既能满足教学与毕设,又可作为实际项目基础版本。按本文架构与代码片段实现,可快速完成软硬件联调与云端接入,并支撑长期稳定运行。欢迎收藏、点赞与交流改进意见。
更多推荐



所有评论(0)