【家庭菜園_水やり】土壌水分計を自作してみた

スポンサーリンク

家庭菜園の水やりをarduinoで自動化したのですが、どのくらい水をあげたらいいのか判らないので、土壌センサーを自作して、土壌水分計(土壌湿度計)を作ってみました。

思ったより簡単で農業をされている方も使えるのでは?と思います。

スポンサーリンク

土壌水分計とは

土壌水分計は土壌湿度計とも呼ばれ、その名の通り土壌に含まれる水分が電気を通しやすいという性質を利用して計測します。

ここでは単純な電気伝導度で土壌水分量を推測しようということで難しい理論的な話ではありません。

これ、ビチャビチャだぁ~!という状態を100とします。

これって乾燥しすぎだろ!っていう状態を0とします。

ここで作成する土壌水分計はこのような感覚的なものを『見える化』したものです。

スポンサーリンク

必要な材料

wifiを使えてarduino IDEも使えるESP32 DevKitC V4開発ボードを使って土壌水分計を作ります。

また、土壌水分センサーはデジタルセンサーモジュールを使いました。

格安ながら使える製品です。

しかし、センサー部分は耐久性を考えてステンレス棒で自作します。

スポンサーリンク

土壌水分センサーを自作する。

現在、工事中! …(・_・;)

スポンサーリンク

esp32の配線

VCC ⇒ 3,3V

GND ⇒ GND

AO ⇒ GPIO 36番ピン

DO 使わない

『 【家庭菜園_水やり】土壌水分計を自作してみた 』 ..AO   ⇒ GPIO 36番ピンDO  使わない..

analogRead()が使えるピンはADCが記載されているピンならどれでもいいらしい….です。

スポンサーリンク

map関数

土壌センサーから出力された値を0~100%で表示させるためにmap関数を使います。

map関数とは……

数値をある範囲から別の範囲に変換します。fromLowと同じ値を与えると、toLowが返り、fromHighと同じ値ならtoHighとなります。その中間の値は、2つの範囲の大きさの比に基づいて計算されます。

map関数の引数は

map(value, fromLow, fromHigh, toLow, toHigh)

となっているので、valueにはセンサー値を与えます。

map(dojyou_sensor_output, fromLow, fromHigh, toLow, toHigh)

土壌センサーから出力された値を0~100%で表示させたいのでto Lowは0に,toHighを100にします。

map(dojyou_sensor_output, fromLow, fromHigh, 0, 100)

土壌センサーの最大と最小値

まず、土壌がカラカラの乾燥状態での値を調べると4095の値でした。

調べ方はカンタン!土壌センサーを机の上に置いただけ…….(^^;

『 【家庭菜園_水やり】土壌水分計を自作してみた 』 ..まず、土壌がカラカラの乾燥状態での値を調べると4095の値でした。調べ方はカンタン!土壌センサーを机の上に置いただけ…….(^^;..

ちなみにesp32ではアナログ出力は0~4096の範囲だそうです。

fromLowと同じ値を与えると、toLow、つまり値を0にしたいのでfromLowには4095を代入します。

map(dojyou_sensor_output, 4095, fromHigh, 0, 100)

値が100になるときのセンサー値も調べてみます。

調べ方はこれも簡単です。

土壌センサーを水に浸しただけ…

より、土壌に近いように塩を3粒ほど入れました。 (^_^;)

『 【家庭菜園_水やり】土壌水分計を自作してみた 』 ..土壌センサーを水に浸しただけ…より、土壌に近いように塩を3粒ほど入れました。 (^_^;)..

1秒おきに計測してみました。

『 【家庭菜園_水やり】土壌水分計を自作してみた 』 ..1秒おきに計測してみました。..

値が一定ではありませんね。少しセンサーを動かしても値が変化します。そこで簡易キャリブレーションということでfrom Higthには1100という数値を代入します。

map(dojyou_sensor_output, 4095, 1100, 0, 100)

これでmap関数の引数を代入することが出来ました。

スポンサーリンク

土壌水分計 arduino IDEスケッチ

土壌水分計のarduino IDEでの、いきなりスケッチです。

int dojyou_sensor_pin = 36;
int dojyou_sensor_output ;
void setup() {
  
   Serial.begin(115200);
   Serial.println("Reading From the Dojyou_Sensor ...");
   delay(2000);
   }
void loop() {
   dojyou_sensor_output= analogRead(dojyou_sensor_pin);
   dojyou_sensor_output = map(dojyou_sensor_output,4095,1100,0,100);
   Serial.print("dojyou_sensor_output : ");
   Serial.print(dojyou_sensor_output);
   Serial.println("%");
   delay(5000);
}

大体これで100%前後の数値を示すと思います。

ただ、この状態では常時センサーに通電した状態ですので電極表面に気泡がついてきます。

そこで、土壌湿度を計測するときだけ通電したいと思います。

スポンサーリンク

アナログ出力 DAC

esp32にはピンから直接アナログ出力が出来るようになっているとのこと…

ESP32 DevKitC V4開発ボードではGPIO25、GPIO 26 ピンが使えます。

dacWrite(pin, value)関数でpinにGPIO 25又は26を、valueは0~255の範囲で指定します。

実際に動かしてみると、4095の値を得ることは出来ませんでした。

4095は電圧では3.3VだそうですのでDACでは3V前後のようです。25ピンと26ピンで動かしたところ25ピンの方がほぼ安定しているので、GPIO 25番ピンを使うことにします。

ということで、デジタルセンサーユニット側のVCCはesp32の25番ピンからの給電です。(ピン配置図の左上から9番目です)

VCC ⇒ GPIO 25番ピン

GND ⇒ GND

AO ⇒ GPIO 36番ピン

DO 使わない

また、4095の値を4050に変更しました。

スポンサーリンク

土壌水分計 節電スケッチ

int dojyou_sensor_pin = 32;
int dojyou_sensor_output ;
void setup() {
  
   Serial.begin(115200);
   Serial.println("Reading From the Dojyou_Sensor ...");
   delay(1000);
   }
void loop() {
    dacWrite( 25, 255); //給電 
    delay(3000);
    dojyou_sensor_output = analogRead(dojyou_sensor_pin); 
     
    Serial.println(dojyou_sensor_output);      
   
    dojyou_sensor_output = map(dojyou_sensor_output,4050,2200,0,100);
    dacWrite( 25, 0); //給電停止
    Serial.print("dojyou_sensor_output : ");
    Serial.print(dojyou_sensor_output);
    Serial.println("%");
    delay(5000);
}