水槽の水位を測って、ポンプを動かしたい。
マイコンで測るには電極を水に挿して抵抗値を測れば簡単に値が取れる。しかしながらちょっと動かすだけならいいけど長期で動かすと電蝕の問題が発生する。
これと同様の問題は土壌センサでもあって、簡単な電極は何ヶ月も経つと腐食する。
と、秋月電子でこういったものがあるのに気がついた。
静電容量式だと腐食の問題は発生しない。では、同じ原理で水位も測れないかな?
ESP32で、簡単なタッチセンサ機能がある。
以下のスケッチで試してみた。
void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.println(touchRead(T0));
delay(500);
}
環境
- 2023/01/27 00:00-01:00
- 湿度 40〜44%
- 気温 17℃
- Arduino 開発環境 1.8.19
- esp32 by Espressif Systems Version 2.0.4
- WROOM32 (WEMOS LOLIN 32)
実験
今回は、簡単にピン4にジャンパーケーブルをつなげた。導体を水に濡らさないように、ループの部分を水に浸すように考えてみる。
U字型に折った状態で、先端から何センチ水に浸したときの値の変化
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
81 | 71 | 67 | 64 | 62 | 60 | 59 | 58 | 57 | 56 |
割と取れてますね。
値のゆらぎ
静電容量式は、環境によって値がどんどん変わっていきます。なので絶対値で取るのはダメで、変化量で判定する必要があります。
しかしながら、今回は水にずっとじゃぼ漬けして使いたいのでドリフトなどをいかにするとキャンセルできるかな?
まず、静電容量ですがGPIO4の値を測っています。何に対しての値かな?
基準レベルを設定するのが良くないかな、ということで水面をGNDに導通させておくのがいいでしょうか?
しかしながら今回は水面GNDではなく、GPIO4とGNDの並行線でプローブを作ってみることにしました。
水深よりは、水面に接触しているかどうかをより知りたいので、先端を単なるU字型ではなく♡型にしてみました。これをGPIO4とGNDに差し込みます。
この状態での測定値は55。
水に思いっきり浸けた状態では35になりました。
先端をちょとだけ水に浸けた値は44。
水滴を拭いて、水に浸けた深さ(cm)と値を測定しました。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
51 | 45 | 43 | 40 | 39 | 38 | 36 | 35 |
暫定まとめ
- シングルラインプローブ、GNDとペアにしたプローブ、両方で水位を検出できる。
- GNDとペアにしたプローブが安定性が増すかどうかはこれだけの実験では不明
- ♡型が効果があるかどうかもこれだけの実験では不明
- 水面から1cm沈めた状態で10%程度値が下がる
- 更に5cm沈めた状態で15〜20%程度値が下がる
- 深さを増すに従い値の変化は小さくなる
これを元に水位を検出するのはまだアレで、少なくとも安定性を調べないといけません。
この状態で、しばらく測定を続けていきます。