1. 项目概述:当农业遇上物联网
去年帮朋友改造他的草莓大棚时,我深刻体会到传统农业监测的痛点——每天要跑好几趟大棚记录温湿度,遇到极端天气更是手忙脚乱。这个基于STM32的远程监控系统,就是我们用3000元预算打造的"农业黑科技",现在朋友通过手机就能随时查看棚内环境,自动灌溉系统根据土壤湿度精准补水,作物产量提升了20%。
这套系统的核心在于将STM32的实时控制能力与物联网技术结合:主控采用STM32F103C8T6(成本不到20元),通过DHT22传感器采集温湿度,BH1750测光照,土壤湿度传感器采用电阻式探头。数据通过ESP8266上传到云端,配合自行开发的微信小程序,实现了数据可视化与阈值报警功能。特别设计的低功耗模式,让系统在太阳能供电下能持续工作30天。
2. 硬件系统设计解析
2.1 主控芯片选型对比
在STM32系列中,我们最终选择了Cortex-M3内核的STM32F103C8T6,而不是更便宜的STM8或更高级的STM32F4,主要基于三点考量:
- 外设需求:需要3个UART(1个接ESP8266,1个接调试口,1个备用),ADC通道≥8路
- 运算能力:要同时处理4路传感器数据+PID控制算法,M3内核的72MHz主频足够
- 成本控制:批量采购价18.5元/片,远低于F4系列(约50元)
经验提示:淘宝上的"最小系统板"虽然便宜(约15元),但建议选择带CH340G串口芯片的版本(25元左右),否则需要额外购买ST-Link调试器。
2.2 传感器组配置方案
我们设计了模块化的传感器布局(图示见附录):
-
空气监测模块:
- DHT22温湿度传感器(精度±0.5℃)
- 安装位置:距地面1.5米,远离通风口
- 防结露处理:3D打印防护罩+硅胶密封
-
光照监测模块:
- BH1750数字光照传感器(0-65535 lux)
- 特别加装余弦校正器,避免角度误差
- 采样策略:每10分钟取30次读数去极值平均
-
土壤监测阵列:
- 采用5个土壤湿度传感器(电阻式)
- 布点方案:对角线布置+中心点
- 防腐蚀处理:镀金探头+间歇供电(通电<1秒/次)
实测中发现,市售的土壤传感器在长期使用后容易出现电解腐蚀。我们的解决方案是:
- 供电改为PWM控制(占空比5%)
- 每次测量后立即断电
- 探头表面涂抹凡士林
3. 关键电路设计细节
3.1 电源管理系统
考虑到大棚通常没有稳定市电,我们设计了双电源方案:
cpp复制// 电源切换逻辑代码示例
void Power_Check(void) {
if( Solar_Voltage > 5.0 ) {
Enable_Solar();
Charge_Battery();
} else {
Switch_to_Battery();
if(Bat_Voltage < 3.3) Enter_LowPowerMode();
}
}
具体实现:
- 太阳能板:20W 6V(阴天仍能输出3W)
- 储能电池:18650两并两串(7.4V 6000mAh)
- 转换电路:TPS5430降压到5V给ESP8266,AMS1117-3.3给STM32
3.2 抗干扰设计实录
在初期测试中,ESP8266的WiFi信号导致ADC读数波动达±10%,通过以下措施降至±1%:
-
物理隔离:
- 传感器线缆使用双绞线+铝箔屏蔽
- WiFi模块远离模拟电路≥15cm
-
软件滤波:
- 采用滑动加权平均滤波算法
- 代码片段:
c复制#define FILTER_LEN 10
float Weighted_Filter(float new_val) {
static float buffer[FILTER_LEN];
static uint8_t idx = 0;
buffer[idx] = new_val;
idx = (idx + 1) % FILTER_LEN;
float sum = 0, weight_sum = 0;
for(uint8_t i=0; i<FILTER_LEN; i++) {
float w = (i == idx) ? 0.5 : 0.5/(FILTER_LEN-1); // 最新值权重50%
sum += buffer[i] * w;
weight_sum += w;
}
return sum / weight_sum;
}
4. 软件架构与通信协议
4.1 嵌入式端程序设计
采用RT-Thread Nano实时操作系统,任务划分如下:
-
传感器采集线程(优先级5)
- 执行周期:温湿度1分钟,光照5分钟,土壤湿度30分钟
- 内存占用:2KB栈空间
-
通信线程(优先级3)
- MQTT协议发布数据
- 支持AT指令重试机制(最多3次)
-
控制线程(优先级7)
- 实现简单的PID控制算法
- 紧急情况下可绕过OS直接操作GPIO
关键数据结构设计:
c复制#pragma pack(1)
typedef struct {
uint16_t temp; // 温度*10 (℃)
uint16_t humidity; // 湿度*10 (%)
uint32_t light; // 光照强度 (lux)
uint8_t soil[5]; // 5个土壤湿度点 (%)
uint32_t timestamp;
} EnvData_t;
#pragma pack()
4.2 云端通信优化
为降低流量消耗(朋友大棚只有2G信号),我们设计了紧凑的通信协议:
-
数据包格式:
- 包头:0xAA 0x55(2字节)
- 数据长度:1字节
- 数据体:最大32字节
- CRC8校验:1字节
-
传输策略:
- 正常模式:每5分钟上传(约1.2KB/天)
- 异常模式:数据突变时立即上传
- 心跳包:每1小时(维持TCP连接)
实测表明,这种方案比常规MQTT协议节省40%流量,在弱信号环境下丢包率<0.1%。
5. 实际部署与问题排查
5.1 安装调试实录
在大棚部署时遇到的典型问题及解决方案:
| 问题现象 | 可能原因 | 排查工具 | 解决方法 |
|---|---|---|---|
| DHT22读数异常 | 线缆过长(>3m) | 逻辑分析仪 | 缩短至1.5m内,加120Ω终端电阻 |
| ESP8266频繁掉线 | 电源纹波过大 | 示波器 | 增加220μF电解电容+0.1μF陶瓷电容 |
| 土壤数据漂移 | 电解效应 | 万用表 | 改用PWM供电,降低测量频率 |
5.2 长期运行维护
经过6个月的实际运行,总结出以下维护要点:
-
每月检查:
- 清洁太阳能板表面
- 检查密封胶是否开裂
- 校准传感器(用标准温湿度计对比)
-
季节性调整:
- 夏季增加通风控制权重
- 冬季注意防结露
- 雨季前检查防水措施
-
数据备份:
- 本地SD卡存储原始数据
- 云端保留最近1年记录
- 异常数据自动标记
6. 系统扩展与优化方向
当前系统已稳定运行9个月,下一步计划升级这些功能:
-
图像监控扩展:
- 添加低功耗摄像头(如ESP32-CAM)
- 采用移动侦测触发拍摄
- 使用TensorFlow Lite实现简单病害识别
-
控制策略优化:
- 引入机器学习算法预测环境变化
- 结合天气预报数据动态调整阈值
- 增加设备联动(如卷帘机+喷灌)
-
能源管理升级:
- 超级电容替代部分电池
- 太阳能MPPT充电优化
- 能耗可视化分析
这个项目最让我意外的收获是:原本为草莓大棚设计的系统,被周边葡萄、蘑菇种植户借鉴改造后,竟然衍生出5种不同的变体。农业物联网的适配性远比想象中强大,关键是要吃透底层原理,才能做出真正实用的设备。