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.
Sfida
MedioAggiungi 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
wasDrysufalse
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);
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Progetti
2Gioco di reazione
Gioco di reazione: attesa casualeGioco di reazione: timerGioco di reazione: falsa partenzaGioco di reazione: tempo migliore5Monitor della pianta
Monitor della pianta: umiditàMonitor della pianta: spia di statoMonitor della pianta: allarme di secchezzaMonitor della pianta: rapportoEsercitati da solo: Playground Arduino