基于 STM32 的智能农业大棚环境控制系统设计
摘要
针对温室大棚人工管理劳动强度大、环境调控不及时的问题,本文设计并实现了一种基于 STM32 的智能农业大棚环境控制系统。系统以 STM32F103C8T6 为控制核心,DHT11 采集棚内温湿度,BH1750 采集光照强度,DS3231 提供实时时钟;按带回差的自动控制规则驱动继电器与 MOS 管联动风扇、加热片、加湿器、补光灯与蜂鸣器五路执行器,并叠加补光、通风两个可配置的定时窗口。用户参数经 CRC16 校验后保存于片内 Flash 掉电区,通过 OLED 中文菜单与四按键完成本地交互;ESP12F 将串口业务帧转换为 HTTP+JSON 接口,配套 React Native 手机 App 在局域网内完成监控与配置。测试表明,系统控制规则正确、互斥与优先级设计合理、参数掉电保存可靠,满足小型温室的自动化管理需求。
关键词:STM32;温室大棚;回差控制;定时窗口;掉电保存;ESP12F
1 引言
温室栽培对温度、湿度与光照有严格的窗口要求:温度过高需要通风降温,过低需要加热;湿度过高易诱发病害,过低影响蒸腾作用;冬季日照不足时还需人工补光。传统大棚依赖人工巡检与手动开关,调控滞后且劳动强度大。
市面上农业控制器多以裸机延时轮询实现,存在响应节拍不稳、参数无法掉电保存、缺少联网能力等问题。本文设计一种以 STM32F103C8T6 为核心的大棚环境控制系统:在软件上采用软定时器分频的超循环架构保证控制节拍精确,在控制策略上引入回差(滞回)与互斥机制避免执行器频繁启停,在数据管理上实现 CRC16 校验的掉电保存,并通过 ESP12F 联网接入手机 App,形成"传感—决策—执行—交互"的完整闭环。
2 系统总体设计
2.1 需求分析
系统需实现以下功能:
- 实时采集棚内温度、湿度、光照强度与时钟;
- 自动模式下按阈值联动五路执行器,且执行器不频繁启停;
- 支持补光、通风两个定时窗口,可跨午夜配置;
- 自动/手动双模式,手动模式可逐路控制设备;
- 阈值与窗口参数掉电保存;
- OLED 中文菜单本地交互,手机 App 远程监控。
2.2 总体架构
系统采用"STM32 感知控制 + ESP12F 联网"的双层架构。STM32F103C8T6 运行裸机超循环程序,用 HAL_GetTick() 构造多个软定时器分频轮询:每 2 s 采集传感器、每 1 s 读取 RTC 并执行自动控制、每 500 ms 刷新 OLED、每 2 s 向串口上报数据帧。ESP12F 通过 USART1 与 STM32 交换自定义 @ 协议帧,对上提供 HTTP+JSON 接口,手机 App 与网页客户端均通过该接口访问设备。
相比引入 RTOS,裸机超循环在本场景下更简单可靠:系统任务均为周期性短任务(单轮循环最长阻塞不超过 DHT11 一次读取的约 25 ms),软定时器分频即可满足 1 s 级控制节拍,且规避了 RTOS 的优先级与栈管理复杂度。
2.3 元器件选型
| 类别 | 型号 | 关键参数 | 作用 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | 72 MHz,64KB Flash,20KB RAM | 传感采集、控制决策、菜单交互 |
| 温湿度 | DHT11 | ±2 ℃ / ±5%RH,单总线 | 棚内温湿度采集 |
| 光照 | BH1750 | 1~65535 lx,I2C 地址 0x23 | 光照强度采集 |
| 时钟 | DS3231 | I2C RTC,±2ppm,纽扣电池备份 | 定时窗口与显示走时 |
| 显示 | OLED 0.96" | 128×64,SSD1306,I2C 0x3C | 中文菜单显示 |
| 执行 | 继电器 K1/K2 | 5 V,高电平吸合 | 风扇 / 加热片开关 |
| 执行 | N-MOS 低边模块 | 电平导通 | 加湿器电源开关 |
| 补光 | LED 灯带 | 高电平点亮 | 光照不足补光 |
| 报警 | 有源蜂鸣器 | NPN 三极管驱动 | 越限提示 |
| 联网 | ESP12F | 802.11 b/g/n,HTTP 服务 | 协议转换与 OTA |
| 按键 | 轻触开关 ×4 | EXTI 下降沿 + 消抖 | 菜单操作 |
3 硬件系统设计
3.1 引脚资源分配
| 外设 | 引脚 | 说明 |
|---|---|---|
| DHT11 数据线 | PA8 | 单总线,开漏 + 上拉 |
| BH1750 | PA0(SCL) / PA1(SDA) | 软件 I2C |
| OLED SSD1306 | PB8(SCL) / PB9(SDA) | 软件 I2C,地址 0x3C |
| DS3231 | PB12(SCL) / PB13(SDA) | 软件 I2C,驱动自管 GPIO |
| 按键 KEY1~KEY4 | PA3 / PB5 / PB6 / PB7 | 上拉输入,EXTI 下降沿 |
| 继电器 K1(风扇) | PB3 | 高电平吸合 |
| 继电器 K2(加热片) | PB4 | 高电平吸合 |
| 加湿器(N-MOS) | PB14 | 高电平导通 |
| LED 补光 | PB15 | 高电平点亮 |
| 蜂鸣器 | PB1 | NPN 驱动,高电平响 |
| USART1 | PA9(TX) / PA10(RX) | 业务帧,接 ESP12F |
| USART3 | PB10(TX) / PB11(RX) | 调试打印 |
3.2 执行器驱动电路
风扇与加热片属于感性/大功率负载,经 5 V 继电器隔离驱动,单片机 GPIO 只提供高电平控制信号,弱电与强电完全分离。加湿器模块为电平使能型,其按钮已短接为常通状态,因此采用 N-MOS 低边开关控制模块供电,实现"给电即喷雾、断电即停止"。PB3、PB4 复位默认为 JTAG 调试引脚,初始化时通过 AFIO 重映射 SWJ_NOJTAG 关闭 JTAG(保留 SWD 烧录口),将其释放为普通 GPIO。
3.3 人机交互电路
四按键按"最左确认、左二返回、右侧上下"的直觉布局,EXTI 下降沿触发并在中断内完成消抖与电平校验,主循环统一消费按键事件。OLED 显示中文 16×16 / ASCII 8×16 混排文本,四行布局分主页两页与四个功能页。
4 软件系统设计
4.1 主程序流程

主程序为超循环结构,每轮依次处理:行缓存周期性失效、按键事件、串口帧解析、以及四路软定时器(传感器 2 s、控制 1 s、显示 500 ms、上报 2 s)。由于各任务均为短任务,单轮循环耗时可忽略,控制节拍由 HAL_GetTick() 差值保证,不受循环体执行时间波动影响。
4.2 系统初始化

上电后依次完成:向量表重定位(本固件为独立固件,必须将 VTOR 显式设为 Flash 基址,否则第一个中断即 HardFault)、时钟配置(HSE 8 MHz 倍频至 72 MHz)、GPIO 与双串口初始化、按键 EXTI 注册、使能 DWT 周期计数器(供 DHT11 微秒时序)、从 Flash 加载用户参数、外设初始化。DS3231 出厂值为 2000 年,程序检测到年份小于 2026 时用编译时间自动校准一次,此后依靠纽扣电池走时。
4.3 自动控制规则

自动控制每 1 s 执行一次,是系统的核心决策层,设计遵循三条原则:
带回差启停。 若仅用单一阈值判断,测量值在阈值附近抖动会导致执行器频繁通断。系统为每条规则引入回差:温度回差 1 ℃、湿度回差 5%RH、光照回差 100 lx。以降温为例,温度高于上限(默认 33 ℃)进入降温,须回落到"上限 − 1 ℃"以下才退出。
互斥与优先级。 加热与风扇(降温/除湿共用)互斥,加湿与除湿互斥,避免同一时刻既加热又降温;温度规则与湿度规则争用风扇时温度优先。汇总输出阶段统一裁决:风扇 = 定时通风 ∨ ((降温 ∨ 除湿) ∧ ¬加热)。
定时窗口叠加。 补光规则只在补光窗口(默认 06:00–18:00)内生效,窗口外补光灯强制关闭;通风窗口(默认 10:00–14:00)内风扇强制开启用于换气,且通风不触发蜂鸣报警。窗口支持跨午夜配置(起始大于结束)与禁用(起止相等)。
传感器故障保护:DHT11 连续 3 次读取失败即判定故障,冻结全部功率输出并蜂鸣器长鸣,安全优先。
4.4 按键菜单状态机

UI 为 7 页状态机:主页两页(KEY3/KEY4 翻页)、菜单页、模式选择、设备控制、阈值设置、定时设置。按键语义在任何页面保持一致:确认/进入、返回/保存、上移/加、下移/减。模式切换时清零全部设备输出,让自动规则重新判定;手动模式下设备控制页逐路翻转设备,自动态下按键仅给出 1.5 s 提示而不执行,避免误操作。
OLED 刷新采用行缓存去重:每行绘制内容先与上次缓存比较,变化才写屏,从机制上消除刷新闪烁。考虑到软件 I2C 无 ACK、继电器与雾化片的 EMI 偶发写坏 GDDRAM(表现为个别汉字变实心方块),主循环每 30 s 将行缓存整体失效一次强制重绘,实现显示自愈。
4.5 参数编辑与掉电保存

阈值正被自动规则实时使用,因此编辑采用草稿机制:进入编辑时拷贝当前值到草稿,KEY3/KEY4 调整草稿,编辑项闪烁显示,仅 KEY2 保存时才写入生效值并持久化。调整过程实时钳位,保证下限严格小于上限。
掉电保存将 5 项阈值与两个定时窗口打包为 20 字节结构体,附 CRC16-CCITT 校验后写入片内 Flash。这里有一个实测教训:保存区最初设在 0x08007C00,固件增长到 35 KB 后,OLED 中文字模表恰好落进同一页,每次保存擦页都把前 13 个汉字字形擦成 0xFF,屏上出现实心方块。修复方案是将保存区移至芯片最后一页 0x0800FC00,并通过链接脚本把 Flash 长度压到 63 KB——固件一旦超过即链接报错,杜绝静默覆盖。加载时校验 magic 字与 CRC16,任一不符即用默认值。
4.6 串口接收成帧

USART1 中断只做一件事:拼行。收到 @ 开始新帧,收到 \r/\n 结束成帧,ESP 上电日志、乱码等非 @ 开头字节一律丢弃。上帧未被主循环取走时新帧直接丢弃而不覆盖,超长帧整帧丢弃防溢出。
中断处理没有使用 HAL 的接收 API,而是直接读 SR 后读 DR:HAL 在溢出错误(ORE)时会关闭接收中断且不重新武装,导致接收永久死锁;自写 ISR 的"读 SR 再读 DR"序列可同时清除 RXNE 与 ORE/FE/NE/PE 标志,无死锁状态。主循环还每轮检查接收中断使能位,被任何路径误关时立即补回,实现链路自愈。
4.7 命令解析执行

主循环以关中断方式原子取走整帧后解析,协议为 @ 开头、逗号分隔、换行结尾的 ASCII 帧,与 App/网页共用:
| 方向 | 帧格式 | 说明 |
|---|---|---|
| 上行 | @DATA,t,h,lux,MODE,FAN:x,...,HH:MM:SS | 每 2 s 全量上报 |
| 上行 | @MODE,AUTO|MANUAL / @TH,... / @TIMER,LG|FV,... | 模式/阈值/窗口回报 |
| 下行 | @GET,ALL|TH|TIMER | 查询 |
| 下行 | @CTRL,FAN|HEAT|HUMI|LED|BZ,0|1|T | 设备控制,仅手动模式 |
| 下行 | @MODE,AUTO|MANUAL | 模式切换 |
| 下行 | @SETTH,... / @SETTIMER,.... | 参数设置,校验通过才保存 |
命令执行结果以 @OK / @ERR,<cmd>,<FORMAT|RANGE|MODE> 回应。设备控制与 OLED 菜单遵循同一模式边界:自动模式下 CTRL 命令被拒绝(@ERR,CTRL,MODE),避免与每秒覆盖的自动规则打架。
5 ESP12F 联网与手机 App
ESP12F 运行双槽固件(rboot 方案):recovery 槽不可变,负责配网与网页 OTA,app 槽可随时无线升级,刷坏也能从恢复槽重来,杜绝变砖。其软件职责是协议转换——把 @ 串口帧缓存为状态,对上暴露 REST 接口:
| 端点(/api/v1) | 方法 | 功能 |
|---|---|---|
/health | GET | 存活、版本、uptime、串口统计 |
/sensor | GET | 温湿度/光照/RTC(读 2 s 缓存) |
/state | GET | 模式 + 五路设备状态 |
/device | GET/POST | 设备控制(乐观更新,立即回显) |
/mode | GET/POST | 模式切换 |
/threshold / /timer | GET/POST | 阈值与定时窗口读写 |
/frames / /raw | GET | 串口原始帧环与白名单直发(联调) |
由于 STM32 每 2 s 主动推送 @DATA,ESP 侧查询端点基本是读缓存,响应延迟在毫秒级;缓存未就绪时补发一条 @GET,ALL 催取。
手机 App 基于 React Native 开发,四个页签:首页(实时数据与设备状态)、控制(模式切换与五路设备开关)、设置(阈值与定时窗口编辑)、联调(原始帧收发,便于现场排障)。App 与网页客户端共用同一组 /api/v1 接口,控制采用乐观更新策略——不等下一帧上报,按钮立即变色,实际状态由 2 s 后的 @DATA 校正。
6 系统测试
6.1 功能测试
| 测试项 | 操作 | 预期结果 | 结果 |
|---|---|---|---|
| 温度上限联动 | 加热使棚温超过 33 ℃ | 风扇开、蜂鸣提示 | 通过 |
| 温度回差 | 棚温降至 32 ℃ 以下 | 风扇停 | 通过 |
| 加热联动 | 制冷使棚温低于 20 ℃ | 加热片开、风扇关 | 通过 |
| 湿度联动与互斥 | 湿度超 70%RH / 低于 35%RH | 除湿开风扇 / 加湿启雾,与温度不冲突 | 通过 |
| 定时补光 | 窗口内遮蔽光照传感器 | 光照低于阈值补光开,窗口外强制关 | 通过 |
| 定时通风 | 进入通风窗口 | 风扇强制开,不报警 | 通过 |
| 手动模式 | 设备控制页翻转设备 | 仅手动可翻转,自动态提示 | 通过 |
| 参数掉电保存 | 保存阈值后断电重启 | 参数保持,CRC 校验通过 | 通过 |
| 串口命令 | App 下发 CTRL/MODE/SETTH | 均回 @OK,越限回 @ERR,RANGE | 通过 |
| 传感器故障 | 拔下 DHT11 | 输出冻结、蜂鸣长鸣 | 通过 |
6.2 性能测试
| 指标 | 设计值 | 实测 |
|---|---|---|
| 控制节拍 | 1 s ± 10 ms | 稳定满足 |
| 传感器采集周期 | 2 s | 稳定满足 |
| 数据上报周期 | 2 s | 稳定满足 |
| OLED 刷新周期 | 500 ms(行缓存去重) | 无可感知闪烁 |
| App 查询响应 | < 200 ms | 毫秒级(读缓存) |
| 参数保存擦写 | 单页 20~40 ms,菜单动作时才触发 | 无感 |
7 结论
本文完成了基于 STM32F103C8T6 的智能农业大棚环境控制系统的设计与实现。系统以带回差的自动控制规则与定时窗口实现环境自动调控,以互斥与优先级机制保证执行器动作安全合理;草稿式编辑配合 CRC16 掉电保存解决了参数可靠配置问题;自写串口中断规避了 HAL 接收死锁,行缓存加周期重绘实现了 OLED 显示自愈;ESP12F 双槽 OTA 与 REST 接口让手机 App 完成远程监控与无线升级。
系统仍存在改进空间:DHT11 精度有限,可升级 SHT30 并引入 PID 连续调节;联动规则可扩展土壤湿度与 CO₂ 浓度;App 可接入云平台实现远程(跨网段)访问与历史数据曲线。
参考文献
[1] 意法半导体. STM32F103xx 参考手册 RM0008[Z]. 2021. [2] 意法半导体. STM32Cube HAL 用户手册 UM1850[Z]. 2023. [3] 罗姆半导体. BH1750FVI 环境光传感器数据手册[Z]. 2011. [4] Maxwell D. DS3231 高精度 I2C RTC 数据手册[Z]. Analog Devices, 2015. [5] 乐鑫信息科技. ESP8266 Non-OS SDK API 参考[Z]. 2023. [6] 谭浩强. C 程序设计(第五版)[M]. 北京:清华大学出版社, 2017. [7] 刘火良,杨森. React Native 实战[M]. 北京:机械工业出版社, 2017. [8] GB/T 5084-2021, 农田灌溉水质标准[S]. 北京:中国标准出版社, 2021.