Menu
CoddyTech

Monitor de plantas: informe

Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 20 de 24.

El último paso escribe un informe una vez por segundo: la humedad y una palabra de estado, DRY, OK o WET. Se muestra en la LCD para cualquiera que esté junto a la planta, y en el monitor Serial para una computadora.

La LCD está conectada de la manera habitual: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); y lcd.begin(16, 2) en setup(). La fila superior muestra Moisture: 42% y la fila inferior muestra la palabra.

En el monitor Serial, la palabra termina en la misma línea que la humedad, así que imprime la humedad con Serial.print(), no con println(). Después, elige la palabra usando los tres rangos de la luz de estado e imprímela en ambos:

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");
}

Fíjate en los caracteres anteriores. OK es más corto que DRY, así que imprime "OK " con un espacio, o la pantalla mostrará OKY. Lo mismo ocurre cuando 100% se convierte en 5%: imprime un par de espacios después del %.

challenge icon

Desafío

Intermedio

Escribe el informe una vez por segundo:

  • configura la pantalla LCD (pines 12, 11, 5, 4, 3, 2) en setup()
  • fila superior: Moisture: 42%, con espacios después
  • fila inferior: DRY por debajo del 30%, OK del 30% al 70%, WET por encima del 70%, rellenada con espacios
  • monitor Serial: una línea como Moisture: 42% OK

Conserva la luz de estado y la alarma. Pulsa Run y después Check.

Pruébalo tú mismo

// La perilla hace las veces de sensor de humedad del suelo
const int sensorPin = A0;
// La luz de estado: un LED RGB
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;
// La alarma
const int buzzerPin = 8;

bool wasDry = false;         // ¿estaba seco el suelo en la última lectura?
unsigned long dryStart = 0;  // cuándo se secó

// La humedad en porcentaje: 0 es completamente seco, 100 es empapado.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Rojo si está seco, verde si está bien, azul si está húmedo.
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);
  }
}

// Emite un pitido una vez por segundo cuando el suelo lleva seco más de 5 segundos.
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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Arduino