プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#始めました。

土壌抵抗を判断して通知

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

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

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

SODIAL(R) 100 5mm赤い、緑、青い、黄色い、白いのLED電球