1. 项目概述
去年夏天帮老家改造农田灌溉系统时,我深刻体会到传统人工灌溉的痛点:大伯每天要顶着烈日往返田间多次查看土壤墒情,既费时又难以精准控制水量。于是我用STM32设计了一套能自动感知土壤湿度的智能灌溉系统,现在这套设备已经稳定运行了8个月,节水效果达到35%以上。
这个系统核心在于用STM32F103C8T6作为主控,通过土壤湿度传感器实时采集数据,当检测到湿度低于设定阈值时自动启动水泵,配合OLED屏幕和手机APP实现双重监控。特别适合5亩以下的小型农田或家庭菜园,整套硬件成本可以控制在200元以内。
2. 硬件设计与选型
2.1 主控芯片选择
选用STM32F103C8T6(蓝色pill开发板)主要基于三点考虑:
- 72MHz主频足够处理传感器数据并运行PID控制算法
- 内置12位ADC可直接读取模拟传感器
- 丰富的GPIO接口可扩展多个水泵和传感器
注意:购买时要认准正版芯片,市面上有些仿制品ADC精度不达标。我测试过某宝15元的"兼容版",湿度检测误差高达±8%,而正版芯片误差在±3%以内。
2.2 传感器选型对比
测试过三种主流土壤湿度传感器:
| 型号 | 原理 | 优点 | 缺点 | 单价 |
|---|---|---|---|---|
| FC-28 | 电阻式 | 价格低(¥5) | 易腐蚀 | ¥8 |
| SHT30 | 电容式 | 精度高 | 需I2C接口 | ¥35 |
| T-Higrow | 复合式 | 带温度补偿 | 响应慢 | ¥60 |
最终选择FC-28加防腐蚀处理方案,具体做法:
- 传感器探头涂覆纳米防水涂层
- 工作电压降为3.3V(减少电解)
- 每6小时仅通电采集30秒数据
2.3 水泵驱动电路设计
采用MOSFET驱动水泵时有个坑要注意:直接连接会导致MCU复位。解决方案是:
- 添加光耦隔离(PC817)
- 续流二极管选型要用快恢复型(FR107)
- 电源单独供电(与MCU分开)
c复制// 驱动代码示例
void Pump_Control(uint8_t state)
{
GPIO_WriteBit(PUMP_PORT, PUMP_PIN, (state) ? Bit_SET : Bit_RESET);
// 添加500ms软启动防止水锤效应
if(state) delay_ms(500);
}
3. 软件架构实现
3.1 湿度检测算法优化
原始传感器数据需要经过三重处理:
- 滑动平均滤波(窗口大小=10)
- 温度补偿(当气温>35℃时增加5%湿度修正)
- 动态阈值调整(根据作物类型自动调节)
c复制#define WHEAT_THRESHOLD 45 // 小麦湿度阈值%
#define VEGETABLE_THRESHOLD 60
uint8_t Get_SoilHumidity(void)
{
static uint16_t buf[10];
static uint8_t index = 0;
uint32_t sum = 0;
buf[index++] = ADC_Read();
if(index >= 10) index = 0;
for(uint8_t i=0; i<10; i++)
sum += buf[i];
return (uint8_t)(sum/10 * 0.826); // 转换为百分比
}
3.2 低功耗设计技巧
为延长电池供电时的使用时间,我做了这些优化:
- 主循环中加入停机模式(STOP Mode)
- 传感器定时唤醒(RTC每2小时触发)
- 关闭未用外设时钟
实测功耗对比:
- 持续工作模式:18.6mA
- 优化后平均功耗:2.3mA(CR2032电池可撑3个月)
3.3 手机APP通信方案
采用ESP-01S WiFi模块实现物联网功能时,要注意:
- AT指令需要严格时序控制(每个命令后加200ms延迟)
- 启用TCP保活机制(每5分钟心跳包)
- 数据包添加CRC校验
APP端关键功能实现:
java复制// Android端MQTT订阅示例
public void subscribeTopic() {
try {
client.subscribe("farm/"+deviceID+"/humidity", 0);
client.subscribe("farm/"+deviceID+"/pump_status", 0);
} catch (MqttException e) {
e.printStackTrace();
}
}
4. 现场安装与调试
4.1 传感器部署要点
- 安装深度:根据不同作物根系深度调整
- 浅根作物(生菜):10-15cm
- 深根作物(番茄):20-30cm
- 避免安装在施肥点附近(肥料导电影响读数)
- 多个传感器应呈三角形布置(取平均值)
4.2 典型故障排查
遇到过最棘手的问题:雨天误触发灌溉。解决方案:
- 增加雨滴传感器作为二级判断
- 启用历史数据趋势分析(连续3次下降才触发)
- 设置最大单次灌溉时长(默认不超过10分钟)
4.3 系统校准方法
准备500g干燥土壤样本,按以下步骤校准:
- 将传感器插入干燥样本,记录ADC值(通常≈1023)
- 逐渐加水至完全饱和,记录ADC值(通常≈300)
- 在代码中修改这两个临界值:
c复制#define DRY_VALUE 1023
#define WET_VALUE 300
5. 实际应用效果
在大伯的2亩菜地上对比测试结果:
| 指标 | 传统方式 | 智能系统 | 提升 |
|---|---|---|---|
| 用水量 | 58m³/月 | 38m³/月 | 34% |
| 人力成本 | 3小时/天 | 0.5小时/天 | 83% |
| 作物产量 | 142kg | 158kg | +11% |
关键改进点:
- 增加多云天气预测功能(通过API获取天气预报)
- 水泵增加压力传感器(防止空转损坏)
- 采用太阳能供电+锂电池方案
这套系统后来还被邻居用在蘑菇种植房,湿度控制精度要求更高(±2%),我在原基础上增加了以下改进:
- 改用SHT30高精度传感器
- 添加CO2浓度监测
- 引入模糊PID控制算法