1. 项目概述
这个基于STM32单片机的水位检测报警装置是我去年为一个水产养殖场设计的实用型监测设备。当时养殖场老板正为夜间水池水位异常波动导致鱼群缺氧的问题头疼,市面上成品监测设备要么价格昂贵,要么功能单一。于是我用STM32F103C8T6作为主控,搭配超声波传感器和蜂鸣器报警模块,花了三周时间完成了这个成本不到200元但相当可靠的解决方案。
这套装置的核心功能是通过超声波测距原理实时监测水位变化,当水位低于或高于预设阈值时触发声光报警,并通过OLED屏幕显示当前水位状态。相比传统浮球式水位开关,它具有测量精度高(±1cm)、响应速度快(100ms级)、可设置多级报警阈值等优势,特别适合需要精确水位控制的场景。
2. 硬件设计解析
2.1 核心器件选型
主控芯片选择STM32F103C8T6主要基于三点考虑:
- 72MHz主频和20KB RAM足够处理超声波测距算法
- 内置12位ADC可满足模拟信号采集需求
- 丰富的GPIO接口方便扩展外围设备
水位传感器选用HY-SRF05超声波模块,相比HC-SR04有以下改进:
- 测量范围扩大至4.5米(实际使用2米量程)
- 内置温度补偿电路,环境适应性更好
- 0.3cm~4.5cm的盲区更小
注意:超声波模块安装时需保持发射面与水面平行,倾斜角度超过15°会导致回波信号衰减严重。
2.2 电路设计要点
电源部分采用AMS1117-3.3V稳压芯片,输入支持5-12V宽电压,特别考虑了养殖场可能存在的电压波动问题。实际测试中,当输入电压跌至4.5V时系统仍能稳定工作。
报警电路设计为两级触发:
- 第一级(水位偏离±5cm):蓝色LED闪烁
- 第二级(水位偏离±10cm):红色LED常亮+蜂鸣器鸣叫
这种分级报警方式避免了频繁误报,我在PCB布局时将蜂鸣器驱动三极管(S8050)尽量靠近MCU,减少信号传输干扰。
3. 软件实现细节
3.1 测距算法优化
超声波测距采用经典的渡越时间法,但针对水面波动做了特殊处理:
c复制#define SOUND_SPEED 343.2 // 声速(m/s)
float getWaterLevel() {
float sum = 0;
for(int i=0; i<5; i++){ // 5次测量取中值
triggerSensor();
float t = getEchoTime() / 2.0;
distance[i] = t * SOUND_SPEED * 100; // cm单位
delay(50);
}
bubbleSort(distance); // 冒泡排序去抖动
return distance[2]; // 取中值
}
实测发现,这种中值滤波算法能将波浪引起的测量误差控制在±1cm内,比简单算术平均效果更好。
3.2 报警逻辑实现
报警阈值通过旋转编码器设置,数值存储在STM32的Flash中,断电不丢失。关键代码如下:
c复制void checkAlarm(float level) {
static uint8_t alarm_state = 0;
if(level < threshold_low) {
if(alarm_state != 1) {
startBuzzer(INTERMITTENT);
alarm_state = 1;
}
}
else if(level > threshold_high) {
if(alarm_state != 2) {
startBuzzer(CONTINUOUS);
alarm_state = 2;
}
}
else {
stopBuzzer();
alarm_state = 0;
}
}
这里采用状态机模式避免重复触发,只有当水位跨越不同阈值区域时才改变报警模式。
4. 现场安装与调试
4.1 机械结构设计
使用PVC管制作传感器支架时,我总结出几个要点:
- 固定支架需超出水池边缘20cm以上,避免雨水倒流
- 超声波模块距离水面最佳高度为量程的1/3(如2米量程则安装在60-70cm高处)
- 导线套上波纹管防护,防止鸟类啄咬
4.2 校准步骤
设备安装后必须进行三点校准:
- 空池状态:测量传感器到池底距离设为基准值
- 注水至50%:记录此时测距值
- 满池状态:记录最终测距值
通过这组数据建立线性换算表,我在代码中采用了分段线性插值算法:
c复制float convertToDepth(float distance) {
if(distance > calib_data.empty)
return 0; // 无水状态
else if(distance > calib_data.half)
return (calib_data.empty - distance) * calib_data.factor1;
else
return calib_data.half_depth +
(calib_data.half - distance) * calib_data.factor2;
}
5. 常见问题排查
5.1 测量值跳变
现象:水位静止时读数波动超过3cm
排查步骤:
- 检查电源电压是否稳定(万用表测量3.3V引脚)
- 观察传感器表面是否有凝结水珠(需定期擦拭)
- 尝试在代码中增加滤波系数(我通常用0.2-0.3的加权系数)
5.2 误报警问题
遇到降雨天气时,曾出现误报警情况。解决方案:
- 在软件中加入变化率检测,水位骤变超过5cm/min才触发报警
- 外壳增加遮雨檐,防止水滴直接落在传感器表面
- 设置10秒延迟确认机制,避免瞬时干扰
6. 功耗优化技巧
为延长电池供电时的使用时间,我做了以下优化:
- 采用中断唤醒模式,非测量时段MCU进入STOP模式
- 超声波模块供电由MOSFET控制,采样周期从1秒延长到5秒
- OLED屏幕设置为30秒无操作自动关闭背光
实测表明,这些措施使系统平均电流从25mA降至3.8mA,2000mAh锂电池可连续工作约21天。
这个项目最让我意外的是超声波模块在高温高湿环境下的稳定性表现。经过一年多的现场运行,除定期清洁传感器表面外,几乎没有维护需求。后续可以考虑增加4G模块实现远程报警,这对大型养殖场会更有价值。
