Menu
CoddyTech

Monitor rośliny: alarm o przesuszeniu

Część sekcji Projekty ścieżki Arduino w Coddy. Lekcja 19 z 24.

Gdy gleba pozostaje sucha, monitor wzywa pomoc brzęczykiem podłączonym do pinu 8. Nie od razu: odczyt może na chwilę spaść, a alarm, który włącza się bez powodu, szybko zostaje zignorowany. Zasada jest taka: sucho przez ponad 5 sekund (prawdziwa roślina poczekałaby kilka godzin).

Aby wiedzieć, jak długo gleba jest sucha, zanotuj moment, w którym stała się sucha. Potrzebna jest do tego jeszcze jedna informacja: czy podczas poprzedniego odczytu gleba była sucha.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // Właśnie stało się sucho
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

else ma znaczenie: gdy gleba zostanie podlana, wasDry wraca do wartości false, więc czas kolejnego okresu suszy jest liczony od jego początku.

loop() wykonuje odczyt raz na sekundę, więc sygnał dźwiękowy trwający 200 ms rozlega się raz na sekundę, dopóki gleba pozostaje sucha.

challenge icon

Wyzwanie

Średni

Dodaj alarm informujący o suchości:

  • zapamiętaj, czy gleba była sucha (bool wasDry) i kiedy stała się sucha (unsigned long dryStart)
  • gdy gleba jest sucha od ponad 5000 ms, odtwarzaj tone(buzzerPin, 880, 200) po każdym odczycie
  • gdy wilgotność wynosi 30% lub więcej, ustaw wasDry z powrotem na false

Naciśnij Run, przekręć pokrętło w dół i poczekaj, a następnie naciśnij Check.

Spróbuj swoich sił

// Pokrętło zastępuje czujnik wilgotności gleby
const int sensorPin = A0;
// Kontrolka stanu: dioda LED RGB
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// Wilgotność w procentach: 0 oznacza zupełnie sucho, a 100 — bardzo mokro.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Czerwony, gdy jest sucho, zielony, gdy wilgotność jest odpowiednia, niebieski, gdy jest mokro.
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Projekty

Poćwicz samodzielnie: Edytor online Arduino