智能水泄漏检测与电磁阀控制系统
核心组件清单
| 组件 | 数量 | 备注 |
|---|---|---|
| 铝合金外壳 | 1 | 主控箱体 |
| Arduino UNO | 1 | 主控微控制器 |
| Arduino Ethernet Shield 2 | 1 | 提供有线网络连接 |
| 电源模块 | 1 | 双路输出:12V驱动电磁阀,5V供电Arduino |
| AC接线盒 | 1 | 市电接入与隔离 |
| LED套件(含限流电阻) | 1 | 状态指示:红/黄/蓝三色 |
| 继电器模块 | 2 | 1路双路5V + 1路双路12V,控制电机正反转 |
| 电动球阀 | 1 | 12V直流电机驱动,带限位反馈 |
| JST连接器套装 | 1 | 模块化接线 |
| 水浸传感器 | 1 | 并联部署于多个高风险点 |
项目背景与设计理念
一次偶然交谈让我意识到水泄漏的破坏力:朋友因出差期间水管爆裂,地下室家具尽毁。本项目源自我参加的微软物联网竞赛作品,但采用Arduino而非树莓派实现。我的设计哲学是「职责下放」:将简单任务交给简单设备(如Arduino)自主执行,必要时通过网络协作提供高级服务。即使网络中断,本地核心功能(检测漏水、切断水源)仍可正常运行。
系统架构与安装示意
电动球阀内置12V直流电机,极性反转控制正反转。限位开关提供位置反馈:红线触地=全关,绿线触地=全开。上电后给左上接线端子施加正电压即可开阀。
控制器面板布局
- LED1(红):常亮=本地检测到漏水,闪烁=远程节点上报漏水,熄灭=无漏水
- LED2(黄):常亮=电磁阀控制故障,闪烁=MQTT Broker不可达,熄灭=正常
- LED3(蓝):常亮=系统正常监测中,闪烁=电磁阀已关闭,熄灭=系统断电或故障
传感器部署示例
内部接线实拍
⚠️ 关键安全警示
本项目使用双路输出电源模块:12V路驱动电磁阀,5V路直接给Arduino 5V引脚供电(而非Vin)。一旦AC/DC模块通电,严禁再插入Arduino DC电源插头或USB线!若需USB调试,请自制仅保留数据线(D+/D-)的专用线缆。AC接线盒至电源模块间为110V市电,严禁带电操作,严禁触碰!
核心代码逻辑(Arduino C++)
// 关键常量定义
#define MQTT_CLIENT_PREFIX "GLX"
#define MQTT_LOCATION "BASEMENT"
#define MQTT_UID "001"
const int VALVE_TIMEOUT = 15; // 电机运行超时(秒)
const int MAIN_LOOP_DELAY = 500; // 主循环周期(ms)
// 引脚映射
const int LED_SYS = A0; // 蓝灯
const int LED_FAULT = A1; // 黄灯
const int LED_ALARM = A2; // 红灯
const int WATER_SENSOR = 2; // 水浸传感器(低电平触发)
const int BTN_RESET = 3; // 复位按钮(上拉输入)
const int VALVE_CLOSED = 5; // 关阀限位(低电平触发)
const int VALVE_OPENED = 6; // 开阀限位(低电平触发)
const int RELAY_1 = 8; // 电机继电器1
const int RELAY_2 = 7; // 电机继电器2
// 状态变量
int waterLocal = 0, waterRemote = 0;
int valveState = -1; // -1未知, 0开, 1关
int valveConnected = -1, mqttConnected = -1;
volatile bool resetRequested = false;
// 防抖动读取
int readDebounced(int pin, int interval, int confirm) {
int val = digitalRead(pin), cnt = 1;
while (cnt <= confirm) {
delay(interval);
if (digitalRead(pin) == val) cnt++; else { cnt = 1; val = digitalRead(pin); }
}
return val;
}
// 继电器控制:0=断电, 1=关阀, 2=开阀
void setRelays(int mode) {
switch(mode) {
case 0: digitalWrite(RELAY_1, HIGH); digitalWrite(RELAY_2, HIGH); break;
case 1: digitalWrite(RELAY_1, HIGH); digitalWrite(RELAY_2, LOW); break; // 关阀极性
case 2: digitalWrite(RELAY_1, LOW); digitalWrite(RELAY_2, HIGH); break; // 开阀极性
}
}
// 等待限位触发
bool waitLimit(int pin) {
for (int t = VALVE_TIMEOUT; t > 0; t--) {
if (readDebounced(pin, 10, 10) == LOW) return true;
delay(1000); Serial.print('.');
}
Serial.println(F(" 电机超时,请检查供电与接线"));
return false;
}
// 开阀流程:先撞击关限位复位,再正向开阀
int openValve() {
Serial.print(F("开阀中..."));
setRelays(1); if (!waitLimit(VALVE_CLOSED)) return -1;
setRelays(2); if (!waitLimit(VALVE_OPENED)) return -1;
valveConnected = 1; valveState = 0; setRelays(0);
Serial.println(F(" 阀门全开,开始监测")); return 0;
}
// 关阀流程:先撞击开限位复位,再反向关阀
int closeValve() {
Serial.print(F("关阀中..."));
setRelays(2); if (!waitLimit(VALVE_OPENED)) return -1;
setRelays(1); if (!waitLimit(VALVE_CLOSED)) return -1;
valveConnected = 1; valveState = 1; setRelays(0);
Serial.println(F(" 阀门已关闭,请排查漏水点并擦干传感器")); return 0;
}
// MQTT回调:解析远程节点上报的漏水消息
void mqttCallback(char* topic, byte* payload, unsigned int len) {
String msg = String((char*)payload).substring(0, len);
if (msg.indexOf("WaterDetected") >= 0 && msg.indexOf(MQTT_LOCATION) == -1)
waterRemote = 1; // 忽略自身上报,避免自触发
}
// 主循环:LED状态机、漏水判定、定时上报、看门狗复位
void loop() {
updateLEDs(); // 分两阶段更新LED,实现闪烁效果
if (resetRequested) { publishStatus(); wdt_enable(WDTO_1S); delay(5000); }
waterLocal = !readDebounced(WATER_SENSOR, 100, 10);
if (waterLocal || waterRemote) { if (valveState == 0) closeValve(); }
if (--mqttIntervalCnt <= 0) {
if (waterLocal) publishFault(); publishStatus(); mqttIntervalCnt = 20;
}
delay(MAIN_LOOP_DELAY/2); client.loop(); delay(MAIN_LOOP_DELAY/2);
}
原理图
制造工艺
- 树莓派传感器与执行器控制实战:加速度计、舵机与数据流
- 全自动泳池注水与监控系统:树莓派+低功耗Arduino传感器网络
- 用 Segger J-Link 调试 Arduino Portenta H7 双核系统
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- Arduino 电源控制中心:N-FET/P-FET/继电器/RTC 多功能扩展板
- Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- 石灰浆料系统:夹管阀与蠕动泵的“黄金搭档”