Wio BG770A + Grove水センサーで水漏れを検知する

水漏れを検知して通知を行うソリューションを開発しています。 Wio BG770Aに水センサーを付け、乾電池で屋外駆動することを考えているので、まずはGroveの水センサーの実験をしてみました。

この記事でわかること

  • Wio BG770Aでアナログ値を出力するセンサー情報の読み取り方
  • Grove 水センサーの特性

使用機材・環境

機材詳細
IoTデバイスWio BG770A(Seeed Studio)
センサーGrove - Water Sensor

使用したコード

今回使用したコードは、Githubに置いてあります。

wio-bg770a-water-sensor-polling — iotbuilds-samples

Wio BG770A 水センサー スケッチ(PlatformIO)

github.com

Grove水センサーの仕組み

Grove水センサーは、基板上に細い導電トレースが並んでいます。 導電性のある物体がトレース間に触れると抵抗値が下がり、SIGピンの電圧が変化する仕組みです。

つまり、このセンサーが実際に測っているのは「水」ではなく導電率です。 水道水はもちろん、指で触れてもWET判定になります。皮膚表面の汗に塩分が含まれていて導電体として機能するためです。 「Grove Water Sensor」という名前ですが、水専用ではなく導電性のあるものなら何でも反応します。

Grove水センサー
Grove水センサー

Grove Analog(P1)コネクタのピンアサイン

Wio BG770Aの左上のGroveコネクタ「Analog(P1)」は、アナログの値を読むことができます。 A4が水センサーのSIGの位置に割り当てられているので、このピンの値を読み取ります。

Wio BG770Aのピン番号 [Seeed Wikiより引用](https://seeedjp.github.io/Wiki/Wio_BG770A/hardware)
Wio BG770Aのピン番号 [Seeed Wikiより引用](https://seeedjp.github.io/Wiki/Wio_BG770A/hardware)
constexpr uint8_t kAnalogSensorPin = A4;  // Grove - Analog (P1)
Wio BG770AにGrove水センサーを接続した様子
Wio BG770AにGrove水センサーを接続した様子

アナログ値の読み方

analogRead()は10bitのADCで、0〜1023の値を返します。

水センサーの場合、乾燥時は抵抗が高く SIG 電圧が高い(値が大きい)状態です。 水が触れると抵抗が下がり SIG 電圧が下がる(値が小さくなる)ため、値が小さいほど濡れていると判断します。

void loop() {
  const int analogValue = analogRead(kAnalogSensorPin);
}

実験結果

実際にセンサーに水をこぼしてどの程度値が変化するかを見てみました。 濡れている(WET)と乾燥(DRY)の閾値は700にしています。

乾燥時

乾燥時は900程度で推移していました。

analog=907 threshold=700 state=DRY
analog=907 threshold=700 state=DRY
analog=906 threshold=700 state=DRY

水道水

水を垂らすと、170程度まで値が小さくなりました。

analog=171 threshold=700 state=WET
analog=171 threshold=700 state=WET
analog=176 threshold=700 state=WET
水センサーに水を垂らした
水センサーに水を垂らした

ちなみに、水道水だけでなく浄水器を通した水も試しましたが、特に結果に変化はありませんでした。 水道水にはカルシウム・マグネシウム・塩素などのイオンが溶けていて導電率が上がるので、電圧が下がると予想しましたが、大きな影響はないようでした。

おまけ: 指でセンサーに触れると?

実はこのセンサーは、抵抗値の変化で値が変わるので、指で触れても水濡れしている判定になります。 皮膚表面の汗(塩分)が導電体として機能するためと想定されます。

analog=160 digital=0 threshold=700 state=WET
analog=147 digital=0 threshold=700 state=WET
analog=149 digital=0 threshold=700 state=WET
指でセンサーに触れると?
指でセンサーに触れると?

loop()でポーリングするのは非効率

このコードは1秒ごとに analogRead() を呼んでいます。 1秒間隔であれば即応性は十分ですが、ループで常時読み続けるためCPUが起き続けます。 省電力を重視するなら、デジタル出力のHigh/Low変化を割り込みで受け取るアプローチの方が向いています。 検知した時だけCPUが動くため、電池駆動での運用に有利です。 その実装は別記事で紹介します。

まとめ

Grove水センサーをWio BG770AのAnalog(P1)コネクタに接続し、アナログ値が読めることを確認しました。

アナログ値は0〜1023の10bit精度で濡れ具合の変化を追えるため、しきい値を現場の実測で調整しやすいのが実用上のメリットです。 使い方は簡単なので、水漏れ検知の第一歩として、30分あればセンサー値を読み取るところまで行くことができました。

水(液体)だけでなく、人間の指など電気を通すものが触れると反応してしまうので、他の物が触れにくい場所に設置するのが良いでしょう。

関連記事