スマート水漏れ検知・自動遮断バルブ制御システム(Arduino+MQTT対応)
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| アルミニウム製エンクロージャ | 1 | コントローラ本体用 |
| Arduino UNO | 1 | メイン制御ボード |
| Arduino Ethernet Shield 2 | 1 | ネットワーク通信用 |
| 電源ユニット(AC/DC 12V/5V 出力) | 1 | バルブ駆動用12V、Arduino用5V |
| ACハウジング | 1 | 電源ユニット収納用 |
| LEDキット(抵抗付き) | 1 | ステータス表示用(赤・黄・青) |
| リレー(デュアル5V×1、デュアル12V×1) | 各1 | バルブモータ駆動・リミットスイッチ読取用 |
| モータ駆動式ボールバルブ | 1 | メイン水道管遮断用(12V DCモータ内蔵) |
| JSTコネクタセット | 1 | 配線接続用 |
| 水漏れセンサ | 1 | 検知エリアに複数並列接続可能 |
プロジェクト概要
友人が外出中に配管破損で地下室の家財を全損した経験から、水漏れ対策の重要性を痛感し、このシステムを開発しました。従来のRaspberry Piベースのシステム(Microsoft IoTコンテスト出品作)とは異なり、Arduinoのようなシンプルなデバイスに単機能を委譲するアーキテクチャを採用しています。各デバイスは自律的に動作し、ネットワーク経由で上位システム(ホームオートメーション等)と連携します。ネットワーク障害時もローカル制御は継続されます。
システムの主な機能
- 複数の水漏れセンサ(並列接続)による漏水検知
- 検知時にモータ駆動バルブを自動閉鎖し、メイン水道を遮断
- MQTTブローカーへステータス/障害情報を定期送信
- 他デバイスからの障害通知を購読し、連動遮断も可能
- フロントパネルの3色LEDで状態を即座に視認
- リセットボタンでセルフテスト/再起動が可能
ハードウェア構成と設置例
メイン水道管へのバルブ設置
市水道の減圧弁(写真下部)の直後に、手動バイパスバルブと並列でモータ駆動バルブ(青色)を設置します。通常時は手動バルブを閉じ、モータバルブを開状態にします。停電時は手動バルブを開くことで給水を確保できます。
バルブ内部は12V DCモータで、極性反転により開閉します。リミットスイッチ(全開/全閉)で位置フィードバックを取得します。
コントローラユニット(フロントパネル)
左から:ACプラグ、リセットボタン、ステータスLED×3、センサ/モータ用コネクタ、Ethernetポート、USBポート。
LED表示定義
- LED1(赤):点灯=ローカルで水検知、点滅=リモート(他デバイス)で水検知、消灯=正常
- LED2(黄):点灯=バルブ制御不能、点滅=MQTTブローカー接続不能、消灯=正常
- LED3(青):点灯=正常監視中、点滅=バルブ閉鎖済み、消灯=システム停止/無電源
水漏れセンサ設置例
配管継手周り、給湯器下、洗濯機周辺など、漏水リスクが高い箇所に配置します。複数センサは並列接続され、いずれかが検知するとアラームとなります。
内部配線
エンクロージャ内部にArduino+Ethernet Shield、リレー基板、電源ユニット、端子台を収納。配線はJSTコネクタでモジュール化し、保守性を確保しています。
重要な安全上の注意(必読)
使用しているAC/DC電源は二重出力(12Vと正確に5V)です。 Arduinoの5Vピンに直接給電しているため、AC/DC接続後はArduinoのDCジャックやUSBケーブルを絶対に接続しないでください。 デバッグでUSBを使う場合は、電源線を切った専用ケーブル(データ線のみ)を用意してください。また、ACハウジング〜電源ユニット間は100V商用電源です。感電防止のため、通電中の作業・接触は厳禁です。
ソフトウェア(Arduinoスケッチ)
主なライブラリ:PubSubClient(MQTT)、Ethernet、Timer、avr/wdt.h(ウォッチドッグタイマ)
コードのポイント
- 3サブシステム:メインボックス(Arduino+Ethernet)、水漏れ検知(ローカル/リモート)、モータバルブ制御
- デバウンス処理:センサ/リミットスイチャタリング対策(
getDebouncedValue()) - バルブ制御シーケンス:リミットスイッチの信頼性対策として、開閉動作前に逆側のリミットへ軽く当ててから本動作へ移行
- MQTT通信:
- クライアントID:GLX_BASEMENT_001
- ステータストピック:GLX/BASEMENT/001/Status(JSONでリセット有無、水検知、バルブ状態、バルブ接続可否を送信)
- 障害トピック:GLX/BASEMENT/001/Fault(水検知時送信)
- 他デバイスの障害購読:GLX/+/+/Fault(ワイルドカード) - ウォッチドッグタイマ:リセットボタン押下時に1秒WDTを有効化し、強制リブート
- メインループ:500ms周期でセンサ読取、バルブ制御、MQTT送信、LED更新を実行
// 主な定数・ピン割り当て抜粋
const int WaterDetectorPin = 2; // 水漏れセンサ(検知でLOW)
const int ToggleButtonPin = 3; // リセットボタン(押下でLOW)
const int ValveClosedPin = 5; // 全閉リミット(到達でLOW)
const int ValveOpenedPin = 6; // 全開リミット(到達でLOW)
const int ValveControl1 = 8; // リレー1(バルブモータ極性制御)
const int ValveControl2 = 7; // リレー2(バルブモータ極性制御)
const int SystemLedPin = A0; // 青LED
const int FaultLedPin = A1; // 黄LED
const int AlarmLedPin = A2; // 赤LED
const int mainLoopDelay = 500; // メインループ周期(ms)
const int mqttInterval = 20; // MQTT送信間隔(ループ回数)
const int valveTimeOut = 15; // バルブ開閉タイムアウト(秒)
完全なスケッチは元記事のコード欄を参照してください。setup()でネットワーク初期化→バルブ全開→MQTT購読開始、loop()でセンサ監視→異常時バルブ閉鎖→定期MQTT送信→LED更新を行います。
回路図

回路図には、Arduino、Ethernet Shield、リレー駆動回路、バルブモータ接続、リミットスイッチ読取回路、水漏れセンサ並列接続、LED表示回路、電源回路(AC/DC 12V/5V出力)が詳細に記載されています。
まとめ
このシステムは「シンプルなデバイスに単機能を委譲し、ネットワークで協調させる」というIoT設計思想の好例です。Arduino UNOという低コスト・高信頼性のプラットフォームで、水漏れ検知から自動遮断、上位システム連携までを実現しています。リミットスイッチの不安定性への対策(事前当て動作)、デバウンス処理、ウォッチドッグによる自動復帰など、実運用を見据えた堅牢な設計が随所に施されています。住宅の地下室、機械室、サーバールームなど、無人環境での水害対策に最適なソリューションです。
製造プロセス
- Raspberry Piでセンサーとアクチュエータを制御:加速度計、サーボ、データストリーミング
- 自動プール給水・監視システム
- Arduino Portenta H7デュアルコアシステムをSegger J-Linkでデバッグする
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- Arduino UNOで作るLCDアニメーション&ゲーム入門
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- Arduino電源制御センター:N-FET/P-FET/リレー/RTC搭載キット
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- FirmataとXbox OneコントローラーでArduinoローバーをシームレス操作
- 研磨性石灰スラリーシステムではピンチバルブとペリスタルティックポンプがゴールドスタンダード