川の健康を見守る:Arduinoベース水質監視システム「MyRiver」
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino MKR1000 (MKR FOX 1200) | 1 |
| 水位センサー | 1 |
| pHセンサー | 1 |
| 白色LED (可能なら) | 1 |
| 220Ω 抵抗 | 2 |
| フォトレジスター (光センサー) | 1 |
| ジャンパーワイヤー | 1セット |
必要な工具
- ハンダゴテ
- ノコギリ (ハックソー)
使用するアプリとサービス
- Arduino Web Editor
- Sigfox (LPWA通信)
- Wia (IoTプラットフォーム、データ可視化・通知)
プロジェクト概要
概要
川や湖は憩いの場ですが、汚染や氾濫が起きれば台無しです。家畜の飲み水として川の水を使う人々にとって、水質悪化は死活問題。夜中に洪水で家が浸水したり、隣人がガソリンを川に捨てたりすれば、取り返しがつきません。
MyRiver はこれらを解決します。Sigfox通信で圏外エリアでも動作し、pH・水位・不溶性汚染物質(油・水銀等)を独自手法で検知。データはWia経由でスマホ/PCからリアルタイム監視可能。異常時は即座に通知が届くため、手遅れになる前に対処できます。
機能詳細
Arduino MKR FOX (SAM D21ベース) を採用。低消費電力モードで単3電池2本で長期駆動可能。30分ごとにセンサー読み取り→スリープ (最短20分)。
- pHセンサー で水素イオン濃度を測定
- 水位センサー で水位を監視
- LED + フォトレジスター で不溶性汚染を検知:LED光を水中で照射し、フォトレジスターの受光量が低下すれば油膜や懸濁物が存在すると判断 (独自手法)
データは12バイトのHEXバッファにパックしてSigfox送信→Wiaでデコード・処理・可視化・通知。
データフォーマット (12バイト = 3センサー × 4バイト)
各センサーの生値 (0-1023) を4桁ゼロ埋め文字列に変換し連結。例:水位=24 → "0024", pH=620 → "0620", 汚染=1023 → "1023" → 結合 "002406201023" をHEX送信。
コードの主要3関数
// 1. センサー読み取り
struct GetValue {
int riverLevel() { return analogRead(A2); }
int riverPh() { return (analogRead(A1) / 5 * 3.3); } // 電圧変換
int riverPol() { return analogRead(A3); } // フォトレジスター
};
// 2. バッファフォーマット (12バイト文字列生成)
String data(int level, int ph, int pol) {
int values[3] = {level, ph, pol};
String newValues;
for(int i=0; i<3; i++) {
if(values[i] < 10) newValues += "000";
else if(values[i] < 100) newValues += "00";
else if(values[i] < 1000) newValues += "0";
newValues += String(values[i]);
}
return newValues; // 例: "002406201023"
}
// 3. Sigfox送信
void parseData(String data) {
SigFox.beginPacket();
SigFox.print(data);
SigFox.endPacket();
}
Wia + Sigfox 連携セットアップ
- SigfoxアカウントとWiaアカウントを作成、Wiaアプリをインストール
- Sigfoxコールバック設定: Type=Data Uplink, Channel=URL, URL="https://api.wia.io/v1/events", Method=POST, Header "Authorization: Bearer [Wiaデバイストークン]", Content-Type=application/json, Bodyに所定JSONを設定
- WiaフローでHEX→文字列→数値変換、閾値判定、メール通知を構築 (詳細手順は画像参照)
閾値設定 (ユーザー調整必要)
- pH: 6.5〜8.5 (標準)、生値300〜600付近で校正
- 水位: 200以上で "HIGH" (氾濫警戒)
- 汚染 (フォトレジスター): 現地で清水時の値を測定し閾値決定 (例: 200未満で "POLLUTED")
フォトレジスター閾値決定用スケッチ例:
void setup() { pinMode(1, OUTPUT); Serial.begin(9600); while(!Serial); digitalWrite(1, HIGH); }
void loop() { Serial.println(analogRead(A3)); delay(5000); }
デバイス実装・設置
ペットボトルを防水ケースとして再利用 (エコで低コスト)。キャップにセンサー露出穴を開け、内部に基板・電池を収納。テープで防水処理。
設置は満潮時に行い、水位センサー下端が水面に、フォトレジスターが完全に水没する位置で固定。汚れた川でテストしたところ全アラートが正常動作。
背景と意義
「美しい川が緑色のドロドロになり、夜中に家へ押し寄せる」そんな事態を防ぎたい。都市部でも農村でも、MyRiverは川の異常をいち早く知らせ、命と暮らしを守ります。pHだけでは検知できない不溶性汚染 (重金属・油等) を「光透過率低下」で捉える独自手法が核心です。
製造プロセス
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- エモーションセンサー&EEG:リアルタイム感情検知のための低コストハードウェア
- アナログセンサー搭載・高精度圧力&気流測定デバイス
- DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
- UnifiedWater v1 - 完全なArduino水質センサーキット
- 3D RGB アルドゥクロック:Bluetooth対応LED時計(RTC内蔵)
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- Arduinoとジョイスティックでインタラクティブゲーム – LEDフィードバック付き
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoで作る自律走行ミニローバー
- 酸素(O2)センサーを理解する:役割、配置、故障の兆候