Sistema de riego sencillo: el código

En artículos anteriores (Sistema de riego sencillo y el gabinete) fuimos construyendo paso a paso un sistema de riego automatizado para una maceta; en este articulo entraremos en detalle sobre el software utilizado para controlar el hardware.

El software se puede encontrar en el repositorio:
https://github.com/gsampallo/IrrigationSystem

El software se compone de dos partes:

  1. El software que corre en el NodeMCU, que se conecta a un servidor broker, publica cada 5 segundos el valor de la humedad y esta suscrito a un tema, al recibir un valor activa la bomba de agua por unos pocos segundos y al recibir otro valor la apaga.
  2. El software que corre del lado del servidor: lee el valor de la humedad y una vez al dia activa la bomba.

Sobre el software que corre en el nodemcu, solo copio los fragmentos que considero más interesantes:
La función callback (procesa los mensajes que llegan)

void callback(char* topic, byte* payload, unsigned int length) {

  if (((char)payload[0] == '1')) {
    estadoValvula = true;
    inicioRiego = millis();
  } else if (((char)payload[0] == '2')) {
    Serial.println("Se detiene el riego");
    estadoValvula = false;
    digitalWrite(pinValvula,HIGH);
  }
}

Al recibir el valor 1 en el mensaje cambia el estado a true de la variable global de estadoValvula y asigna a inicioRiego el valor de millis(); esto ultimo es para poder calcular cuanto tiempo estuvo activo el relay que prende la bomba de agua.

Sobre la funcion loop():

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop(); 

  if(estadoValvula) {
    if ((millis() - inicioRiego) < finRiego) {
      digitalWrite(pinValvula,LOW);
      Serial.println("Regando");
    } else {
      digitalWrite(pinValvula,HIGH);
      estadoValvula = false;
      Serial.println("Se detiene el riego");
      client.publish("MACETA","2"); 
    }
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    lastDebounceTime = millis();
    int humedad = analogRead(A0);
    snprintf (msg, 75, "%ld", humedad);
    
    client.publish("HUMEDAD",msg);  
  }
}

Tenemos el primer bloque de código donde si el cliente esta desconectado del servidor broker, vuelve a conectarlo por medio de la funcion reconnect() y luego procesa los mensajes del servidor broker (client.,loop).

El segundo bloque de código evalúa la variable estadoValvula, si es true, determina si paso o no el tiempo establecido en finRiego (por defecto son 5 segundos), si aún no transcurrieron los 5 segundos mantiene activo el relay, caso contrario apaga el relay, cambia el estado de la variable estadoValvula y publica en el tema «MACETA» el valor 2.

Esto ultimo es para que los dispositivos que están utilizando ese tema para activar la bomba o no, pueda saber que se apago y cambien el estado de su interfaz (útil para la app MQTT Dash).

El ultimo bloque de código es para publicar el valor del sensor de humedad cada 5 segundos.

Más adelante modificare el código para que el tiempo de riego y de publicación sean parámetros que los tome de la nube y el valor de la humedad se vea reflejado en un canal de ThingSpeak.

Sistema de riego sencillo

El objetivo es construir un sencillo sistema de riego, que monitoree la humedad de la tierra de una maceta y riegue la misma una o dos veces al día.

En una primera instancia vamos a construir la electrónica y escribir un sencillo programa para controlar el flujo de agua, el sensor de humedad solo va a reportar el valor y lo utilizaremos de referencia para junto con un monitoreo a ojo de la tierra poder calibrar y saber los valores necesarios.

El circuito es sencillo, tenemos:

  • Un NodeMCU como cerebro de la operación.
  • Un sensor capacitivo de suelo.
  • Un relay para controla la bomba de agua.
  • Para la alimentación utilizaremos una fuente de 12v , y un modulo step down para bajar el voltaje a 5v; mas que suficiente para el NodeMcu y la bomba de agua.
Un diagrama básico de como va conectado todo.

Respecto del software, la forma de trabajar sera la siguiente:
– Los datos del sensor lo enviaremos a un servidor broker y a un canal de Thingspeak.
– El dispositivo se conectara a un servidor broker y estaría suscrito a un tema, al recibir el mensaje para activa la bomba, activa el relay durante un periodo de tiempo; este periodo se ira ajustando segundo lo que observemos que seria lo adecuado.

La idea de utilizar un relay se debe a que más adelante podríamos utilizar un válvula solenoide para manejar un mayor caudal de agua.

En el siguiente repositorio se encuentra la primera versión del programa:
https://github.com/gsampallo/IrrigationSystem

Dentro de la carpeta server, se encuentra el script para encender la bomba de agua.

Este es un proyecto en desarrollo por lo que en breve habrá mas noticias.