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)


1
2
3
4
5
6
7
8
9
10
11
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():


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 gabinete

Este articulo es una continuación del articulo anterior del Sistema de riego, si quieren saber más, dejo el link al mismo: Sistema de riego sencillo.

No quería demorarme mucho en armar el gabinete por lo que recurrí a los elementos que tenia en casa, la primicia era: rápido, barato y fácil.

Con esto en mente opte por utilizar un gabinete de una fuente que ya no funcionaba y montar todos los elementos sobre un fibrofacil de unos 3mm (o podrían ser 4, no lo medí).

Tome las dimensiones del interior del gabinete: 130mm x 145mm.

Corte una sección del fibrofacil con la ayuda de una regla y un cutter, creo que de utilizar alguna herramienta de corte más fuerte lograría desgarrar el fibrofacil.

Luego ubique los pcb sobre el mismo (la ubicación es completamente arbitraria y responde a como creí que quedaría mejor) y comencé a marcar las ubicaciones donde seria necesario realizar los agujeros con el taladro.

Para hacer los agujeros me ayude con un sobrante de madera para ubicarlo por debajo del fibrofacil, así evitaba que se abriera del otro lado y quedara más prolijo.

Si vieron el video se habrán dado cuenta que cometí el error de primero montar el fibrofacil y luego atornillar sobre el mismo la electrónica; es mas sencillo si primero se monta la electrónica sobre el fibrofacil y luego se introducen el bloque completo dentro del gabinete.

Atornille desde abajo el gabinete al pcb.

En este punto simplemente debemos conectar las placas siguiente el esquema anterior. Tener en cuenta de que los cables de la bomba de agua deben salir del gabinete, al igual que los del sensor de humedad.

Un tema a tener en cuenta: en el cable que lleva la alimentación al modulo step down conviene marcar cual es el positivo (en mi caso utilice un cable totalmente blanco que no tiene marcas).

Para evitar que el cable de la bomba de agua se corte por el filo del gabinete utilice cinta aisladora.

Utilice este tipo de conector para no tener que cortar el cable de la fuente.

El gabinete completo, su aspecto exterior no dista mucho de una fuente ATX convencional.