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:プログラム例
2. 測定!
2.2 フワフワの土
ホームセンターで買って来たフワフワの土に土壌湿度センサーを挿して測定した所、図3の通り「SensorRead:662」となりました。
触った感じ割と湿ってますがパラパラほぐれます。
図3:シリアルモニター
2.3 押し固めた土
図3で測定した土を押し固めて土壌湿度センサーで測定した所、図4の通り「SensorRead:722」となりました。
土の密度が上がると同じ水分量の土でも電気抵抗は変わるようです。
図4:シリアルモニター
2.4 さらに押し固めた土
図4で測定した土をさらに押し固めて土壌湿度センサーで測定した所、図5の通り「SensorRead:815」となりました。
土の密度と電気抵抗は比例関係に有るようです。
図5:シリアルモニター
2.5 水を足す
当然ですが水分量と電気抵抗は比例関係に有るようです。
図6:シリアルモニター
2.6 水入り押し固めた土
図6で測定した水入りの土を押し固めて土壌湿度センサーで測定した所、図7の通り「SensorRead:928」となりました。
センサー端子間をワニ口クリップで短絡した時の測定値が「969」でしたので殆ど通電している状態です。
図7:シリアルモニター
2.7 水溜まり土⁉
図7で測定した土に水溜まりが出来るまで水を入れ、土壌湿度センサーで測定した所、図8の通り「SensorRead:947」となりました。
流石にここまで来ると殆どショートしている状態ですね
図8:シリアルモニター
3. まとめ
図2~8の測定値をまとめた結果を表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」を下限として、これを下回ったら散水する条件で行こうかと思います
励みになりますのでよければクリック下さい(^o^)/