プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

土壌抵抗を判断して通知

今日は土壌抵抗を判定して、通知するプログラムを作りました。

(プロトタイプその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は以下のものでカラーを取り揃えました。

中国からの発送なので少し時間が掛かりますが、安いです。↓↓