Raspberry Pi とリード線だけで漏水センサーを作る


#はじめに
この度の水害で被害にあわれました皆様に心からお見舞い申し上げます

報道されているような大きな被害だけではなく、普段は水がでないような所から急に水がでて大変だったというような小さなものまで含めますと本当に多くの方が難儀をされたのではないかと存じます

**大きな災害の減災のためなら数十万もするセンサを設置して監視する**ことも可能でしょうが、 **普通の人が普通の生活のなかでちょっと気になる場所に水がでていないかを監視するのにはあまり現実的でない**かもしれません

私も擁壁の水抜き孔からドバドバと水が出て大変な目に合われた方のお話を伺って、 **とにかく安く漏水センサーを作れないか** との思いにかられ、[こちらの記事](https://www.raspberrypi.org/forums/viewtopic.php?t=68762&p=508026)などを参考にさせていただき掲題の件、試作してみたところ、良い結果を得る事が出来ました
詳細とは言いがたい記載で大変恐縮なのではございますが、後で自分で使う目的でこちらに置かせていただいた次第でございますので、間違っている所などございましたら御忌憚なく御指摘いただければ大変ありがたいです

#ハードウェア構成
と言う程大げさなものでもないのですが、ダブルコードの先っちょの被覆をちょびっと剝いただけです

![スクリーンショット 2016-09-16 11.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/46544/a948a330-2565-a493-5c5e-bb9cb096ebf3.png "スクリーンショット 2016-09-16 11.02.05.png")

これを GPIO につなぐだけです
![スクリーンショット 2016-09-16 12.04.59.png](https://qiita-image-store.s3.amazonaws.com/0/46544/0470a998-e691-04da-b795-6af7b5adf45a.png "スクリーンショット 2016-09-16 12.04.59.png")

この構成で [***水を検知して SMS で通知するデモ***](https://youtu.be/ndpCrXC4NXk)のビデオをこちらにご用意いたしました


#論理構成
これを RPi の 3.3v pin とか、Output mode で On な pin (例えば GPIO 27 下図の GPIO 27番とか) と、Input mode で off な pin につないで on になる事を監視します

![スクリーンショット 2016-09-01 15.26.52.png](https://qiita-image-store.s3.amazonaws.com/0/46544/0f8d0af4-391d-6b8b-6c43-ee76eddbe617.png "スクリーンショット 2016-09-01 15.26.52.png")

**要は水をスイッチ代わりに使っている** だけです。 **これはシンプル!**

gpio が on になったら ***ブザーを鳴らす***なり、 ***curl で server に POST する*** なり、受け取ったサーバーで Twillio をつかって **携帯に音声電話や SMS で通知する**なりすると **安価だけど立派な漏水監視システム** になります

[monitor](https://github.com/UedaTakeyuki/monitor)でも POST 受け取って表示するようにしてみたら良い感じになりました

![スクリーンショット 2016-09-16 15.08.38.png](https://qiita-image-store.s3.amazonaws.com/0/46544/a86abfe6-1449-f190-314e-a385e099cd1f.png "スクリーンショット 2016-09-16 15.08.38.png")


なんで **こんなのでうまくいってしまう**のか(Internal Validity ですね、ここでまちがってたらどうしょうもないです)、 **どこまで**（水質が違ったり、ケーブルをのばしたり） **うまくいくものなのか**（External Validity です。提案手法の提要範囲を考えるのに必須ですね）については後ほど述べさせて頂きます

#ソフトウェア
ハードといっしょでこちらもそんな大げさなものでもなく、水の検出は ***GPIO の on/off の変化をポーリングするなりイベントを待ったり*** するだけです

GPIO デバイスを[こちら](http://qiita.com/UedaTakeyuki/items/dd4365cefdb7293f79f6)のように shell から直接ポーリングしてもいいですし

```bash:GPIOデバイスファイルを直接読む例
gpio=20    #GPIO.28 => BCM2835 の20番、対応表は gpio readall
dulation=1 #ポーリング間隔（秒）

# gpio がまだ初期化されていなければ初期化
if [ ! -d /sys/class/gpio/gpio${gpio} ]
then
    echo $gpio > /sys/class/gpio/export
fi
value=/sys/class/gpio/gpio${gpio}/value #gpio の値
while :
do
  current_value=`cat $value`
  if [ $current_value -eq 1 ]
  then
    echo "WATER!!!"
  fi
  sleep ${dulation}s
done
```


最近の jessie だと最初から [Wiring Pi](http://wiringpi.com)がはいっているみたいなので、gpio wfi で例えば GPIO 28 を監視するのであれば以下のように

```bash:water_leak_detecte.sh
gpio wfi 28 falling
echo "WATER!!!"
```

を実行すると水を検出するまで gpio wfi コマンドが wait し、水がきたら "WATER!!!"を表示して終了します

Python からだと例えば RPI.GPIO を使って[こちら](https://github.com/UedaTakeyuki/slider/blob/master/water_leak_detecte.py)のようにもできます

```python:water_leak_detect.py
import RPi.GPIO as GPIO
# GPIO の設定
GPIO.setmode(GPIO.BOARD) # ボードのピン番号で GPIO28 => pin 38

GPIO.setup(36, GPIO.OUT)
GPIO.setup(38, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.output(36, GPIO.HIGH)

while True:
  if GPIO.input(38):
    print "WATER!!!"
```

# threat of validity
## internal validity, なぜこれでうまく機能するのか
水が微妙に電気伝導性を持つ為にスイッチとして機能しています。微妙に、というのが工学的でない微妙な表現なのですが、例えば水道水の電気伝導率を測ってみると 123μS/cm でした
![スクリーンショット 2016-09-16 12.37.39.png](https://qiita-image-store.s3.amazonaws.com/0/46544/b1c5a80a-737f-5d78-522b-22406afaba57.png "スクリーンショット 2016-09-16 12.37.39.png")
だいたい 10の-4乗S/cm ということはこの水道水の抵抗率は 10KΩ・cm ぐらい、電極間が 1mm ほどだとすると結局、電極間は ***1KΩ*** 程度の抵抗で繋いでいるのと等価です

Raspberry Pi 内部の pull up/down の抵抗は I2C 以外は 50KΩ なので、GPIOにかかる電圧は 
　　
　　3.3V * 50/(50 +1) = 3.24 V

と TTL のしきい値の 2.0V より全然余裕で ***High*** となります

![スクリーンショット 2016-09-17 10.09.37.png](https://qiita-image-store.s3.amazonaws.com/0/46544/f13b700b-3aea-496d-f3dc-1caf4aad9e2c.png "スクリーンショット 2016-09-17 10.09.37.png")


## external validity, どこまでこれがうまく機能するのか

### きたない水でも機能するの？
むしろきたない水のほうが余裕です
水道水みたいなキレイな水でもこの程度の低い抵抗なのですが、雨水だったり泥水だったり塩水だったり、水はなにかを含めば含むほど ***抵抗率が下がり***ます。水耕栽培に使う培養液とか ***水道水より20倍ほど電気伝導率が高い混合液*** をあげているのですが、そういう水だとさらに ***電気抵抗は低く***、GPIO にかかる電圧は

　　3.3V * 50/(50 +0.05) = 3.29 V

と、ますます余裕で OK です

全く関係ないですけど、 ***怪しい水の汚染を簡単に見たければ pH よりも電気伝導度のほうが一発ですよ都議の皆様***
水耕栽培を趣味にしてる人が使ってるような3000円しないぐらいの[***ECメーター***](https://www.amazon.co.jp/gp/product/B00243UVOQ/ref=oh_aui_detailpage_o06_s00?ie=UTF8&psc=1)で水の汚染は簡易にチェックできます

### 逆に、凄くキレイな水だと？
苦しくなってきます
[純水の電気伝導率の理論値](https://ja.wikipedia.org/wiki/超純水)は0.05482μS/cm と水道水の測定値より3桁以上低いです。これが水の電気伝導率の理論最小値

つまり、電気抵抗も3桁以上も大きくなって、GPIOの pull-down抵抗より大きいので、これぐらい水がキレイだと電極間の距離をμmの単位にしないとこのままでは機能しなと思います

工業用の純水とかだと用途によって程度に差があると思いますが、水道水より一桁以上抵抗が上がると Raspbery Pi の内部 pull down 抵抗とコンパラブルになってくるので、1mm 程度の間隔のダブルケーブルの先っちょを剥いただけではだんだん苦しくなってくると思います

### 炎も伝導体だけど、水だけじゃなくて炎も検出できる？
水害と火災の両方を検知できてしまうしかも安いセンサーって凄いですよね
炎の正体はプラズマ化したガスなので、金属同様に自由電子がある（という理屈でよかったと思うんですけど、噓ついてましたら御指摘いただければ大変ありがたいです）のですが、残念なことに ***[抵抗が数十MΩ・cmもある](http://ameblo.jp/loop12/entry-10264908070.html)***ので、Raspberry Pi の 50KΩ の内部 pull-down 抵抗より大きすぎ、このままでスイッチとして機能させるのは無理で、もう一工夫がいるような気がします

### リード線の長さはどのくらいまで大丈夫？
[銅線の抵抗](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1151004491)は 1mm径の銅線 1Km で17Ω程度と水なんかと比較して全然小さいです。60キロの距離でも 1kΩでしかないので、片道30キロも全然平気だとおもいます。 ***避難区域外から炉心の注水状態を監視*** したり、 ***知事室から豊洲市場の地下の浸水を監視*** したりするのも、こんな簡単な仕組みだけで原理的にはできそうです。ただし、ケーブルが多分 ***メートルあたり100円*** ぐらいするのでコストが合わない気はします

# 結び
はじめに、でも述べました通り[こちらの記事](https://www.raspberrypi.org/forums/viewtopic.php?t=68762&p=508026)を読んで、「こんな簡単な仕組みで水って検知できるんだ、だったらそもそもクリップとかいらない（ないほうが電極間の距離が近い）し、抵抗も(RPiの内部プルダウンがあるんだから)いらないんじゃないの？？？」と思い、簡単なので試してみようと思った事がこのご報告のきっかけです

この備忘録がもしどなたかのご参考になることがございましたら望外の喜びでございます