1. 项目概述与核心需求
去年帮朋友改造草莓大棚时,发现市面上农业监控设备普遍存在两个痛点:要么功能简陋误差大,要么价格昂贵维护难。于是基于STM32F103C8T6设计了一套低成本智能监控系统,核心功能包括环境参数采集、阈值报警、自动控制和远程监控四大模块。
系统需要实时监测六类关键参数:空气温湿度(AHT20)、光照强度(BH1750)、土壤湿度(LM393)、二氧化碳浓度(MH-Z19C)、土壤温度(DS18B20)和大气压力(BMP280)。这些传感器数据通过1.3寸OLED本地显示,同时经由ESP-01S WiFi模块上传至云平台。控制端包含补光LED、通风风扇、灌溉水泵和报警蜂鸣器四类执行器,支持手动、自动和云端三种控制模式切换。
2. 硬件设计与选型要点
2.1 主控芯片选型对比
STM32F103C8T6(蓝桥杯开发板同款)以其72MHz主频、64KB Flash和20KB RAM的配置,完全满足本项目的实时性需求。相比ESP32等物联网芯片,其优势在于:
- 更丰富的外设接口(3个USART、2个I2C、2个SPI)
- 12位ADC采样精度(土壤湿度检测关键)
- 更低的运行功耗(实测全速运行电流仅23mA)
2.2 传感器模块选型实战
温湿度传感器淘汰了常见的DHT11,选用AHT20的原因:
- 精度提升:温度±0.3℃ vs DHT11的±2℃
- 响应时间:2秒 vs DHT11的5秒
- I2C接口节省GPIO资源
土壤检测方案采用性价比最高的LM393比较器模块:
- 成本仅0.5元/个
- 通过电位器调节检测阈值
- 注意需配合10KΩ上拉电阻使用
2.3 电源系统设计细节
采用3.7V锂电池供电,通过AMS1117-3.3稳压芯片转换。关键改进点:
- 在AMS1117输入端增加100μF钽电容,解决电机启停时的电压跌落问题
- 使用TL431监测电池电压,当电压低于3.5V时:
- 关闭OLED显示
- 停止非必要传感器采样
- 各执行器电源独立控制,MOS管选用IRLML6244(Vgs=1.8V即可导通)
3. 软件架构与核心算法
3.1 三层式状态机设计
系统控制逻辑采用状态机实现,分为三个优先级:
- 手动模式:直接响应按键操作,强制控制执行器
- 自动模式:根据预设阈值触发控制(代码示例):
c复制void auto_control() {
if(temp > temp_max) {
fan_on();
buzzer_alert(2);
}
if(soil_humidity < 40 && !pump_flag) {
pump_delay++;
if(pump_delay >= 3000) { // 3秒防抖
pump_on();
pump_flag = 1;
}
}
}
- 云端模式:接收MQTT指令控制,但本地仍保留安全限制
3.2 传感器数据采集优化
ADC采样策略:
- 土壤湿度采用连续转换模式
- 配置239.5周期采样时间(提高抗干扰性)
- 每次读取前检查EOC标志
I2C通信优化:
- AHT20初始化后进入休眠模式
- 每次采样前发送唤醒命令
- 使用DMA传输降低CPU占用率
3.3 无线通信实现
ESP-01S固件选用ATv2.2.0版本,关键配置:
bash复制AT+CWMODE=1 // STA模式
AT+CIPMUX=0 // 单连接
AT+CIPSTART="TCP","mqtt.xxx.com",1883
常见问题处理:
- 上电后需延迟700ms再发送AT指令
- 启用TCP KeepAlive(AT+CIPKEEP=1)
- 添加指令重发机制(超时3秒重试)
4. 关键问题解决方案
4.1 传感器干扰问题
现象:开启补光灯时土壤湿度读数波动达15%
排查:
- 用示波器捕捉到电源纹波增大
- 发现传感器与LED共用电源线路
解决:
- 为每个传感器添加LC滤波电路
- 修改PCB布局,分离模拟/数字地
4.2 数据存储可靠性
采用Flash模拟EEPROM方案:
- 每个参数存储三个副本
- 添加头尾校验码(0xAA55AA55)
- 写操作前先擦除整个扇区
c复制void param_save() {
FLASH_Unlock();
FLASH_ErasePage(0x0800FC00);
FLASH_ProgramWord(addr, 0xAA55AA55);
FLASH_ProgramWord(addr+4, param_value);
FLASH_ProgramWord(addr+8, 0x55AA55AA);
FLASH_Lock();
}
4.3 低功耗优化
待机电流从89mA降至32mA的措施:
- 关闭未使用的外设时钟(ADC、TIM2等)
- 传感器采样间隔从1秒改为5秒
- OLED采用局部刷新代替全屏刷新
- 进入Stop模式前保存关键状态
5. 系统测试与性能指标
经过三个月实际运行测试:
- 温度检测误差:±0.5℃(对比Fluke 51II)
- 湿度检测误差:±3%RH
- 控制响应延迟:<2秒
- 误报率:1.7次/月
- 待机时长:186小时(7800mAh电池)
成本核算表:
| 模块 | 型号 | 单价(元) | 数量 | 小计 |
|---|---|---|---|---|
| 主控 | STM32F103C8T6 | 12.5 | 1 | 12.5 |
| 温湿度 | AHT20 | 8.8 | 1 | 8.8 |
| WiFi模块 | ESP-01S | 9.9 | 1 | 9.9 |
| 土壤传感器 | LM393 | 0.5 | 2 | 1.0 |
| OLED | SSD1306 1.3寸 | 15.0 | 1 | 15.0 |
| 总计 | 47.2 |
6. 扩展优化方向
-
灌溉算法升级:当前Bang-Bang控制改为模糊PID,需添加:
- 土壤湿度变化率计算
- 历史浇水记录存储
- 天气数据接口调用
-
太阳能供电方案:
- 6V 2W太阳能板
- TP4056充电管理
- 18650电池组
-
边缘计算功能:
- 在本地实现作物生长预测
- 异常模式识别(如持续高温预警)
- 数据压缩后再上传
这个项目最让我意外的是,原本以为要上RTOS才能实现的实时性需求,通过精心设计的状态机和时间片调度,在裸机环境下也完美达成。特别是在ADC采样策略上,连续转换模式配合DMA传输,比传统单次采样方式节省了40%的CPU时间。