静電容量式土壌水分センサー(Capacitive Soil Moisture Sensor v1.2)
はじめに
静電容量式土壌水分センサーです。
マイコンに接続して、植物の水やりや管理に使用することが期待できます。
大変安価に手に入れることができますが、センサーによるバラつきがあるため、キャリブレーション(校正)は必須です。
また、EC(電気伝導率)による数値の変化もあるため、正確な土壌水分率を計測するのは向いていません。
ただし、おおまかな土壌水分率を把握するためにはおすすめできると思います。

開発環境
OS : Windows 11 Pro
ESP32:ESP-WROOM-32
統合開発環境 : Arduino IDE 2.3.4
Arduino core for the ESP32:2.0.17
使用ライブラリ:なし
使用パーツ
ESP32開発ボード(38Pin)

Capacitive Soil Moisture Sensor v1.2

ジャンパーワイヤー(オスーオス)

作業内容
配線図
Capacitive Soil Moisture Sensor v1.2 とは GPIO 15 を使用して接続します。

Capacitive Soil Moisture Sensor v1.2 | ESP32開発ボード(38Pin) |
GND | GND |
VCC | 3.3V |
AOUT | GPIO 15 |
ライブラリインストール
なし
初回起動
スケッチ作成
#define MOISTURE_PIN 15
const int DryValue = 0;
const int WetValue = 0;
int soilMoistureValue = 0;
int soilMoisturePercent=0;
void setup()
{
Serial.begin(115200);
pinMode(MOISTURE_PIN, INPUT);
}
void loop()
{
soilMoistureValue = analogRead(MOISTURE_PIN);
Serial.println(soilMoistureValue);
soilMoisturePercent = map(soilMoistureValue, DryValue, WetValue, 0, 100);
if(soilMoisturePercent > 100) {
Serial.println("100 %");
} else if(soilMoisturePercent <0) {
Serial.println("0 %");
} else if(soilMoisturePercent >=0 && soilMoisturePercent <= 100) {
Serial.print(soilMoisturePercent);
Serial.println("%");
}
delay(1000);
}
コード説明
静電容量式土壌水分センサーと接続するピン番号を15に設定します。
#define MOISTURE_PIN 15
まったく水に触れていない状態(Dry)の値と水に浸かっている状態(Wet)の値を設定しています。
この値でキャリブレーション(校正)します。初回起動時は、どのような値でもOKです。
const int DryValue = 0;
const int WetValue = 0;
ピンモードをINPUTで指定します。
pinMode(MOISTURE_PIN, INPUT);
アナログ値を読み取り、静電容量式土壌水分センサーから電圧を読み取っています。
soilMoistureValue = analogRead(MOISTURE_PIN);
Serial.println(soilMoistureValue);
map関数を使用して水分率を算出しています。
soilMoisturePercent = map(soilMoistureValue, DryValue, WetValue, 0, 100);
動作確認
起動すると、analogRead()で取得した値が表示されます。
水分率はキャリブレーション(校正)後に正しく表示されます。

キャリブレーション(校正)
水に触れていない状態(Dry)と、水に浸かっている状態(Wet)の数値でキャリブレーション(校正)します。
センサーの個体により数値が異なります。
水に触れていない状態(Dry)
静電容量式土壌水分センサーが、水に触れていない状態での値を、先ほどのスケッチの「WetValue」に設定します。


const int DryValue = 2430;
水に浸かっている状態(Wet)
静電容量式土壌水分センサーが、水に浸かっている状態での値を、先ほどのスケッチの「DryValue」に設定します。
写真ではわかりにくいですが、白線まで水に浸けています。
(白線より上の基盤が水に浸からないように注意してください。)


const int WetValue = 1135;
計測
キャリブレーション(校正)での値を設定してからブログラム更新すると、水分率が正しく表示されるようになります。
動作確認
鉢に乾いた土を入れ、水を少しずつ入れて水分率の変化を見てみます。

<<水やり 0cc >>
水やり前の状態。
水分率表示:3%。

<<水やり 50cc >>
50cc水を入れた状態。
水分率表示:20%。

<<水やり 100cc >>
100cc水を入れた状態。
水分率表示:60%。

<<水やり 150cc >>
150cc水を入れた状態。
この時点で水が鉢の下から出てきたので、土が保有する水分のMAXになります。
水分率表示:82%。
「3%→20%→60%→82%」と変化し、おおよその水分率を取得することに成功しました。
おわりに
おおよその値を把握することができますので、簡易な水やりシステムなどを構築することができます。
ただし、肥料濃度などにより、EC(電気伝導率)による数値の変化もあるため、正確な土壌水分率を求める状況では向いていません。
コメント