1. 项目概述与背景
作为一名在嵌入式系统和农业物联网领域摸爬滚打多年的工程师,我最近完成了一个基于STM32的智能农业监测系统项目。这个系统通过多种传感器实时采集农田环境数据,再通过WiFi将数据传输到手机端,让农民足不出户就能掌握作物生长环境。相比传统的人工巡检方式,这套系统将环境监测效率提升了至少10倍,数据更新频率达到每分钟一次,而成本仅相当于一个普通智能手机的价格。
现代农业已经进入精准化时代,环境参数的实时监测对作物产量和品质有着决定性影响。记得去年拜访过一个草莓种植基地,老板告诉我他们曾经因为夜间温湿度突变导致整季草莓减产30%,而类似的情况完全可以通过实时监测系统预警和避免。这正是我开发这套系统的初衷——用技术手段解决农业生产中的实际问题。
2. 核心硬件选型与设计思路
2.1 主控芯片选择:STM32F103C8T6
在项目初期,我对比了多种微控制器,最终选择了STM32F103C8T6这颗经典的Cortex-M3内核芯片。选择理由很实际:
- 72MHz主频足够处理多路传感器数据
- 64KB Flash和20KB RAM满足程序存储和运行需求
- 丰富的外设接口(3个USART、2个SPI、2个I2C)方便连接各类传感器
- 最重要的是,价格仅10元左右,性价比极高
提示:STM32F103C8T6有LQFP48和QFN48两种封装,建议选择LQFP48,手工焊接更容易。
2.2 传感器选型与对比
2.2.1 温湿度传感器:DHT11 vs DHT22
我测试了市面上常见的两款数字温湿度传感器:
- DHT11:精度±2℃(温度),±5%RH(湿度),响应时间6秒
- DHT22:精度±0.5℃,±2%RH,响应时间2秒
虽然DHT22精度更高,但考虑到农业环境监测对精度的要求不是极端严格,且DHT11价格只有DHT22的1/3,最终选择了DHT11。实测在温室环境中,DHT11的稳定性完全够用。
2.2.2 土壤湿度传感器:YL69
YL69是一款电阻式土壤湿度传感器,通过测量土壤电阻率反映湿度。它的优点是:
- 价格低廉(约5元)
- 输出模拟信号,接口简单
- 探头经过镀金处理,抗腐蚀性较好
但需要注意:
- 长期埋在土壤中会导致探头氧化,建议每季度取出清洁
- 不同土壤类型的校准值不同,需要针对性地调整阈值
2.2.3 光照传感器:BH1750 vs 5516
光照检测测试了两款模块:
- BH1750:数字输出,精度高,但需要I2C接口
- 5516:模拟输出,价格更低,直接连接ADC
考虑到系统已经有多个I2C设备,为避免地址冲突选择了5516光敏电阻模块。使用时需要注意:
- 安装时要避免直射阳光导致饱和
- 需定期清洁光敏表面,防止灰尘影响读数
2.3 无线通信模块:ESP8266
ESP8266-01S模块是我在多个项目中验证过的可靠选择:
- 支持802.11 b/g/n协议
- 内置TCP/IP协议栈
- 通过AT指令控制,开发简单
- 价格仅12元左右
实际使用中发现,在农田环境中,ESP8266的传输距离约50米(视距),足够覆盖典型大棚面积。对于更大面积的露天农田,可以考虑增加中继节点。
3. 硬件电路设计详解
3.1 主控电路设计
STM32最小系统包括:
- 8MHz晶振及负载电容(22pF)
- 复位电路(10k上拉电阻+0.1uF电容)
- BOOT0配置电阻(10k下拉)
- 3.3V稳压电路(AMS1117)
原理图设计要点:
- 每个电源引脚都要加0.1uF去耦电容
- 预留SWD调试接口
- 所有IO口引出测试点
3.2 传感器接口电路
3.2.1 DHT11连接电路
DHT11采用单总线协议,连接非常简单:
- VCC → 3.3V
- DATA → PC13(通过4.7k上拉)
- GND → GND
注意:DATA线上拉电阻不可省略,否则可能导致通信失败。
3.2.2 YL69土壤湿度传感器
YL69输出模拟信号,连接方式:
- VCC → 5V(注意不是3.3V)
- OUT → PA0(ADC1_IN0)
- GND → GND
由于YL69工作电压是5V,而STM32 ADC最大输入3.3V,需要添加分压电阻:
- 在OUT和PA0之间串联1k电阻
- PA0到GND接1k电阻
这样可将5V信号分压至2.5V,保证安全。
3.3 ESP8266连接设计
ESP8266-01S模块连接:
- VCC → 3.3V(需能提供500mA电流)
- GND → GND
- TX → PA10(USART1_RX)
- RX → PA9(USART1_TX)
- CH_PD → 3.3V
- GPIO0 → 悬空(下载模式时接地)
特别注意:ESP8266启动瞬间电流较大,建议单独使用一路LDO供电,避免影响主控稳定性。
4. 软件设计与实现
4.1 开发环境搭建
使用Keil MDK作为开发环境:
- 安装Keil MDK 5.25
- 安装STM32F1xx Device Family Pack
- 配置ST-Link调试器
- 安装串口调试工具(推荐SecureCRT)
4.2 主程序流程设计
系统采用前后台架构,主循环如下:
c复制while(1) {
// 1. 读取传感器数据
read_dht11(&temp, &humi);
soil_moisture = read_yl69();
light_level = read_5516();
// 2. OLED显示更新
oled_show_data(temp, humi, soil_moisture, light_level);
// 3. WiFi数据传输
if(++wifi_cnt >= 60) { // 每分钟发送一次
wifi_send_data(temp, humi, soil_moisture, light_level);
wifi_cnt = 0;
}
// 4. 低功耗处理
HAL_Delay(1000); // 1秒周期
}
4.3 关键驱动实现
4.3.1 DHT11驱动
DHT11的时序要求严格,实现时要注意:
- 主机拉低至少18ms后拉高20-40us
- 传感器响应信号为80us低+80us高
- 数据位以50us低电平开始,高电平26-28us表示0,70us表示1
典型读取函数:
c复制uint8_t dht11_read(uint8_t *temp, uint8_t *humi) {
uint8_t buf[5] = {0};
// 启动信号
DHT11_IO_OUT();
DHT11_DQ_OUT(0);
HAL_Delay(18);
DHT11_DQ_OUT(1);
delay_us(30);
// 等待响应
DHT11_IO_IN();
if(DHT11_DQ_IN() != 0) return 1;
while(DHT11_DQ_IN() == 0);
while(DHT11_DQ_IN() == 1);
// 读取40位数据
for(int i=0; i<5; i++) {
for(int j=0; j<8; j++) {
while(DHT11_DQ_IN() == 0);
delay_us(40);
buf[i] <<= 1;
if(DHT11_DQ_IN() == 1) buf[i] |= 1;
while(DHT11_DQ_IN() == 1);
}
}
// 校验和验证
if(buf[0] + buf[1] + buf[2] + buf[3] != buf[4]) return 2;
*humi = buf[0];
*temp = buf[2];
return 0;
}
4.3.2 ESP8266通信实现
WiFi模块初始化流程:
- 发送AT测试指令(AT\r\n)
- 设置WiFi模式(AT+CWMODE=1\r\n)
- 连接路由器(AT+CWJAP="SSID","PASSWORD"\r\n)
- 建立TCP连接(AT+CIPSTART="TCP","SERVER_IP",PORT\r\n)
数据发送函数示例:
c复制void wifi_send_data(float temp, float humi, uint8_t soil, uint16_t light) {
char cmd[64];
sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data));
uart_send(USART1, cmd);
HAL_Delay(100);
sprintf(cmd, "T=%.1f,H=%.1f,S=%d,L=%d\r\n", temp, humi, soil, light);
uart_send(USART1, cmd);
}
5. 系统测试与优化
5.1 传感器精度测试
在恒温恒湿箱中对DHT11进行了24小时连续测试:
- 温度误差:±1.2℃(在20-30℃范围内)
- 湿度误差:±3.5%RH(在40-80%RH范围内)
YL69土壤湿度传感器测试方法:
- 将探头完全浸入水中,读取值为980(ADC 12位值)
- 将探头完全干燥,读取值为120
- 实际土壤湿度 = (ADC值 - 120) / (980 - 120) * 100%
5.2 无线传输稳定性测试
在三种典型场景下的测试结果:
| 场景 | 距离 | 丢包率 | 平均延迟 |
|---|---|---|---|
| 温室大棚 | 30m | 0.5% | 120ms |
| 露天农田 | 50m | 2.1% | 180ms |
| 有遮挡环境 | 20m | 5.3% | 250ms |
为提高可靠性,软件上实现了以下机制:
- 数据重传(最多3次)
- 心跳包检测(每5分钟)
- 断线自动重连
5.3 功耗优化
系统主要功耗来源:
- ESP8266(工作时80mA,休眠时0.5mA)
- OLED显示屏(20mA)
- STM32(运行模式12mA,睡眠模式2mA)
采取的优化措施:
- 将数据发送间隔从10秒调整为60秒
- OLED在不操作30秒后进入低亮度模式
- STM32在空闲时段进入Sleep模式
优化后,使用2000mAh锂电池可连续工作约48小时。如需更长续航,可考虑太阳能供电方案。
6. 实际应用案例
去年在本地一个番茄种植基地部署了3套该系统,取得了显著效果:
- 及时发现了一次夜间低温预警,避免了可能的经济损失
- 通过土壤湿度数据优化了灌溉方案,节水约15%
- 减少了人工巡检工作量,每月节省人力成本约2000元
基地负责人反馈最有价值的功能是:
- 手机端实时查看数据
- 异常情况推送报警
- 历史数据趋势分析
7. 常见问题与解决方法
7.1 DHT11读取失败
可能原因:
- 时序不准确 → 调整延时参数
- 上拉电阻过大 → 改用4.7k电阻
- 电源不稳 → 增加0.1uF去耦电容
7.2 ESP8266连接不稳定
解决方案:
- 检查天线位置,避免被金属屏蔽
- 降低波特率到115200
- 添加AT指令重试机制
7.3 土壤湿度读数漂移
处理方法:
- 定期清洁传感器探头
- 针对不同土壤类型单独校准
- 采用滑动平均滤波算法
8. 项目扩展方向
-
增加更多传感器:
- CO2浓度监测
- 土壤PH值检测
- 降雨量检测
-
云端数据存储与分析:
- 接入阿里云IoT平台
- 实现大数据分析
- 提供种植建议
-
执行机构联动:
- 自动灌溉控制
- 卷帘机控制
- 补光灯控制
这套系统经过多次迭代已经相当稳定,核心代码和电路设计可以在我GitHub仓库找到。对于想入门农业物联网的开发者,这个项目是一个很好的起点,既包含了嵌入式开发的典型技术点,又解决了实际农业问题。在实际部署时,建议先从一个小型温室开始验证,再逐步扩大应用范围。