Menu
CoddyTech

Pflanzenmonitor: Trockenalarm

Teil des Abschnitts Projekte der Arduino-Journey von Coddy. Lektion 19 von 24.

Wenn die Erde trocken bleibt, fordert der Monitor mit dem Summer an Pin 8 Hilfe an. Nicht sofort: Ein Messwert kann kurz absinken, und ein Alarm, der grundlos losgeht, wird bald ignoriert. Die Regel lautet: länger als 5 Sekunden trocken (eine echte Pflanze würde Stunden warten).

Um zu wissen, wie lange die Erde schon trocken ist, merke dir den Zeitpunkt, an dem sie trocken wurde. Dafür braucht es ein weiteres Stück Speicher: ob sie bei der letzten Messung trocken war.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // Es ist gerade trocken geworden
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

Das else ist wichtig: Wenn die Erde gegossen wird, wird wasDry wieder auf false gesetzt, sodass die nächste Trockenphase ab ihrem eigenen Beginn gemessen wird.

loop() liest einmal pro Sekunde, daher ertönt der 200-ms-Piepton einmal pro Sekunde, solange die Erde trocken bleibt.

challenge icon

Aufgabe

Mittel

Füge den Trockenalarm hinzu:

  • Merke dir, ob die Erde trocken war (bool wasDry) und wann sie trocken wurde (unsigned long dryStart)
  • Wenn sie länger als 5000 ms trocken war, spiele nach jeder Messung tone(buzzerPin, 880, 200) ab
  • Wenn der Wert 30 % oder mehr beträgt, setze wasDry auf false zurück

Drücke auf Run, drehe den Knopf herunter und warte, dann Check.

Probier es selbst

// Der Drehknopf dient als Ersatz für einen Bodenfeuchtigkeitssensor
const int sensorPin = A0;
// Die Statusleuchte: eine RGB-LED
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// Die Feuchtigkeit in Prozent: 0 ist staubtrocken, 100 ist völlig durchnässt.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Rot bei Trockenheit, grün bei ausreichender Feuchtigkeit, blau bei Nässe.
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Arduino-Playground