先日、畑の環境情報(気温、湿度、土中温度、土中水分量)を採取するためのIoTシステムをつくり(記事は こちら)、実際にデバイスを畑に設置して動作確認中(記事は こちら)ですが、このブログ記事をご覧になった方から、「土壌水分センサ」について、以下のようなコメントをいただきました。
- 本来は、「土中水分量」は、地表から10センチぐらいの深さのところを測定したいが、このタイプの土壌水分センサは、回路部分を地表に出して差し込む形になっているため、あまり深い場所の水分量を測定することができない。また、センサ自体の長さが数センチあるので、実際にどの深さの水分量を測定しているのかが明確でない。
- この問題を回避するために、土を掘って、そこに土壌水分センサを横向きに設置したい。その場合はセンサの回路部分も土に埋めてしまうことになるが、「UVレジン」をつかって回路部分を封止した今回のやり方で、防水面で問題がないか興味がある。
- また、土壌水分センサを横向きに設置する際に、基板を水平方向(面が上向き)に設置すると、面上に水分が残ると思われる。基板を水平方向(面が上向き)、垂直方向(面が横向き)に設置することで、測定結果に差が生じるかどうか興味がある。
これらについて、実際に試してみることにしました。
マイコンは、今回も「M5Stamp Pico」を使います。
土壌水分センサの個体差があることも考えられるので、水平方向が2個、垂直方向が2個の、計4個の土壌水分センサをM5Stamp Picoにつなぐことにします。
M5Stamp Picoに、4つのアナログ信号を入力する必要があるため、8chのADコンバータ「MCP3008」を使います。
接続は以下のようになります。
M5Stamp Picoのディープスリープ中は、センサにも電源供給したくないので、センサの電源端子はM5Stamp Picoの「25番ピン」につなぎます。M5Stamp Picoの動作中は、「25番ピン」を「HIGH」にすることでセンサに電源供給します。
15分間隔で4個の土壌水分センサの値を測定し、Wi-Fi経由でAmbientに送信します。
データ送信が完了するとディープスリープに移行します。
単三形ニッケル水素電池4本で動かしますが、以前行った調査によれば、このような使い方であれば、1ヶ月以上連続稼働できる見込みです(記事は こちら)。
スケッチは以下のとおりです。
#include <WiFi.h>
#include "Ambient.h"
#include <SPI.h>
#include "MCP3004.h"
#define sensorVdd 25
#define MCP3004_SS 19
MCP3004 mcp3004(MCP3004_SS);
WiFiClient client;
Ambient ambient;
const char* ssid = "XXXXXXXX";
const char* password = "XXXXXXXX";
unsigned int channelId = XXXXX;
const char* writeKey = "XXXXXXXX";
unsigned long interval = 900; // unit:sec
void setup() {
Serial.begin(115200);
delay(1000);
// WiFi Connect
Serial.printf("Connecting to %s\n", ssid);
WiFi.begin(ssid, password);
while(WiFi.status()!=WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.printf("\nWiFi connected\n");
pinMode(sensorVdd, OUTPUT);
digitalWrite(sensorVdd, HIGH);
delay(500);
SPI.begin(18, 36, 26, 19); // SPI.begin(sck, miso, mosi, ss);
mcp3004.begin();
int a0 = mcp3004.read(0);
int a1 = mcp3004.read(1);
int a2 = mcp3004.read(2);
int a3 = mcp3004.read(3);
Serial.printf("%d %d %d %d\n", a0, a1, a2, a3);
ambient.begin(channelId, writeKey, &client);
ambient.set(1, a0);
ambient.set(2, a1);
ambient.set(3, a2);
ambient.set(4, a3);
ambient.send();
// WiFi Disconnect
WiFi.disconnect(true);
Serial.printf("WiFi disconnected\n");
// Deep Sleep
esp_sleep_enable_timer_wakeup(interval*1000*1000);
esp_deep_sleep_start();
}
void loop() {
}
「MCP3008」を使うためのライブラリ「MCP3004.h」は、こちらの本に書かれているものを使いました。
土壌水分センサの防水加工を行います。
プラスチック板で、センサの回路部分を囲みます。
レジン液が染み出さないように、プラスチック板の継ぎ目はマスキングテープで塞いでおきます。
使用するUVレジン液はこちらです。手芸用品店で購入しました。
プラスチック板で囲んだ中に、レジン液を注ぎます。
この状態で、直射日光の当たる場所に数十分置いておきます(今回は天気が悪かったので、丸一日放置しておきました)。
固まったらできあがりです。
ブレッドボードで各パーツを接続し、防水ケースに収納します。
畑に持っていって、設置します。
今回はこのような、畝立て途中のスペースで実験することにします。
土を10センチほど掘ります。
4個の土壌水分センサを並べます。左端が「CH0」、右端が「CH3」です。
「CH0」「CH2」は垂直方向(面が横向き)、「CH1」「CH3」水平方向(面が上向き)に設置しています。
土を戻します。センサを深さ10センチあたりに埋めた状態です。
一応、草マルチをしておきます。
この状態で、しばらく様子を見たいと思います。
2021年11月26日追記
土壌水分センサを畑に設置してから、ちょうど1ヶ月が経過しましたので、様子を見てみたいと思います。
結果は以下のとおりです。
(当初、センサを埋めていた場所に、野菜の苗を植え付けることになったため、11月6日にセンサの設置場所を変更しています。)
まず、1ヶ月間にわたり、問題なくデータが取得できていることから、当初の想定どおり、単三形ニッケル水素電池4本のみで1ヶ月以上連続稼働できることが確認できました。
また、センサは4個とも妥当な値を取得できており、UVレジンによる回路部分の封止で、とりあえずは防水面も問題ないことが確認できました。
次にデータを見ていきます。
畑に設置する前(室内の空気中に放置)は、センサ4個とも概ね同じような値になっていましたので、センサの個体差はそれほど大きくないと思われます。
畑に設置後、垂直方向(面が横向き)に設置したふたつのセンサ(CH0、CH2)は、値が大きく異なっています。
センサの基板に土が密着しているかどうかによって、値が大きく変わることが想定されていましたが、やはり土中への埋め方の微妙な違いによって差が生じてしまうようです。
設置場所を変えた後も、相変わらず差が生じていることから、垂直方向に設置する限り、このような差が生じてしまうことはやむを得なさそうです。
一方、水平方向(面が上向き)に設置したふたつのセンサ(CH1、CH3)では、よく似た値が取得できています。
センサの基板が上を向いているため、常に土と密着している状態が維持できているためと思われます。
また、基板が上に向いているため、基板が常に濡れている状態になってしまい、水分量の変化を観測しにくくなるのではないか?と危惧していましたが、雨が降った時の変化はもちろん、1日の中での水分量変動もきちんと観測できており、データの内容としても問題なさそうです。
この結果から、土壌水分センサを土中に埋設する場合は、水平方向(面が上向き)に設置するのが良いと思われます。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。