Menu
CoddyTech

Monitor de plantas: alarma de sequedad

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

Cuando la tierra permanece seca, el monitor pide ayuda con el zumbador del pin 8. No de inmediato: una lectura puede bajar por un momento, y una alarma que se activa sin motivo pronto se ignora. La regla es que esté seca durante más de 5 segundos (una planta real esperaría horas).

Para saber cuánto tiempo lleva seca la tierra, anota el momento en que se secó. Eso requiere una pieza más de memoria: si estaba seca en la última lectura.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // acaba de secarse
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

El else es importante: cuando se riega la tierra, wasDry vuelve a false, así que el siguiente período seco se mide desde su propio comienzo.

loop() lee una vez por segundo, así que el pitido de 200 ms suena una vez por segundo mientras la tierra permanece seca.

challenge icon

Desafío

Intermedio

Añade la alarma de sequedad:

  • recuerda si la tierra estaba seca (bool wasDry) y cuándo se secó (unsigned long dryStart)
  • cuando haya estado seca durante más de 5000 ms, reproduce tone(buzzerPin, 880, 200) después de cada lectura
  • cuando esté al 30 % o más, vuelve a establecer wasDry en false

Pulsa Run, gira el mando hacia abajo y espera; después, pulsa 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 humedad en porcentaje: 0 es completamente seco, 100 es muy húmedo.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Rojo cuando está seco, verde cuando la humedad es adecuada y azul cuando 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);
  }
}

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 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