Menu
CoddyTech

Monitor della pianta: rapporto

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

L'ultimo passaggio scrive un rapporto una volta al secondo: l'umidità e una parola di stato, DRY, OK o WET. Viene mostrato sul display LCD per chiunque si trovi vicino alla pianta e sul monitor seriale per un computer.

Il display LCD è collegato nel modo consueto: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); e lcd.begin(16, 2) in setup(). La riga superiore mostra Moisture: 42% e quella inferiore la parola.

Sul monitor seriale la parola termina sulla stessa riga dell'umidità, quindi stampa l'umidità con Serial.print(), non con println(). Poi scegli la parola usando i tre intervalli della spia di stato e stampala su entrambi:

if (moisture < 30) {
  lcd.print("DRY");
  Serial.println("DRY");
} else if (moisture <= 70) {
  lcd.print("OK ");
  Serial.println("OK");
} else {
  lcd.print("WET");
  Serial.println("WET");
}

Fai attenzione ai caratteri precedenti. OK è più corto di DRY, quindi stampa "OK " con uno spazio, altrimenti sullo schermo appare OKY. Lo stesso vale se 100% diventa 5%: stampa un paio di spazi dopo il %.

challenge icon

Sfida

Medio

Scrivi il report una volta al secondo:

  • configura l’LCD (pin 12, 11, 5, 4, 3, 2) in setup()
  • riga superiore: Moisture: 42%, con spazi dopo
  • riga inferiore: DRY sotto il 30%, OK dal 30% al 70%, WET sopra il 70%, con spazi di riempimento
  • monitor seriale: una riga come Moisture: 42% OK

Mantieni la spia di stato e l’allarme. Premi Esegui, poi Verifica.

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'allarme
const int buzzerPin = 8;

bool wasDry = false;         // il terreno era asciutto all'ultima lettura?
unsigned long dryStart = 0;  // quando il terreno è diventato asciutto

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

// Rosso quando il terreno è asciutto, 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);
  }
}

// Emetti un segnale acustico ogni secondo quando il terreno è asciutto da più di 5 secondi.
void checkAlarm(int moisture) {
  if (moisture < 30) {
    if (wasDry == false) {
      wasDry = true;
      dryStart = millis();
    }
    if (millis() - dryStart > 5000) {
      tone(buzzerPin, 880, 200);
    }
  } else {
    wasDry = false;
  }
}

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);
  checkAlarm(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