NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

プランター自動水やり機!その9(土の湿度測定!)

 前回 デバッグしたプランター自動水やり機の制御プログラムに少し手を加えて、土の水分量を変えた時にどの位の値になるか測ってみました

1. プログラム

 土の湿度測定用プログラムは図1の通りです。
 実際にプランターに使っている土と同じ土に土壌湿度センサーを挿して、条件を変えながら湿度を測ります。
/*NOBのArduino日記! プランター自動水やり機制御プログラム(20170803作成)*/
#include <Wire.h>
#include "DS1307.h"
const int SensorPower = 2;//土壌湿度センサー電力供給制御ピン番号
const int SolenoidPower = 8;//水電磁弁開閉制御ピン番号
const int SwitchIn = A1;//水電磁弁の手動ONスイッチ接続ピン番号
const int SensorIn = A3;//土壌湿度センサー値取得ピン番号
DS1307 clock;//DS1307クラスのオブジェクトを定義する

//初期設定
void setup() {
  /* 時間のリセット
    clock.fillByYMD(2017,7,8);//年,月,日
    clock.fillByHMS(11,29,30);//時:分,秒"
    clock.fillDayOfWeek(SAT);//曜日
    clock.setTime();//RTCチップへの書き込み時間 */
  clock.begin();
  Serial.begin(9600);           //9600bpsでシリアルポートを開く ※最後に削除する!
  pinMode(SensorPower, OUTPUT);
  pinMode(SolenoidPower, OUTPUT);
  pinMode(SwitchIn, INPUT);
}

//機能:土壌湿度センサーの値を読み込む関数
int SensorRead() {
  int SensorValue = 0;                  //SensorValueをint型の変数として宣言(毎回0にリセット)
  for (byte i = 0; i <= 10; i++) { //A3ポートの電圧を10回読み平均値を出す
    digitalWrite(SensorPower, HIGH);  //センサー電力供給開始
    delay(10);                       //一定時間電流を流して測定値を安定させる
    SensorValue = SensorValue + analogRead(SensorIn);       //センサー電圧を10回読み合計する
    //Serial.print(":");Serial.print(analogRead(SensorIn));
    digitalWrite(SensorPower, LOW);
  }  //センサー電力供給停止
  return SensorValue / 10;
} //センサー電圧平均値を返す


//メインループ
void loop() {
  clock.getTime();//現在の時刻を取得する
  if (digitalRead(SwitchIn) == HIGH) {
    digitalWrite(SolenoidPower, HIGH); //手動スイッチONで水を出す
  } else { //手動スイッチOFFで以下自動水やり制御実行
    if ((clock.hour == 7) || (clock.hour == 23)) { //時刻がAM7orPM7時で以下実行****19→22
      Serial.println("A");
      if (clock.minute == 0 || clock.minute == 10 || clock.minute == 9) { //時刻が0and10and20分で以下実行***20→6
        Serial.println("B");
        if (SensorRead() < 350) { //土が乾燥していた場合以下実行
          Serial.println("C");
          digitalWrite(SolenoidPower, HIGH);//水を出す
          delay(3000UL);//5分待つ***300000
          digitalWrite(SolenoidPower, LOW);//水を止める
        }
      }
    }
    digitalWrite(SolenoidPower, LOW);  //スイッチOFFで水を止める
  }

  Serial.print("SwitchIn:"); Serial.println(digitalRead(SwitchIn));
  Serial.print("hours:"); Serial.println(clock.hour);
  Serial.print("minute:"); Serial.println(clock.minute);
  Serial.print("SensorRead:"); Serial.println(SensorRead());
  Serial.print("SolenoidPower:"); Serial.println(digitalRead(SolenoidPower));
  Serial.println("");
  delay(1000);
}//1秒待つ
イメージ 1
図1:プログラム例
 

2. 測定!

2.1 何も無し
 土壌湿度センサーに何も接続しなければ、図2の通り「SensorRead:0」となりました。
イメージ 2
図2:シリアルモニター
2.2 フワフワの土
 ホームセンターで買って来たフワフワの土に土壌湿度センサーを挿して測定した所、図3の通り「SensorRead:662」となりました。
 触った感じ割と湿ってますがパラパラほぐれます。
イメージ 3
図3:シリアルモニター
 
2.3 押し固めた
 図3で測定した土を押し固めて土壌湿度センサーで測定した所、図4の通り「SensorRead:722」となりました。
 土の密度が上がると同じ水分量の土でも電気抵抗は変わるようです。
イメージ 4
図4:シリアルモニター
 
2.4 さらに押し固めた
 図4で測定した土をさらに押し固めて土壌湿度センサーで測定した所、図5の通り「SensorRead:815」となりました。
 土の密度と電気抵抗は比例関係に有るようです。
イメージ 5
図5:シリアルモニター
 
2.5 水を足す
 図5で測定した土に水を少し足して土壌湿度センサーで測定した所、図6の通り「SensorRead:890」となりました。
 当然ですが水分量と電気抵抗は比例関係に有るようです。
イメージ 6
図6:シリアルモニター
 
2.6 水入り押し固めた
 図6で測定した水入りの土を押し固めて土壌湿度センサーで測定した所、図7の通り「SensorRead:928」となりました。
 センサー端子間をワニ口クリップで短絡した時の測定値が「969」でしたので殆ど通電している状態です。
イメージ 7
図7:シリアルモニター
 
2.7 水溜まり土⁉
 図7で測定した土に水溜まりが出来るまで水を入れ、土壌湿度センサーで測定した所、図8の通り「SensorRead:947」となりました。
 流石にここまで来ると殆どショートしている状態ですね
イメージ 8
図8:シリアルモニター

3. まとめ

 図2~8の測定値をまとめた結果を表1に示します。

 

表1:土の湿度測定結果一覧
対象 結果(5V/1024)
2.1 何も無し 0
2.2 フワフワの土 662
2.3 押し固めた土 735
2.4 さらに押し固めた土 815
2.5 さらに押し固めた土+水 890
2.6 さらに押し固めた土+水+圧縮 928
2.7 さらに押し固めた土+水+圧縮+水溜まり 947
 
 土壌湿度センサー の測定値は土の「水分量」と「密度」に比例して増加するようです。
 と言う事は、良く耕されている土と踏み固められた土では同じ水分量でも測定値が変わってしまう事になります。
 土がフワフワに耕されていても時間が経てば雨降って地固まってしまいます。
 センサーを挿す場所は初めから固めておいた方が後々測定値の変動も少なくなりそうです。
 表1の結果から2.3の押し固められた土(若干湿っている)時の測定値「735」を下限として、これを下回ったら散水する条件で行こうかと思います
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【プランター自動水やり機!】目次に戻る