1. 项目概述与核心功能解析
这个基于STM32F103ZET6的智能病虫害识别系统,是我在农业物联网领域的一次成功实践。整套系统通过硬件采集、图像处理和无线传输的有机结合,实现了植物病虫害的自动化监测。相比传统人工巡检方式,这套方案在时效性和准确性上都有显著提升。
核心功能模块可分为三个层次:
- 数据采集层:OV系列摄像头负责图像捕捉,DHT11传感器采集环境温湿度
- 数据处理层:STM32单片机进行图像预处理和简单分析
- 数据交互层:蓝牙4.0模块实现与移动端的无线通信,TF卡用于本地存储
特别值得一提的是,系统设计了双重触发机制:既支持定时自动拍摄(默认1分钟间隔),也保留了手动拍照按钮。这种设计既保证了监测的连续性,又为现场诊断提供了灵活操作空间。
2. 硬件系统设计与选型考量
2.1 主控芯片选型分析
选择STM32F103ZET6作为主控主要基于三点考虑:
- 性能需求:病虫害识别需要处理1600x1200分辨率的JPEG图像,ZET6的72MHz主频和512KB Flash完全满足要求
- 外设接口:该型号提供FSMC接口驱动TFT屏,自带SDIO接口支持TF卡,USART3可用于蓝牙通信
- 成本控制:相比F4/F7系列,F103在满足需求的前提下更具价格优势
实际测试中,我们通过DMA传输将图像数据直接写入TF卡,节省了约35%的CPU资源。关键配置如下:
c复制// SDIO初始化关键参数
SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;
SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
2.2 图像采集模块实现
采用OV7670摄像头模块时,需要注意三个关键点:
- 供电稳定性:单独使用AMS1117-3.3为摄像头供电,避免电源噪声影响图像质量
- 帧缓冲设计:在内部SRAM开辟30KB缓冲区,采用乒乓操作处理图像数据
- 光照补偿:通过PWM动态调整摄像头板载LED亮度,保证暗光环境下的成像质量
我们在代码中实现了自动曝光补偿算法:
c复制void AE_Adjust(uint8_t *img)
{
uint32_t hist[256] = {0};
// 计算直方图
for(int i=0; i<IMG_SIZE; i++) {
hist[img[i]]++;
}
// 自动调整曝光值
if(hist[0] > IMG_SIZE/3) {
CAM_SetExposure(CAM_GetExposure()+5);
}
}
2.3 蓝牙传输优化方案
HC-05蓝牙模块的传输优化要点:
- 数据分包:将温湿度数据打包为20字节/包,添加帧头和校验位
- 重传机制:当连续3次未收到ACK时自动重发
- 功耗控制:在空闲时段切换至SNIFF模式,降低30%功耗
实测传输协议设计如下表:
| 字节位置 | 内容 | 说明 |
|---|---|---|
| 0 | 0xAA | 帧头标识 |
| 1 | 0x01 | 数据类型(温湿度) |
| 2-5 | float | 温度值(大端序) |
| 6-9 | float | 湿度值(大端序) |
| 10 | 0x55 | 帧尾标识 |
3. 软件架构与关键算法实现
3.1 系统任务调度设计
采用时间片轮询架构,确保各功能模块的实时性。优先级安排如下:
- 图像采集任务(最高优先级)
- 蓝牙通信任务
- 温湿度采集任务
- 用户界面刷新任务
FreeRTOS任务创建示例:
c复制xTaskCreate(vImageCaptureTask, "ImgCap", 256, NULL, 4, NULL);
xTaskCreate(vBleCommTask, "BLE", 128, NULL, 3, NULL);
xTaskCreate(vDHT11Task, "Sensor", 64, NULL, 2, NULL);
3.2 图像处理流水线
病虫害识别采用三级处理流程:
- 预处理:中值滤波去噪 + 直方图均衡化
- 特征提取:Sobel边缘检测 + 颜色空间转换(HSV)
- 模式匹配:基于预存特征模板的相似度计算
关键算法实现代码片段:
c复制float MatchDisease(uint8_t *img)
{
float score = 0;
// 颜色特征比对
score += 0.6 * ColorMatch(img);
// 纹理特征比对
score += 0.4 * TextureMatch(img);
return score;
}
3.3 移动端交互设计
Android端采用分层架构:
- 通信层:管理蓝牙连接和数据接收
- 业务层:实现数据解析和预警判断
- 展示层:使用MPAndroidChart绘制温湿度曲线
蓝牙通信核心代码:
java复制private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
byte[] data = characteristic.getValue();
if(data[0] == (byte)0xAA && data[10] == (byte)0x55) {
float temp = ByteBuffer.wrap(data, 2, 4).getFloat();
float humi = ByteBuffer.wrap(data, 6, 4).getFloat();
updateUI(temp, humi);
}
}
};
4. 系统集成与调试经验
4.1 硬件调试要点
-
电源噪声处理:
- 在每个IC的VCC引脚添加0.1μF去耦电容
- 模拟部分使用LC滤波电路(10μH+10μF)
-
信号完整性:
- 摄像头并行总线加33Ω串联电阻
- 蓝牙模块天线周围做净空处理
-
实测功耗数据:
| 工作模式 | 电流消耗 | 持续时间占比 |
|---|---|---|
| 图像采集 | 120mA | 15% |
| 蓝牙传输 | 25mA | 5% |
| 低功耗待机 | 8mA | 80% |
4.2 软件调试技巧
-
内存优化:
- 使用
__attribute__((section(".ccmram")))将图像缓冲区放在CCM内存 - 启用FPU加速浮点运算
- 使用
-
调试手段:
- 通过SWD接口实时查看变量
- 利用串口打印任务堆栈使用情况
-
典型问题解决方案:
| 现象 | 排查方法 | 解决方案 |
|---|---|---|
| 图像出现横条纹 | 检查VSYNC信号时序 | 调整摄像头寄存器0x15 |
| 蓝牙连接不稳定 | 用逻辑分析仪抓取HCI包 | 修改主机连接参数为40ms间隔 |
| TF卡写入速度慢 | 测试不同SDIO时钟分频 | 改用4线模式+DMA传输 |
4.3 田间部署注意事项
-
环境适应性改造:
- 加装防水外壳(IP65等级)
- 使用太阳电池板+18650电池供电方案
-
安装位置选择:
- 距作物高度1.2-1.5米
- 避免正午阳光直射镜头
-
维护要点:
- 每周清洁镜头一次
- 每月检查TF卡剩余空间
- 每季度校准一次温湿度传感器
5. 效果评估与优化方向
5.1 系统性能指标
经过三个月实地测试,主要性能参数如下:
- 识别准确率:82.3%(针对10种常见病虫害)
- 响应时间:从拍照到蓝牙传输完成平均1.8秒
- 续航能力:2000mAh电池可连续工作72小时
- 温度测量误差:±0.5℃(15-35℃范围内)
5.2 典型应用场景
-
大棚监测:
- 安装密度:每200㎡布置1个节点
- 报警阈值:连续3次检测到病虫害特征
-
田间网格化监测:
- 组成ZigBee自组网
- 通过网关汇总数据
-
实验室研究:
- 导出TF卡中的时序图像
- 分析病虫害发展规律
5.3 后续改进计划
-
算法升级:
- 引入轻量级CNN模型(如MobileNetV2)
- 增加迁移学习功能
-
硬件迭代:
- 改用STM32U5系列降低功耗
- 升级至500万像素摄像头
-
功能扩展:
- 增加LoRa远距离传输
- 集成土壤墒情传感器
在实际部署中,���发现系统的防误报机制还需要加强。下一步准备引入时间序列分析算法,将短期波动与真实病虫害特征进行更准确的区分。同时考虑增加设备自检功能,定期报告各传感器的工作状态。
