1. 项目背景与需求分析
地下室漏水问题一直是建筑维护中的顽疾。传统的人工巡检方式效率低下,往往发现渗漏时已经造成严重损失。我们这个基于STM32的智能防漏水系统,就是为了解决这个痛点而设计的。
去年夏天,我帮朋友处理过一次地下室严重渗水事故。等发现时,整个配电箱都泡在水里,维修费用高达五位数。这次经历让我下定决心开发一套可靠的自动化监测方案。STM32系列单片机以其出色的性价比和丰富的外设接口,成为本项目的理想控制核心。
这套系统需要实现三个核心功能:
- 实时水位监测(精度±1cm)
- 异常情况自动报警(短信+声光)
- 可选配的自动排水控制
2. 硬件系统设计
2.1 核心控制器选型
经过对比STM32F1和STM32F4系列,最终选用STM32F103C8T6作为主控:
- 72MHz主频足够处理传感器数据
- 内置12位ADC满足水位检测精度要求
- 多达37个GPIO可扩展多种外设
- 市场价格仅15-20元,性价比突出
注意:购买时认准"正品丝印",市场上存在打磨翻新片。我曾在某宝买到假货导致ADC读数异常。
2.2 水位检测方案对比
测试了三种常见的水位传感器:
| 传感器类型 | 测量范围 | 精度 | 价格 | 适用性 |
|---|---|---|---|---|
| 超声波HC-SR04 | 2-400cm | ±3mm | 25元 | 易受雾气干扰 |
| 光电式Water Sensor | 0-4cm | ±1cm | 8元 | 仅适合浅水位 |
| 压力式MS5803 | 0-10m | ±1cm | 85元 | 最佳但成本高 |
最终选择组合方案:
- 地面5cm内使用光电传感器(防潮处理)
- 主要监测区域用超声波传感器
- 重要设备间加装压力传感器
2.3 报警模块设计
采用三级报警机制:
- 本地声光报警(蜂鸣器+LED)
- GSM短信报警(SIM800模块)
- 可选物联网上传(ESP8266 WiFi模块)
特别提醒:GSM模块需要:
- 单独5V/2A电源
- 添加TVS二极管防浪涌
- 配置AT指令时注意回车符处理
3. 软件实现关键点
3.1 水位数据处理算法
原始传感器数据需经过三重滤波:
c复制#define SAMPLE_SIZE 10
float get_filtered_distance() {
static float buffer[SAMPLE_SIZE];
float sum = 0;
// 中值滤波
for(int i=0; i<SAMPLE_SIZE; i++){
buffer[i] = get_sonar_reading();
delay(50);
}
bubble_sort(buffer, SAMPLE_SIZE);
// 滑动平均
for(int i=2; i<SAMPLE_SIZE-2; i++){
sum += buffer[i];
}
return sum/(SAMPLE_SIZE-4);
}
3.2 低功耗设计技巧
为延长电池备份时间(目标72小时):
- 主循环中加入__WFI()指令
- 传感器采样间隔动态调整:
- 正常状态:每5分钟采样
- 预警状态:每30秒采样
- 关闭未用外设时钟:
c复制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);
3.3 报警逻辑实现
采用状态机设计模式:
c复制typedef enum {
STATE_NORMAL,
STATE_WARNING, // 水位超过阈值1
STATE_ALARM, // 水位超过阈值2
STATE_CRITICAL // 水位持续上升
} SystemState;
void handle_alarm(SystemState state) {
static uint32_t last_sms_time = 0;
switch(state) {
case STATE_WARNING:
buzzer_beep(3);
break;
case STATE_ALARM:
buzzer_continuous();
if(HAL_GetTick() - last_sms_time > 3600000) { // 1小时限频
send_sms("水位警报!当前水位:XXcm");
last_sms_time = HAL_GetTick();
}
break;
case STATE_CRITICAL:
activate_backup_pump();
send_sms("紧急!自动排水已启动");
break;
}
}
4. 安装部署经验
4.1 传感器布置要点
根据三个项目现场经验,总结出最佳部署方案:
-
超声波传感器:
- 距地面50-80cm垂直安装
- 避开通风管道正下方
- 探头与水面角度保持90±5°
-
光电传感器:
- 在地漏周围呈三角形布置
- 用704硅胶做防水密封
- 线缆走线要有滴水弯
4.2 防干扰措施
地下室环境特殊,需特别注意:
- 所有信号线使用双绞线
- 电源入口加装磁环滤波器
- 单片机外壳接地
- 通讯线缆远离水泵电机
曾遇到变频水泵导致误报警,最终通过以下措施解决:
- 给传感器供电添加LC滤波
- 软件增加突变值过滤
- 水泵电缆套金属软管
5. 系统优化方向
5.1 功耗进一步降低
实测发现GSM模块是耗电大户,改进方案:
- 改用NB-IoT模块(BC95)
- 报警改用LoRa无线传输
- 增加太阳能充电系统
5.2 智能诊断功能
正在开发的新特性:
- 根据水位变化速率预测风险
- 传感器故障自检
- 电池寿命预估
5.3 云平台集成
通过MQTT协议对接Home Assistant:
python复制# 示例代码
def publish_data():
client = mqtt.Client()
client.connect("broker.hivemq.com", 1883)
client.publish("basement/water_level", get_water_level())
实际部署时发现,地下室信号差的问题可以通过中继器解决。我在配电箱内安装了一个防水型WiFi中继,传输稳定性从60%提升到98%。