植物モニター:乾燥アラーム
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 19/24。
土壌が乾いた状態が続くと、モニターはピン8のブザーで助けを求めます。ただし、すぐには鳴らしません。測定値が一時的に下がることもあり、誤報が鳴るとすぐに無視されるようになります。乾燥状態が5秒を超えて続いた場合に鳴らすというルールです(実際の植物なら何時間も待つでしょう)。
土壌がどれくらい乾いた状態かを知るには、土壌が乾いた瞬間を記録します。そのためには、もう一つ記憶しておく必要があります。前回の測定時に乾いていたかどうかです。
if (moisture < 30) {
if (wasDry == false) {
wasDry = true;
dryStart = millis(); // たった今乾燥した
}
if (millis() - dryStart > 5000) {
tone(buzzerPin, 880, 200);
}
} else {
wasDry = false;
}elseが重要です。土壌に水をやると、wasDryはfalseに戻るため、次に乾燥したときは、その開始時点から時間を計ります。
loop()は1秒に1回読み取るため、土壌が乾いた状態の間は、200 msのビープ音が1秒に1回鳴ります。
チャレンジ
中級乾燥アラームを追加しましょう:
- 土が乾燥していたかどうか(
bool wasDry)と、乾燥し始めた時刻(unsigned long dryStart)を記録します - 乾燥状態が5000 msを超えたら、読み取りのたびに
tone(buzzerPin, 880, 200)を鳴らします - 水分量が30%以上になったら、
wasDryをfalseに戻します
Runを押し、つまみを下げて待ってから、Checkを押します。
自分で試してみよう
// つまみを土壌水分センサーの代わりに使う
const int sensorPin = A0;
// 状態表示ランプ:RGB LED
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;
// 水分量をパーセントで表す:0 は完全に乾燥、100 は水でびしょびしょの状態。
int readMoisture() {
int reading = analogRead(sensorPin);
return map(reading, 0, 1023, 0, 100);
}
// 乾燥しているときは赤、適度なときは緑、湿っているときは青。
void showStatus(int moisture) {
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
if (moisture < 30) {
digitalWrite(redPin, HIGH);
} else if (moisture <= 70) {
digitalWrite(greenPin, HIGH);
} else {
digitalWrite(bluePin, HIGH);
}
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int moisture = readMoisture();
Serial.print("Moisture: ");
Serial.print(moisture);
Serial.println("%");
showStatus(moisture);
delay(1000);
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド