Menu
CoddyTech

Monitor della pianta: allarme di secchezza

Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 19 di 24.

Quando il terreno rimane asciutto, il monitor chiede aiuto con il cicalino sul pin 8. Non subito: una lettura può calare per un momento e un allarme che scatta senza motivo viene presto ignorato. La regola è che rimanga asciutto per più di 5 secondi (una pianta vera aspetterebbe ore).

Per sapere da quanto tempo il terreno è asciutto, annota il momento in cui è diventato asciutto. Serve un altro elemento di memoria: sapere se era asciutto all’ultima lettura.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // è appena diventato secco
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

L’else è importante: quando il terreno viene annaffiato, wasDry torna a false, così il periodo di siccità successivo viene cronometrato a partire dal suo inizio.

loop() legge una volta al secondo, quindi il segnale acustico di 200 ms suona una volta al secondo mentre il terreno rimane asciutto.

challenge icon

Sfida

Medio

Aggiungi l'allarme per il terreno secco:

  • ricorda se il terreno era secco (bool wasDry) e quando è diventato secco (unsigned long dryStart)
  • una volta che è rimasto secco per più di 5000 ms, riproduci tone(buzzerPin, 880, 200) dopo ogni lettura
  • quando è al 30% o più, reimposta wasDry su false

Premi Run, abbassa la manopola e attendi, poi premi Check.

Provalo tu

// La manopola simula un sensore di umidità del terreno
const int sensorPin = A0;
// La spia di stato: un LED RGB
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// L'umidità in percentuale: 0 indica un terreno completamente secco, 100 un terreno completamente bagnato.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Rosso quando è secco, verde quando l'umidità è adeguata, blu quando è bagnato.
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Progetti

Esercitati da solo: Playground Arduino