domingo, 12 de abril de 2020

Control de Invernadero mediante Telegram

He adaptado el montaje que tenía desde hace años (aqui) para mi nueva vivienda, ahora ya no necesito medir el tanque de gasoil porque utilizo gas natural, así que los registros han cambiado un poco (ThingSpeak).
De todas maneras sigue registrando los datos desde hace casi cinco años y se pueden descargar para analizar.
Una vez instalado, se me ocurrió que podría adaptarlo para controlar el estado del invernadero de mi amigo Fontao, tomando una lectura de temperatura + humedad interior, y temperatura + presión atmosférica en el exterior.
Además tiene la funcionalidad de activar una salida en remoto, que se puede utilizar para abrir puertas de ventilación o activar un extractor, o quizá el riego, lo que se quiera.
En esta ocasión he elegido la versión más sencilla del ESP8266, el ESP-01:
Sólo tiene ocho pines, de los que cuatro se utilizan para la alimentación y estado del micro, así que sólo nos quedan 4 pines para utilizar, dos de ellos se usan para las comunicaciones I2C, con la sonda de temperatura y presión, BMP180, que es el sensor que irá en el exterior del invernadero.

Nos quedan dos pines libres, uno de ellos lo vamos a utilizar para conectar el sensor de temperatura y humedad que irá en el interior del invernadero, el DHT-22:
Y con el que nos queda, alimentamos un módulo de relé a través de un transistor, con lo que no quedan pines libres.
El esquema sería este:





El sistema recoge los datos de los sensores y cada 5 minutos los sube a la página de ThinkSpeak del Invernadero, donde se almacenan y se representan según se configure, además tambien hace una predicción meteorológica según el algoritmo Zambretti como en en mi montaje anterior.
Para esta predicción, el único dato que no captura el sistema es la velocidad y dirección del viento, que es necesario para el cálculo, entonces se obtiene de Openweather.org, a través de su API configurada para esa zona.

Foto de la versión de prototipo, con las sondas sobre el mismo circuito (sin relé).


Para el control remoto, esta vez he optado por la comunicación mediante mensajes, de manera que  te puedes comunicar con el sensor, le envías mensajes y te contesta o ejecuta la orden.


De esta manera se simplifica el sistema, no hay que programar ni instalar ninguna app nueva en el móvil y se hace mucho más sencillo que la versión anterior que funcionaba dentro de ThinkSpeak mediante un TalkBack, pero se hacía mucho más lento, no sólo porque había que entrar con usuario y contraseña, sino porque sólo verificaba si había un comando pendiente de ejecución cuando se conectaba a ThinkSpeak, que era cada 3 minutos.
Y no creo que sea menos seguro este método, tanto el tráfico dentro de Telegram como el acceso del micro a la API, son seguros, además de nunca accede a tu móvil, sino a un Bot de Telegram que representa al micro y que se crea con la API de Telegram.

En este enlace os dejo el código y las librerías necesarias.

El programa ha pasado por varias versiones, principalmente porque las diferentes combinaciones de librerías necesarias no siempre compilaban, las que incluyo son las que están probadas.
Sobre todo las librerías de Telegram, hay muchas por ahí pero no todas funcionan, algunas no compilan, otras se cuelgan en cuanto se suben al micro, otras ni siquiera arrancaban, etc.

Como decíamos más arriba, la comunicación con el micro se hace a través de un Bot de Telegram, este Bot tiene unos comandos definidos que son los que reconoce el micro:

datos - Te devuelve las lecturas actuales del sistema.
arranca - Orden para activar la salida.
para - Orden para desactivar la salida.
config - Muestra los datos de configuración guardados.
setdht - Permite introducir un ajuste en la lectura de la sonda de temperatura INTERIOR (DHT).
setbmp - Permite introducir un ajuste en la lectura de la sonda de temperatura EXTERIOR (BMP). 
setmaxtempint - Temperatura a la cual se enviará un mensaje de alarma de ALTA temperatura en el INTERIOR.
setmintempint - Temperatura a la cual se enviará un mensaje de alarma de BAJA temperatura en el INTERIOR.
setmaxtempext - Temperatura a la cual se enviará un mensaje de alarma de ALTA temperatura en el EXTERIOR.
setmintempext - Temperatura a la cual se enviará un mensaje de alarma de BAJA temperatura en el EXTERIOR.

Como se puede ver en la lista de comandos, hay una serie de valores que han de guardarse en memoria EEPROM de manera que no se borren cada vez que se apague el micro, y esto es lo que hace el programa, lo guarda en EEPROM y lo recupera cuando se arranca.
Esto es particularmente importante para los valores de calibración de las sondas, los setdht y setbmp son los valores del offset de las sondas, en este caso las hemos calibrado en una solución de hielo y agua y tiene los valores guardados en la EEPROM pero cuando se cambien las sondas (porque la BMP tiene ya cinco años y no me da mucha confianza), habrá que modificar esos valores.

Los datos de alarmas también se guardan en la EEPROM, por lo demás, el programa es el mismo que en la versión anterior, hace una lectura secuencial de 30 valores de cada sonda, las ordena de menor a mayor, descarta las 10 más altas y las 10 más bajas y calcula la media de las 10 lecturas centrales.

En esta versión comprueba frecuentemente si tiene mensajes y actúa en consecuencia, si se produce una condición de alarma envía el mensaje correspondiente y si tiene que actuar sobre la salida, activa el relé a través del transistor.

Hay muchas posibilidades con este montaje, por ejemplo se podría hacer que las condiciones de alarma actúen sobre la salida (como un termostato, con la diferencia de que el valor de consigna se puede poner en remoto a través de un mensaje) pero en esta ocasión no hace falta ya que actuará como un supervisor de un termostato físico que ya existe.

En fin, vamos a ver cómo se desenvuelve en esta nueva vida en su nueva ubicación y cómo hay que evolucionarlo.