Menu
CoddyTech

植物モニター:乾燥アラーム

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回鳴ります。

challenge icon

チャレンジ

中級

乾燥アラームを追加しましょう:

  • 土が乾燥していたかどうか(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);
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

プロジェクトのすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド