今日は土壌抵抗を判定して、通知するプログラムを作りました。
(プロトタイプその1)
前々回に書いた制御ロジックの一部を実装してみました。
ポイントはif /if elseの使い方です。
ここでは、RED 給水、YELLOW もうすぐ給水、GREEN 十分に水分があるの3水準を設定しました。
if/ else ifは1つ目の状態をifで定義、2つ目、3つ目…とelse ifで定義、どれにも当てはまらないときをelseで定義します。
if/ else /if elseはその状態にあるとき、永遠に該当の{}を繰り返すということもポイントです。
水遣りを実行したときはそのループを抜ける処理を考える必要がありますが、それはまた後ほど。
ここで、1021より大きいときと100未満はエラーを返すようにしています。
センサーの読み値は10bit = 2^10ですので、0~1024になりますが、抵抗の電圧を読むので、回路が断線したときや壊れてしまったとき、1024となります。
このとき、土壌が乾いている→給水モードとなってしまうと永遠と給水をしてしまうので、値が大きすぎるときはエラーとする処理を入れます。
断線もしくはショートしたときに異常な値を返してしまうことが起きうるので100未満も同様にエラーとします。
そして、このエラーはelseで記述しているので、プログラミングのバグによってif /if elseのいづれにも当てはまらないときもここに到達します。
この次は抵抗の読み値を平均化(数回読んで、ノイズを弾く方法)することを考えようと思います。
======================================
//使う変数はなるべくここで定義します。これによってあとからパラメータを変更するときに簡単です。
int regist = 900; //土壌抵抗
int power = 255; //モーターpwm
int threshold = 600; //水遣り敷居値
int GREEN = A1; //カラーLEDをつなぐpinを指定
int YELLOW = A2;
int RED = A3;
int POMP = 5; //ポンプを5pinに //テスト用に今はLEDをつないでいます
int LED = 150;
int cycle = 1000; //水遣りチェック周期(ms)
void setup() {
Serial.begin(9600); //シリアルモニタを使う(カッコ内は通信速度)
pinMode(A0, INPUT); //土壌抵抗Read
pinMode(5, OUTPUT); //電圧を印可する宣言
pinMode(A1, OUTPUT); //GREEN
pinMode(A2, OUTPUT); //YELLOW
pinMode(A3, OUTPUT); //RED
}
void loop() {
regist = analogRead(A0);
//Serial.printは実動上は不要ですがデバックに便利です。
Serial.print("A0 = regist = ");
Serial.println(regist);
Serial.print("threshold = ");
Serial.println(threshold);
Serial.print("cycle = ");
Serial.println(cycle);
if (regist > 1021) //センサーエラー
//センサー読み値が大きすぎるのはエラーとみなします
{analogWrite(RED, LED);
delay(100); //エラーアピールのため点滅します
analogWrite(POMP, 0);
analogWrite(GREEN, 0);
analogWrite(YELLOW, 0);
analogWrite(RED, 0);
delay(100);
}
else if (regist > threshold) { //給水 //給水モード
analogWrite(POMP, power); //ポンプON
analogWrite(GREEN, 0);
analogWrite(YELLOW, 0);
analogWrite(RED, LED);
}
else if (regist > threshold - 200) //thresholdを基準に土壌抵抗を区切ります。
{
analogWrite(POMP, 0);
analogWrite(GREEN, 0);
analogWrite(YELLOW, LED);
analogWrite(RED, 0);
}
else if (regist > 100) { //十分に水分があるとき
analogWrite(POMP, 0);
analogWrite(GREEN, LED);
analogWrite(YELLOW, 0);
analogWrite(RED, 0);
}
else {analogWrite(RED, LED); //100未満も異常とみなします
delay(100); //エラーアピールのため点滅します
analogWrite(POMP, 0);
analogWrite(GREEN, 0);
analogWrite(YELLOW, 0);
analogWrite(RED, 0);
delay(100);}
delay(cycle);//更新間隔の設定//土壌抵抗のチェック間隔
}
===========================================
LEDは以下のものでカラーを取り揃えました。
中国からの発送なので少し時間が掛かりますが、安いです。↓↓