1. 项目概述
这个基于STM32单片机的河流防汛监控系统是我去年指导的一个本科毕业设计项目,经过三个月的开发和调试,最终实现了一套低成本、高可靠性的河道水位监测方案。系统通过超声波传感器实时采集水位数据,配合雨量传感器和摄像头模块,构建了一套完整的防汛预警体系。
在实际部署测试中,这套系统成功监测到了两次小型洪水预警,报警响应时间在3秒以内,数据上传间隔可配置为1-60秒,完全满足中小河流的防汛监控需求。相比市面上的商用解决方案,我们的成本控制在300元以内,特别适合农村地区和中小型水利工程使用。
2. 系统设计思路
2.1 核心需求分析
防汛监控系统的核心是要解决三个关键问题:
- 实时性:必须能够快速响应水位变化
- 可靠性:在恶劣天气条件下仍能稳定工作
- 远程监控:管理人员可以随时查看现场情况
基于这些需求,我们选择了以下技术方案:
- 主控芯片:STM32F103C8T6,72MHz主频,足够处理传感器数据
- 通信方式:ESP8266 WiFi模块,支持AT指令配置
- 水位检测:HC-SR04超声波模块,测量范围2-400cm
- 雨量检测:翻斗式雨量传感器,分辨率为0.2mm/次
2.2 硬件架构设计
整个系统采用模块化设计,分为以下几个部分:
code复制[传感器层]
├─ 超声波水位计
├─ 翻斗式雨量计
└─ OV2640摄像头
[控制层]
└─ STM32F103C8T6主控板
├─ 按键输入
├─ OLED显示
└─ 声光报警器
[通信层]
└─ ESP8266 WiFi模块
└─ 手机APP/微信小程序
这种分层架构的好处是:
- 各模块可以独立开发和测试
- 故障隔离性强,单个模块损坏不影响整体
- 便于后期功能扩展
3. 硬件实现细节
3.1 主控板设计要点
PCB设计采用两层板结构,关键注意事项:
- 电源部分:使用AMS1117-3.3稳压芯片,输入电容100μF,输出电容10μF
- 复位电路:10kΩ上拉电阻+0.1μF电容,保证可靠复位
- 晶振布局:尽量靠近MCU,走线等长,包地处理
- WiFi模块天线区域:禁止敷铜,预留足够的净空区
重要提示:STM32的NRST引脚必须引出测试点,方便调试时手动复位
3.2 传感器接口设计
- 超声波模块接口:
c复制// 引脚定义
#define TRIG_PIN PA1
#define ECHO_PIN PA2
// 初始化代码
GPIO_Init(TRIG_PIN, GPIO_MODE_OUT_PP);
GPIO_Init(ECHO_PIN, GPIO_MODE_IN_FLOATING);
- 雨量传感器接口:
采用外部中断方式计数,每翻转一次代表0.2mm降雨量
c复制// 引脚定义
#define RAIN_PIN PA3
// 初始化代码
GPIO_Init(RAIN_PIN, GPIO_MODE_IN_PU);
EXTI_Config(RAIN_PIN, EXTI_Trigger_Falling);
- 摄像头接口:
使用DCMI接口连接OV2640,配置为QVGA分辨率(320x240),JPEG输出
4. 软件实现关键点
4.1 主程序流程设计
采用时间片轮询架构,确保实时性:
c复制void main(void)
{
Hardware_Init(); // 硬件初始化
while(1) {
if(TIM_Check(TIM_WATER)) // 每100ms检测一次水位
WaterLevel_Update();
if(TIM_Check(TIM_RAIN)) // 每1s统计雨量
RainFall_Calculate();
if(TIM_Check(TIM_UPLOAD)) // 每30s上传数据
WiFi_SendData();
Key_Scan(); // 按键扫描
OLED_Refresh(); // 显示刷新
}
}
4.2 水位测量算法优化
原始超声波测距存在波动问题,我们采用三重滤波算法:
- 硬件滤波:在ECHO引脚添加100nF电容
- 软件滤波:连续采样5次,去掉最大最小值后取平均
- 趋势滤波:当变化超过10%时,连续确认3次才更新
具体实现:
c复制float Get_WaterLevel(void)
{
float temp[5];
for(int i=0; i<5; i++) {
temp[i] = HC_SR04_Measure();
Delay_ms(10);
}
// 冒泡排序
Bubble_Sort(temp, 5);
// 取中间3个值平均
return (temp[1]+temp[2]+temp[3])/3;
}
4.3 无线通信协议设计
采用精简的JSON格式传输数据:
json复制{
"id":"DZ-1076",
"time":"2024-03-20 14:30:00",
"water":{
"value":125.6,
"unit":"cm",
"status":"normal"
},
"rain":{
"value":12.8,
"unit":"mm/h",
"status":"warning"
}
}
通信流程:
- 建立TCP连接
- 发送心跳包(每60秒)
- 数据变化时主动上报
- 接收手机端控制指令
5. 实际部署经验
5.1 安装注意事项
- 超声波传感器安装:
- 距水面垂直距离1-3米为宜
- 避免阳光直射传感器表面
- 周围1米内不要有障碍物
- 雨量传感器安装:
- 水平安装,使用水准仪校准
- 远离树木和建筑物
- 定期清理滤网
- 供电建议:
- 太阳能供电时,电池容量≥20Ah
- 市电供电时,建议使用防雷插座
5.2 常见问题排查
- 水位数据跳变:
- 检查传感器固定是否牢固
- 测量水面是否有剧烈波动
- 尝试调整滤波算法参数
- WiFi频繁断开:
- 检查天线方向
- 修改AP信号强度阈值
- 增加心跳包间隔
- 摄像头画面卡顿:
- 降低分辨率到160x120
- 调整JPEG质量参数
- 检查WiFi信号强度
6. 系统优化方向
在实际使用中,我们发现还可以从以下几个方面进行改进:
- 低功耗优化:
- 采用STM32L系列低功耗MCU
- 增加休眠模式,定时唤醒
- 优化传感器供电策略
- 数据可靠性提升:
- 增加本地SD卡存储
- 实现断点续传功能
- 添加数据校验机制
- 扩展功能:
- 增加水质监测传感器
- 支持4G/NB-IoT备用通信
- 开发微信小程序监控端
这个项目最让我自豪的是它的实用性和性价比。有学生在西部山区的小型水电站部署了这套系统,仅用市面同类产品1/5的成本就实现了基本相同的功能。在调试过程中,我们发现超声波传感器在雨天会有误差,后来通过增加雨量补偿算法解决了这个问题。
