「静電容量型土壌水分センサ」を「水位センサ」として利用する

畑の端に小さな水田エリアをつくり、自然農で稲作をやってみようと計画しています。
子供の教育教材で、バケツで稲を育てる「バケツ稲」というものがありますが、それを少し大きくしたイメージです。

実は去年も同じことを実施し、3〜4kg程度のコメを収穫することができました。
今年は、去年よりも更に水田エリアを拡大し、もう少し沢山のコメを収穫できればと考えています。

さて、このエリア(以降は「ミニたんぼ」と呼びます)には、沢の水をホースで引き込んでいるのですが、水の勢いが弱く、水量は十分ではありません。
去年も水についてはずっと心配していたのですが、今年は今のところ、沢の水も去年より勢いがなく、ミニたんぼのエリアを広げたこともあり、水不足が本当に心配です。

もしも本当に水が足りなくなったら、となりにある川から電動ポンプで水を汲み上げるつもりですが、常時ポンプを動かしておくわけにもいかないので、まずはミニたんぼの水位を常に把握できるようにしておきたいと思っています。

そんな訳で、ミニたんぼに「水位センサ」を設置してみることにしました。
一定時間毎に、水位データをWebサーバに送信し、どこからでもミニたんぼの水位を確認できるようにしたいと思います。

たんぼで使われる水位センサについて少しだけ調べたところ、超音波センサやフロートスイッチを活用したものが多いようです。
ただ、機構的な部分の工作や防水処理などが少々面倒くさそうで、ちょっと試してみるにはしきいが高い感じです。
水につけておくだけで良い、静電容量型の水位センサも見つけました。このようなタイプが非常に手軽でうってつけなのですが、現在は売り切れで次回入荷も未定とのことです。

何か良い方法はないかと色々考えていたところ、「静電容量型の土壌水分センサ」と「静電容量型の水位センサ」は、基本的な仕組みは同じではないかと思いつきました。
静電容量型土壌水分センサであれば、以前購入したこちらの製品が余っています。


以前実施した実験(こちら)で、基板部分の防水処理も行ったので、このままミニたんぼに使い回すことができそうです。

まずは本当に、このセンサで水位を観測することができるか試してみました。

IoTデバイスには「Timer Camera」を使います。
Timer Cameraの内蔵バッテリーを、LiPo電池からNi-MH電池に交換することで、電池のみでの長期稼働が実現できそうな見込みが得られた(記事は こちら)ので、その確認も兼ねて、ミニたんぼに設置して長期稼働実験をしてみようと目論んでいます。

土壌水分センサの3つの端子「GND」「VCC」「AOUT」を、それぞれTimer Camera(GROVEポート)の「G」「G4」「G13」につなぎます。

スケッチはこちらです。
センサの電源を「HIGH」にし、100ms毎にセンサの出力値をシリアルモニタにプリントします。

#define SENSOR_VDD 4
#define SENSOR_OUT 13

void setup() {
  Serial.begin(115200);

  pinMode(SENSOR_VDD, OUTPUT);
  digitalWrite(SENSOR_VDD, HIGH);
  pinMode(SENSOR_OUT, INPUT);
}

void loop() {
  uint16_t moist = analogRead(SENSOR_OUT);
  Serial.println(moist);
  delay(100);
}

水を入れたコップにセンサを入れ、値を測定しました。
先端の三角の部分(写真の矢印の箇所まで)は、水につけても値は変化しませんでしたが、その先は、たくさんつけるほど値が小さくなりました。

矢印の箇所をゼロとしたときの、水位と測定値の関係は以下のとおりです。

水位(cm)測定値
02350
11650
21400
31270
41220
51160

このデータを踏まえて、測定値を水位(センチメートル)に変換する式をつくってみました。

水位(cm)= 1400 / (測定値 - 950) - 1

スケッチを以下のように変更しました。

#define SENSOR_VDD 4
#define SENSOR_OUT 13

void setup() {
  Serial.begin(115200);

  pinMode(SENSOR_VDD, OUTPUT);
  digitalWrite(SENSOR_VDD, HIGH);
  pinMode(SENSOR_OUT, INPUT);
}

void loop() {
  uint16_t moist = analogRead(SENSOR_OUT);
  float val = 1400.0/(moist-950.0)-1.0;
  Serial.println(val);
  delay(100);
}

センサを水につけた深さによって、それっぽい水位(単位はセンチメートル)がプリントされるようになりました。

これを踏まえて、一定時間毎に水位データをWebサーバに送信するようにしました。
スケッチはこちらです(一部省略しています)。今回使用しているアナログ入力端子(G13)は、Wi-Fi接続時には使えないので、先に水位データを測定してからWi-Fi接続するようにしています。

#include <WiFi.h>
#include "battery.h"
#include "bmm8563.h"

#define CAMERA_LED_GPIO 2
#define SENSOR_VDD 4
#define SENSOR_OUT 13

unsigned long interval  = 10; // 測定間隔(単位:分)
const char*   ssid      = "XXXXXXXX";
const char*   password  = "XXXXXXXX";

void sleepTimerCam() {
  WiFi.disconnect(true);
  digitalWrite(CAMERA_LED_GPIO, LOW);
  bat_disable_output();
  esp_sleep_enable_timer_wakeup(interval*60*1000*1000);
  esp_deep_sleep_start();
  delay(1000);
}

void setup() {
  Serial.begin(115200);
  pinMode(CAMERA_LED_GPIO, OUTPUT); // 内蔵LED
  digitalWrite(CAMERA_LED_GPIO, HIGH);
  pinMode(SENSOR_VDD, OUTPUT);
  digitalWrite(SENSOR_VDD, HIGH);
  pinMode(SENSOR_OUT, INPUT);
  // バッテリー・タイマー制御の初期化
  bat_init();
  bmm8563_init();
  bmm8563_setTimerIRQ(interval*60);

  // データ測定
  delay(500);
  uint16_t moist = analogRead(SENSOR_OUT);
  float val = 1400.0/(moist-950.0)-1.0;
  Serial.printf("%d %.2f\n", moist, val0);

  if(!connect_wifi()) sleepTimerCam(); // Wi-Fi接続
  if(!sendRequest(val)) sleepTimerCam(); // データ送信
  disconnect_wifi(); // Wi-Fi切断
  digitalWrite(CAMERA_LED_GPIO, LOW); // 内蔵LED消灯

  sleepTimerCam(); // スタンバイモードに移行
}

void loop() {}

これで、水位データをWebサーバに送信できることを確認しました。

このスケッチで、1回の処理(起動→データ採取→Wi-Fi接続→データ送信→スタンバイに移行)における消費電流値の推移を調べました。
消費電流値の測定にはM5Stackと「INA226PRC」を使いました(消費電流値の測定方法は こちら)。

結果は以下のとおりです。複数回測定し、波形を重ね合わせました。

1回の処理にかかる時間は4.5秒程度、その間の平均消費電流値は92mA程度となりました。また、スタンバイ中の消費電流値は、今回の方法では測定できないほど小さく、無視できます。
10分に1回の間隔で処理を行った場合、平均消費電流値は「92mA × 4.5sec / 600sec = 0.69mA」となります。
単三型Ni-MH電池4本(2000mAh)で稼働させると、「2000mAh / 0.69mA = 2899h = 120.8日」と、4ヶ月稼働できる計算になります。
うまくいけば、たんぼの水管理が必要なくなる時期(秋)まで、電池交換せずに稼働できるかもしれません。

早速、ミニたんぼに設置しました。

Timer CameraとNi-MH電池を入れた防水ケースを、イレクターパイプでミニたんぼの近くに設置します。

土壌水分センサは、園芸用支柱をミニたんぼに差し込み、そこに結束バンドで固定します。

設置してから2日たちましたが、これまでのところ、問題なくデータが測定できています。

このまましばらく様子をみようと思います。

2022年5月25日追記

今朝、ミニたんぼに設置した水位センサのデータを確認したところ、水位がゼロになっていました。
グラフを見ると、前日の20時頃に、急に水がなくなっています。

30分足らずの間に、急に水がなくなっていることから、モグラに穴を開けられたのではないかと考えました。

早速、確認に行きました。

ミニたんぼの水がなくなっています。

水位センサも剥き出しになっています。

ミニたんぼを確認したところ、モグラの穴が空いていました。
今も、入ってきた分の水が、そのまま流れ出ています。

とりあえず塞ぎました。
水位センサを設置して3日目にして、早速効果が得られました。

2022年8月30日追記

稼働させていたこのシステムが、とうとう停止しました。
稼働日数は「89.6日」と、ほぼ3ヶ月でした。机上計算で見積もっていた「120.8日」には、やや及びませんでした。

主な原因としては、このシステムからのデータ送信先である「Wi-Fi中継機」が、電力不足でちょくちょく停止していたことが挙げられます。

「Wi-Fi中継機」は、ソーラーパネルで発電した電力で常時稼働させているのですが、数日間くもりの日がつづくと停止してしまいます。
管理不十分で、パネルが雑草に覆われてしまい、あまり発電できなくなっていたこともありました。

「Wi-Fi中継機」が停止している時、このシステムは15秒間Wi-Fi接続を試みた後、スリープに移行します。
机上計算では、このシステムの処理時間を1回あたり4.5秒としていたのに対し、「Wi-Fi中継機」の停止中は1回の処理に15秒かかってしまうことになります。この状況が頻繁に生じたため、想定よりも早く停止してしまったと考えられます。

いずれにしろ、10分間隔でデータ採取するIoTシステムを、単三型Ni-MH電池4本だけで、3ヶ月にわたり連続稼働できることが確認できました。

さて、「ミニたんぼ」に水を入れている期間中(9月末頃まで)、電池交換なしでこのシステムを動かすことができるかと期待していたのですが、無理でした。
もう少しの間、水位を観測したいので、電池を交換して再稼働させることにしました。

今回のシステムで電池交換する際には、注意しなければいけないことがあります。
普通のマイコンは、電池をつなぐとそのまま起動するのですが、Timer Cameraは電池をつないだだけでは起動しません。
電池をつないだ後、電源ボタンを長押しして、ようやく起動します。

これについては、以前調べて理解していたはずなのですが、今回の電池交換の際にはそれをすっかり忘れてしまっており、電池を新しくしても動かないため、どこかが壊れたのかと、あれこれ調査する羽目になってしまいました。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。