ESP8266と土壌センサを使って水分量を測定する方法を解説
この記事では、Arduino互換機のESP8266(ESP-WROOM-02)を使って、土壌センサーで土の水分量を測れるようにしていく。そんなESP8266は、ADコンバータが1つだけ内蔵されている。それを使って土壌センサーのアナログ電圧を読み取っていく。
これはD1 miniです、それはESP-8266EXに基づくMini WIFIボードです。 11本のデジタル入力/出力ピン。 すべてのピンは割り込み/ PWM / I2C / 1線式をサポート(D0を除く)。 1アナログ入力(最大3.3V入力)。 Micro USB接続。
AmazonESP8266と土壌センサーの配線
土壌センサーは「Capacitive Soil Moisture Sensor」を使った。
項目 | 内容 |
---|---|
電源電圧 | 3.3〜5.5V |
出力電圧範囲 | 0〜3V |
消費電流 | 5mA |
この土壌センサーは静電容量型で、センサーに接触している水分量が変わると、センサー内部の静電容量も変化することから、出力電圧を変化させているようだ。土壌センサーは他にも、金属棒2つを使って土の抵抗を測ることで土壌の水分量を測定する方法がある。しかしこの場合、金属棒が腐食して抵抗値が変化しやすい。それに比べてこの静電容量型は、腐食がほぼない。
さっそくESP8266に土壌センサーを接続してみた。
センサーの電源はESP8266の主電源(アルカリ電池2本)と同じ3Vに接続。
また、TOUT に入力できる信号は+1Vまでなので、アナログ出力 AOUT を分圧抵抗で1/3の電圧にしてESP8266の TOUT ピンへつないだ。
土壌水分量を測定してみよう!
土壌センサーを使って水分量を計算するには、空気中と水中のデータを測る必要がある。だから、空気中での電圧を水分量を0%とし、水へギリギリまでつけた時の電圧を水分量100%として計算する。
空気中のアナログ電圧を AirValueとし、水の中に浸かっている時のアナログ電圧をWaterValue とする。すると、水分量Moisture(%)は次の式で導き出される。
$$ Moisture = 100 - 100 \times \frac{(Aout - WaterValue)}{(AirValue - WaterValue)}$$
土壌水分量の測定プログラム
次に示すプログラムは、水分量を計測し、Ambientへデータを送信している。
#include "Ambient.h"
//ESP8266では、アナログ入力を使うため以下の記述が必要
extern "C" {
#include "user_interface.h"
}
const int AirValue = 224; // 空気中の実測値を設定する
const int WaterValue = 123; // 水に浸した実測値を設定する
const char * ssid = "WiFi SSID";
const char * password = "WiFi パスワード";
const int channelId = Ambient チャネルID;
const char * writeKey = "Ambient ライトキー";
WiFiClient client;
Ambient ambient;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); // Wi-Fiの初期化
while (WiFi.status() != WL_CONNECTED) { // Wi-Fiアクセスポイントへの接続待ち
delay(500);
}
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}
void loop() {
int v = system_adc_read();
// Serial.println(v);
float moisture = 100 - 100 * (v - WaterValue) / (AirValue - WaterValue);
Serial.println(moisture);
ambient.set(1, moisture);
ambient.send();
delay(60 * 1000);
}
ESP8266では、TOUTピンからアナログ電圧を取得するために、以下の宣言が必要なので注意しよう。
extern "C" {
#include "user_interface.h"
}
測定結果は?
実際に土壌センサーを使って、ベランダで育てている野菜プランターの土壌水分量を測定してみた。
土壌センサーを使ってベランダの野菜プランターの土壌水分量を測定
朝に水やりをしてから、土壌の水分を測定したデータがこちら。
水分量がなぜか上昇していくのを不思議に思いながらも、そのままログを取り続けていた。
数式を何度も確認しても、間違っている点はなさそうだ。そして途中、電池切れになり電池を交換した時に、重大なことに気づく。
乾電池の電圧効果で、土壌センサーのアナログ出力も変化してしまっていたのだ!
アルカリ電池2つで約3Vになるので、これをESP8266の主電源にしていたが、センサーもこの電源を使っているので、電圧降下のがそのままアナログ出力に出てしまった。土壌センサーは出力電圧が低くなると水分量が多いと判断される。だから、電池の消耗で電圧が下がると右肩上がりのグラフになっていたのだ。
この問題は3.3V電源を低電圧にすれば解決する。しかしあいにく、3.3Vレギュレーターが手元になかった。とりあえず今回は、土壌センサーの使い方を覚えただけで良しとするが、皆さんは電源に十分ご注意を。
英語の記事となるがこちらも参考に
この記事で扱った関連製品はこちら
これはD1 miniです、それはESP-8266EXに基づくMini WIFIボードです。 11本のデジタル入力/出力ピン。 すべてのピンは割り込み/ PWM / I2C / 1線式をサポート(D0を除く)。 1アナログ入力(最大3.3V入力)。 Micro USB接続。
AmazonArduinoの参考書
本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。
Amazon最後まで読んでいただきありがとうございました。
「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。
今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓