sábado, 12 de diciembre de 2015

Caldera WiFi

  Una caldera de Gasoil debe ser uno de los aparatos menos tecnológicos que quedan, pero como está tan de moda lo de "Internet de las cosas", vamos a darle un poco de inteligencia a la vieja caldera.
  Después de mucho tiempo invertido en el sistema de control de la caldera de Gasoil, varias entradas en este blog (aquí la última parte) y un montón de cacharros conectados para, al final, abandonarlo despues de casi dos años, vuelvo con un nuevo intento.
  Un sistema mucho más sencillo que se basa en una página web "Internet of Things" donde se registran todos los datos recogidos de la caldera y que simplifica muchísimo el sistema.
  En esencia es un microcontrolador con conexión wifi y tres sensores, como no hay cables para la conexión de red, todo es más sencillo y más limpio.
  Se trata de un ESP8266, un micro potente y capaz que en un encapsulado realmente pequeño integra, además de varios de los periféricos de un arduino, la capacidad de acceder a redes WiFi sin conectar hardware adicional, además se puede programar desde el IDE de Arduino, instalando una extensión como se explica aquí, lo que abre un montón de posibilidades.

  Esta historia empezó con el objetivo de tener la posibilidad de poder encender o apagar la caldera en remoto, desde el móvil o desde cualquier sitio con acceso a internet, pero una vez vistas las posibilidades que ofrece el cacharro junto con la página de ThingSpeak, se convirtió en algo mucho más completo, resumen de características:

  • Medición contínua del nivel de combustible, con envío de email automáticamente cuando se alcanzan unos niveles determinados.
  • Medición de:
    • Temperatura exterior.
    • Nivel de humedad relativa exterior.
    • Presión atmosférica.  
  • Capacidad de arranque/paro remoto.
  Además de las capacidades que añade ThingSpeak de registrar todos los datos que se le envien desde el micro, tenemos algunas variables adicionales calculadas en la nube y otras consultadas como la velocidad de viento, así tenemos:
  • Sensación térmica (calculada según la temperatura y la velocidad del viento).
  • Punto de rocío (calculada en base a la temperatura y humedad).
La velocidad del viento la consulto a Openweather.org programando un request ThngHTTP desde la página de Thingspeak.



   Al utilizar ThingSpeak no hace falta ni el reloj en tiempo real ni la tarjeta SD para guardar las lecturas, la plataforma en la nube que es ThingSpeak ya se ocupa de asociar a cada lectura la fecha y la hora correspondiente y de guardar las lecturas, según ellos sin límite de espacio (sí hay un límite en cuanto a la frecuencia de refresco que no puede ser en intervalos menores de 15 segundos).
  Hay un acceso público con algo menos de información aquí, donde podéis consultar datos en tiempo real y ver la temperatura o humedad en la Sierra antes de venir.

  Montaje:


  El ESP-12 (la versión del ESP8266 que estoy usando) es realmente pequeño, tanto que los pines están a menor distancia que la normal en los zócalos de circuitos integrados o de las protoboard, con lo que hay que buscar una forma de adaptarlo, yo utilicé una fila de pines estándar por cada lado soldados con unos trocitos de cobre, de los que se recortan de resistencias o condensadores.
Mide aproximadamente centímetro y medio por dos y medio.

  Una vez tenemos ya los pines  a la distancia estándar, ya lo podemos pinchar en la placa de prototipos y empezar a hacer pruebas:
  

  Como se puede ver en el prototipo hay varios sensores que pueden medir temperaturas, pero sólo se utiliza el BMP-180 para presión y temperatura, después de tener varios funcionando en paralelo, descarté el DS18b20, el DHT se utiliza sólo para la lectura de humedad, ya que su resolución de temperatura es muy pobre.
  El sensor de distancia por ultrasonidos se pone en la boca de llenado del tanque y nos mide la distancia hasta la superficie, con lo que podemos calcular la capacidad restante, está instalado como describía hace más de dos años aquí, y por cierto, está impecable, no le ha afectado ni la corrosión, ni los vapores del gasoil, ni nada parecido como se decía en algún comentario.
  Como este sensor funciona a 5V (el resto funcionan a 3,3V) necesitamos un divisor de tensión en su salida para adaptarlo a los niveles de entrada del ESP, que son las dos resistencias en la linea Echo del sensor.
  Los sensores de temperatura, humedad  y de presión atmosférica están, obviamente, en el exterior, al igual que el del tanque de gasoil que está en el trastero, todo cableado con un único cable UTP.
La placa ya funcionando.

Esquema:




Programa:


El programa está estructurado en funciones, dentro de la función principal, loop, se hace una lectura de cada sensor a través de una función de filtro, llamada medaianamodal, que hace 30 lecturas del sensor correspondiente, las ordena, descarta las de los extremos y calcula la media aritmética de los 10 valores centrales.
 Luego se comprueba el tiempo que ha pasado desde la última actualización y si han pasado más de 3 minutos, se llama a la función que sube los datos a ThingSpeak, además se comprueba si el nivel de combustible llega a unos valores que son:
   500l, envía un correo simplemente diciendo el nivel y las lecturas actuales.
   300l, envía un correo avisando de que el nivel está al 30%.
   200l, envía correo con el nivel al 20%.
   100l, envía correo avisando que queda un 10% y pidiendo repostar.
   50l, envía correo avisando que queda un 5% y pidiendo repostaje URGENTE.

  La rutina para enviar el correo está basada en la de jeanotP1314, en Instructables, Gracias por compartirlo, es un trabajo fantástico.
   Se comprueba si hay algún comando para ejecutar con la función getTalkBack() y se actúa sobre la salida que alimenta el relé.
  Y eso es todo el loop, el resto son funciones para ejecutar las acciones comentadas.

   El programa os lo dejo aquí.

  Hay una parte de programa que vive en la nube, es el programa que consulta la velocidad del viento en Openweathermap.org, calcula los datos de punto de rocio y sensación térmica y graba los datos en los canales correspondientes, es un programa de Matlab Analisys que os dejo en un archivo de texto aquí para copiar y pegar.
  Hay además una temporización, un TimeControl como le llaman en ThingSpeak que ejecuta el análisis cada 20 minutos.
  Por cierto, el cálculo de la sensación térmica está basado en la fórmula que os dejo en esta hoja excell, y que se puede imprimir para ver de un vistazo la sensación térmica.

Programa, esquema y demás aquí.

Conclusión:

  El utilizar una plataforma de almacenamiento en la nube como ThingSpeak, facilita mucho estos proyectos, además tiene varias funcionalidades que se pueden utilizar para ejecutar acciones cuando se den unas condiciones, p.e que la temperatura alcance un valor o cuando pase un tiempo determinado, para analizar los datos, etc.
  Por supuesto el montaje se puede utilizar para otras cosas, en este caso es una caldera pero igualmente se puede controlar un aire acondicionado, se puede utilizar otras salidas adicionales o podemos utilizar otros comandos, como veis en el programa, los comandos son cadenas de texto, no simplemente unos o ceros, con lo cual podemos enviar p.e. un comando que indique la temperatura que queremos y que el sistema funcione como un termostato, o un comando que indique el tiempo que queremos que esté encendida, o... las posibilidades son infinitas.
  Otra cosa que se puede hacer muy fácilmente es que el correo de aviso de nivel de combustible se envie directamente al proveedor para que venga a reponer, o que se genere un correo de alarma en caso de que se den otras circunstancias.
  En fin, se abren un montón de posibilidades.


13 comentarios:

  1. A veces das miedo
    Un trabajo de investigación muy bueno y un resultado obtenido tremendamente útil
    Mis felicitaciones

    ResponderEliminar
  2. Enhorabuena, Miro, por tu trabajo, que nos inspira a otros aficionados a los inventillos a seguir experimentando. Un saludo.

    ResponderEliminar
  3. Hombre! No sabía que fueras tb de mi tierra, saludiños! Impresiona tu trabajo :)

    ResponderEliminar
  4. Muy bueno Miro, tu si que sabes lo que es I+D+i.
    Saludos de un amigo,
    Julio

    ResponderEliminar
  5. Hola, saludos, enhorabuena por la currada que te has pegado, eres un crack...una consulta si es posible, ¿cómo le indicas al relé que se active?, si quieres que la caldera se encienda cuando tú lo decides, ¿cómo se lo haces llegar al ESP8266?

    Gracias y un saludo.

    ResponderEliminar
    Respuestas
    1. Hola, muchas gracias, en realidad no se le indica que se active directamente, lo que hace es ejecutar una rutina que consulta a thingSpeak si hay alguna orden para él, y si la hay la ejecuta, tanto encender como apagar, por eso no es instantáneo, tarda un ratillo.
      Cuando pulsamos el botón se ejecuta una función TalkBack en ThingSpeak que guarda la orden hasta que el ESP consulta y cuando le entrega la orden, la borra a la espera de la siguiente orden.
      Ejecuta esa rutina una vez por ciclo de refresco de todos los sensores, se podría hacer la consulta con mucha mayor frecuencia para que pareciese instantáneo, pero para esta aplicación es más que suficiente.
      Saludos.

      Eliminar
  6. Hola y gracias por la respuesta, finalmente he conseguido hacer una lectura de temperatura y enviarla a thingspeak y a la vez poder enviar desde mi teléfono una orden para activar o desactivar la patilla gpio0. Todo ello con el IDE de arduino en el esp8266, así que termostato por 4 euros, una maravilla....lo que hago es monitorizar la temperatura y activar la caldera desde el móvil vía Internet, luego el programa me gestiona la temperatura y arreglado. El único inconveniente es que hay que programar una temperatura fija, pero en Valencia en invierno con dejar la calefacción en 23 grados sobra....pero de nuevo gracias por tu currada y por tu pronta respuesta, un saludo.

    ResponderEliminar
  7. Hola. Estoy empezando a jugar con ThinSpeak y quedé maravillado con lo que pudiste hacer. Estoy ahora mismo empezando a entender como funciona y sus usos con MatLab. Pero me atasco con cosas que deben ser muy elementales, por ejemplo con el comando thingSpeakWrite ()me funciona de forma muy caprichosa sin modificar mis parámetros: a veces va y a veces no, no se si es por que utilizo una cuenta gratuita y me limita a pocas acciones por día.

    ResponderEliminar
  8. Hola. Estoy empezando a jugar con ThinSpeak y quedé maravillado con lo que pudiste hacer. Estoy ahora mismo empezando a entender como funciona y sus usos con MatLab. Pero me atasco con cosas que deben ser muy elementales, por ejemplo con el comando thingSpeakWrite ()me funciona de forma muy caprichosa sin modificar mis parámetros: a veces va y a veces no, no se si es por que utilizo una cuenta gratuita y me limita a pocas acciones por día.

    ResponderEliminar
    Respuestas
    1. Hola Jorge,
      La cuenta que yo utilizo es gratuita y funciona perfectamente.
      Recuerdo que cuando lo programé había un límite máximo de datos a escribir por intervalo, pero para el uso que yo le doy era más que suficiente.
      Mira ese punto en la documentación de ThingSpeak por si acaso.
      El mio lleva funcionando casi tres años sin un problema.
      Muchas gracias.

      Eliminar
  9. Hola Miro,
    Después de muchas horas, he llegado a entender el funcionamiento y a hacer que el sistema haga lo que yo quiero y no lo que el quiere.
    El problema con thingSpeakWrite () es que si por probar un Matlab que no funcionaba vuelvo a ejecutarlo desde Matlab Analysss y este sobreescribe de nuevo el vector de salida con los mismos datos de tiempo, me daba ese error.

    El otro fallo que tenia es que quise montar una estación meteorológica autónoma, que cargara una batería 18650 con un pequeño panel solar, pero en un periodo comprendido entre 2 horas y 4 días se quedaba la CPU colgada y vaciaba la batería en unas 6 horas. Para que consumiera menos, hacia que el ESP8266 entrara en modo sleep por 10 minutos. Después de muchas pruebas descubrí que si utilizaba en el mismo sketch la librería normal del ESP8266 para subir datos a ThingSpeak con GET y el modo sleep, se producía el cuelgue. Todo se solucionó cuando empecé a utilizar la librería propia de ThingSpeak para subir los datos a su aplicación. Esta librería no interfiere con el modo sleep y lleva meses sin colgarse. Entiendo que ambas librerías deben interferirse entre ellas con el uso del temporizador interno para el modo sleep.

    Muchas gracias por tu aportación, ya que permites a los demás que podamos aprender de ti y ver la resolución de posibilidades que intuíamos pero no sabíamos realizar.

    ResponderEliminar
  10. Simplemente GRACIAS.
    Todavía no he llegado a procesar toda la información que aportas pero me abre muchas posibilidades.
    Es toda una currada. Gracias por compartirla.

    ResponderEliminar