植物の世話は結構面倒ですが、中でも水やりは、小まめに見ていても失敗したりします。
「常に土壌水分量を教えてくれる自動ステーションが在ったらいいなー」ということでWEBで色々検索してみました。
まず、どうやって測定するのか?
古いところでは;
採土法:
テンシオメーター法:
電気抵抗法:
これらは、ちょっと連続的に自動で調査するのには適しません。 (電気抵抗法は可能性はありますが、水分量だけでなくて塩分量とかにも影響を受けるので、ちょっと信頼性に不安があります。 Groveで売っている水分センサーは電気抵抗を測っているみたいですが、耐候性はないようですし、今回の想定条件には適合しないようでしたので、対象から外しました)
新しい方法として、TDR法とキャパシタンス法があるようで、何れも土壌の誘電率から水分量を求める方法のようです。 (水の誘電率が、土粒子、空気などに比べると数十倍大きいため、水分含量により誘電率が大きく変化するのが根拠のようです)
TDR法で測定する装置は幾つか販売されていますが、一台数万円以上して、ちょっと庭の水やりに気軽に、とか圃場の複数地点に設置してモニタリング、といった用途には向いていないように思います。 この方法で気に入った製品は、鹿児島大学の特許を利用した (株)A.R.Pの水分センサーWD-3です。 U字の伝送路の一方から二つの周波数の信号を流し、もう一方で受けた信号との位相差から伝送路の周りの誘電率を計算させる、方法のようで、とってもスマートな方法だと思います。 製品も「カッコいい」、でも高い!
キャパシタンス法というのもありますね。 誘電率だから、当然土壌の容量(キャパシタンス)を測れば分かりますよね。 これだったら出来るかも? で、またまたキャパシタンスを測る方法をググってみましたが、中々簡単に安くできる方法、というのは難しい。
誘電率の絶対値が必要なわけではなく、相対的に乾燥状態、適切な水分状態、過剰な水分状態、過度の(根腐れしそうな)水分状態、あるいはもう少し細かい程度で分かればよい、というレベルで考えることにして、コストも考え、コンデンサに直流を流した時に充電に掛かる時間を測ってキャパシタンスを測る方法が利用できないか検討することにしました。 これだと、Arduinoにプローブをつけて出来るかもしれません。
実験1) Arduinoでコンデンサの容量を測ることはできるのか?
ArduinoUnoに左のような配線をして、簡単なスケッチを書いて実験してみました。
TRは被測定Cを放電させるためのスイッチ。 VccからのRは被測定Cの値によって数メガから十メガ位? ベースにあるRは、1KΩにしていますが、UnoのHigh(5V)でコレクタ、エミッタが出来るだけショートされるように、、、。
取りあえず実験なので、手元のTR,R等で作ってますので値には何の根拠もありません。
結果:
Vcc+からの抵抗を10MΩにすると左のような結果が得られたので、大凡の容量は簡単に測定できる(数値化できる)事がわかりました。 10μF以上の容量だと、測定に時間が掛かるのと、小容量は測れません。
また放電させる時間は数秒あった方がよさそうです。
ところで、土壌ってどの位の容量を持っているのでしょうか? プローブの間隔とか形状でも違うでしょうが、Pocket L/C Meter Ver. 2で明日以降測ってみることにします。 大きいのか、小さいのか???
=====スケッチ=====
long t0, start;
long v0;
boolean flag=true, display=true;
const int SW = 12;
void close1sec(){
digitalWrite(SW, HIGH);
delay(1000);
digitalWrite(SW,LOW);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(SW, OUTPUT);
close1sec();
analogReference(INTERNAL);
}
void loop() {
// put your main code here, to run repeatedly:
v0 = analogRead(0);
t0 = millis();
//Serial.print(t0);
//Serial.print(":");
//Serial.println(v0);
if (flag && (v0 >= 100 && v0 <= 150)) {
Serial.print("Started at ");
Serial.print( t0 );
Serial.print(" milli sec " );
Serial.println(v0);
start = t0;
flag = false;
} else if (v0 >= 700 && !flag ){
flag = true;
Serial.print( "Ended at" );
Serial.print(t0);
Serial.print( " ");
Serial.print ("Value = ");
Serial.print( t0 );
Serial.print( "-");
Serial.print(start);
Serial.print("=");
Serial.println(t0 - start);
delay(30000);
close1sec();
}
}
「常に土壌水分量を教えてくれる自動ステーションが在ったらいいなー」ということでWEBで色々検索してみました。
まず、どうやって測定するのか?
古いところでは;
採土法:
テンシオメーター法:
電気抵抗法:
これらは、ちょっと連続的に自動で調査するのには適しません。 (電気抵抗法は可能性はありますが、水分量だけでなくて塩分量とかにも影響を受けるので、ちょっと信頼性に不安があります。 Groveで売っている水分センサーは電気抵抗を測っているみたいですが、耐候性はないようですし、今回の想定条件には適合しないようでしたので、対象から外しました)
新しい方法として、TDR法とキャパシタンス法があるようで、何れも土壌の誘電率から水分量を求める方法のようです。 (水の誘電率が、土粒子、空気などに比べると数十倍大きいため、水分含量により誘電率が大きく変化するのが根拠のようです)
TDR法で測定する装置は幾つか販売されていますが、一台数万円以上して、ちょっと庭の水やりに気軽に、とか圃場の複数地点に設置してモニタリング、といった用途には向いていないように思います。 この方法で気に入った製品は、鹿児島大学の特許を利用した (株)A.R.Pの水分センサーWD-3です。 U字の伝送路の一方から二つの周波数の信号を流し、もう一方で受けた信号との位相差から伝送路の周りの誘電率を計算させる、方法のようで、とってもスマートな方法だと思います。 製品も「カッコいい」、でも高い!
キャパシタンス法というのもありますね。 誘電率だから、当然土壌の容量(キャパシタンス)を測れば分かりますよね。 これだったら出来るかも? で、またまたキャパシタンスを測る方法をググってみましたが、中々簡単に安くできる方法、というのは難しい。
誘電率の絶対値が必要なわけではなく、相対的に乾燥状態、適切な水分状態、過剰な水分状態、過度の(根腐れしそうな)水分状態、あるいはもう少し細かい程度で分かればよい、というレベルで考えることにして、コストも考え、コンデンサに直流を流した時に充電に掛かる時間を測ってキャパシタンスを測る方法が利用できないか検討することにしました。 これだと、Arduinoにプローブをつけて出来るかもしれません。
実験1) Arduinoでコンデンサの容量を測ることはできるのか?
ArduinoUnoに左のような配線をして、簡単なスケッチを書いて実験してみました。
TRは被測定Cを放電させるためのスイッチ。 VccからのRは被測定Cの値によって数メガから十メガ位? ベースにあるRは、1KΩにしていますが、UnoのHigh(5V)でコレクタ、エミッタが出来るだけショートされるように、、、。
取りあえず実験なので、手元のTR,R等で作ってますので値には何の根拠もありません。
結果:
Vcc+からの抵抗を10MΩにすると左のような結果が得られたので、大凡の容量は簡単に測定できる(数値化できる)事がわかりました。 10μF以上の容量だと、測定に時間が掛かるのと、小容量は測れません。
また放電させる時間は数秒あった方がよさそうです。
ところで、土壌ってどの位の容量を持っているのでしょうか? プローブの間隔とか形状でも違うでしょうが、Pocket L/C Meter Ver. 2で明日以降測ってみることにします。 大きいのか、小さいのか???
=====スケッチ=====
long t0, start;
long v0;
boolean flag=true, display=true;
const int SW = 12;
void close1sec(){
digitalWrite(SW, HIGH);
delay(1000);
digitalWrite(SW,LOW);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(SW, OUTPUT);
close1sec();
analogReference(INTERNAL);
}
void loop() {
// put your main code here, to run repeatedly:
v0 = analogRead(0);
t0 = millis();
//Serial.print(t0);
//Serial.print(":");
//Serial.println(v0);
if (flag && (v0 >= 100 && v0 <= 150)) {
Serial.print("Started at ");
Serial.print( t0 );
Serial.print(" milli sec " );
Serial.println(v0);
start = t0;
flag = false;
} else if (v0 >= 700 && !flag ){
flag = true;
Serial.print( "Ended at" );
Serial.print(t0);
Serial.print( " ");
Serial.print ("Value = ");
Serial.print( t0 );
Serial.print( "-");
Serial.print(start);
Serial.print("=");
Serial.println(t0 - start);
delay(30000);
close1sec();
}
}
0 件のコメント:
コメントを投稿