Icono del sitio Programar fácil con Arduino

Estación meteorológica solar con Arduino y Sigfox

En este artículo te voy a contar cómo puedes hacer una estación meteorológica solar con Arduino y Sigfox paso a paso.

La idea es poder desarrollar un dispositivo capaz de medir la temperatura y la humedad con un sensor DHT22, enviar lo datos a Sigfox y a una plataforma en la nube y poder monitorizar la información desde el móvil gracias a la app Blynk y a Node-RED.

Cuando acabes este tutorial serás capaz de entender los pasos que hay que seguir para crear un prototipo de un dispositivo orientado al IoT y así poder probar tus ideas.

Las tecnologías libres como Arduino y Node-RED, así como la red de datos Sigfox, nos permiten hacer prototipos muy rápidamente y de una forma muy sencilla.

Ponte cómodo y prepara una buena taza de café para comenzar este tutorial paso a paso para desarrollar tu propia estación meteorológica solar con Arduino y Sigfox.

Idea general estación meteorológica

La idea detrás de este proyecto es poder hacer una estación meteorológica totalmente independiente que pueda enviar los datos de temperatura y humedad a través de la red Sigfox.

A parte de no depender de configuraciones de red, también tiene que ser independiente en cuanto a la alimentación. Para ello, el dispositivo dispondrá de un panel solar y una batería LiPo.

El material necesario para fabricar este proyecto es el siguiente:

A parte se recomienda tener una carcasa adecuada que dependerá de dónde quieras situar la estación meteorológica con Arduino.

Por ejemplo, yo he utilizado esta carcasa que puedes encontrar en Thingiverse.

Aunque no tengo impresora 3D, he utilizado el servicio de BitFab de Diego Trapero para imprimirla.

También puedes utilizar una caja estanca si tu intención es dejarlo a la intemperie. Cualquier caja de registro es válida. Realmente esto no es lo importante, lo importante es la electrónica y la programación que veremos a continuación :)

Antes de entrar a ver cómo conectar todos los componentes déjame presentarte el esquema general de la estación meteorológica con Arduino.

Esquema general

Este esquema te da una perspectiva general de todo el proyecto y sobre todo, de las partes que se ven involucradas.

Desde la placa de Arduino MKRFOX 1200 se obtiene la temperatura y la humedad del sensor DHT22. Esta información se envía al backend de Sigfox.

En la nube de Sigfox se configura una callback que llama a la plataforma en la nube para el IoT ThinerIO. Hay que configurar esta plataforma para recibir la información.

ThingerIO se utiliza sólo para almacenar información. El tratamiento de los datos se hace desde Node-RED ya que es mucho más sencillo. Node-RED puede ir instalado en una Raspberry Pi o incluso puedes utilizar el que proporciona ThingerIO.

De momento la versión actual de ThingerIO no tiene una instancia de Node-RED pero según conversaciones con el soporte de la plataforma, la nueva versión incluirá una instancia de Node-RED.

El objetivo es el mismo, tratar esos datos para mostrarlos en una aplicación móvil como Blynk y en el dashboard de Node-RED.

Y este sería el esquema general de la aplicación completa. Ahora iremos viendo parte por parte hasta conseguir que todo funcione como si se tratara de un sistema de engranajes.

Vamos a empezar viendo el esquema eléctrico del dispositivo.

Esquema eléctrico estación meteorológica solar con Arduino y Sigfox

Este sería el esquema eléctrico del que tienes que partir. Aquí están todos los componentes que he enumerado antes.

En los siguientes apartados vamos a ir viendo parte por parte el esquema eléctrico y cómo se conecta con Arduino Sigfox.

Sensor de temperatura y humedad DHT22

El sensor DHT22 permite medir la temperatura y la humedad al igual que su hermano pequeño DHT11. La diferencia es que el DHT22 es más preciso.

Las características técnicas más importantes del DHT22 son las siguintes:

CaracterísticaValor
Alimentación3,3V a 6V DC
Rango operación humedad0% a 100%
Rango operación temperatura-40ºC a 80ºC
Precisión humedad± 2 %
Precisión temperatura± 0,5 ºC
Resolución humedad0,1 %
Resolución temperatura0,1 ºC

Para conectar el DHT22 a Arduino dependerá del tipo de DHT22 que tengas. Existen diferentes formatos. El que tengo yo por ejemplo ya viene con 3 cables y se llama AM2302 y es de Adafruit.

Pero también hay otro formato de DHT22 que viene con 4 pines.

En cualquier caso, hay que hacer 3 conexiones. Si es con tres cables de color, el cable rojo es de alimentación, el cable negro GND y el cable amarillo es el de datos.

El cable rojo directamente lo puedes conectar al pin de 5V de Arduino MKRFOX 1200. Aunque ponga 5V realmente estará suministrando 3,3V que es con el valor que se alimentará la placa con la batería LiPo.

El cable negro lo debes conectar a la masa común de todos los componentes como has visto en el esquema eléctrico y el cable amarillo lo conectas a un pin digital por ejemplo el pin número 6.

Si tienes un DHT22 sin cables, tendrás 4 pines. Normalmente el pin más a la izquierda es el de alimentación irá conectado al pin de 5V. El siguiente es el de datos e irá conectado al pin número 6.

El siguiente pin no se conecta y el último pin es el que se conecta a GND.

Cómo obtener los datos de temperatura, humedad e índice de calor lo veremos en el bloque de programación. Ahora vamos a pasar a ver la conexión del TPL5110.

Temporizador TPL5110

Ya escribí un artículo bastante extenso sobre el temporizador TPL5110. Este componente básicamente lo que hace es habilitar la alimentación de la placa cada cierto intervalo de tiempo.

Una vez habilitada la alimentación, la placa Arduino MKRFOX1200 leerá la temperatura y la humedad, conectará con Sigfox y enviará los datos al backend.

Cuando terminé, enviará una señal al TPL5110 para que vuelva a cortar la alimentación. Así se mantendrá hasta que pase un tiempo configurado en el TPL5110. Durante todo ese tiempo configurable, el consumo del TPL es mínimo (del orden de μA).

Para configurar el tiempo hay que conectar al pin delay del TPL5110 una resistencia proporcional al tiempo que quieres tener apagada la placa de Arduino.

En el caso de Sigfox, en el tutorial de introducción a la placa Arduino MKRFOX 1200 explicaba que el máximo de mensajes por día son de 140 y esto equivale a enviar 1 mensaje cada 10 minutos.

En esta ocasión, para ahorrar todavía más energía he tomado la decisión de enviar un mensaje cada 15 minutos aproximadamente.

Por lo tanto, el TPL5110 se tiene que activar cada 15 minutos. Según la hoja de características técnicas, para enviar un mensaje cada ese intervalo de tiempo hay que conectar en el pin delay una resistenca de 68,424 kΩ.

En la hoja de características técnicas del TPL5110 encontrarás la fórmula para calcular la resistencia dependiendo del tiempo. No es una fórmula compleja si es algo elaborada.

Conseguir este valor de resistencia es complicado así que he optado por utilizar dos resistencias en serie de 22 kΩ y de 47 kΩ lo que equivale a una resistencia de 69 kΩ.

Esto hará que se active la alimentación cuando pasen algo más de 15 minutos.

El resto de conexiones son muy parecidas a las que hay en el artículo relacionado con el TPL5110. Sólo tener en cuenta que el pin DRV va conectado al pin Vin de la placa de Arduino, el pin Done al pin digital número 7 y el pin VDD va directamente conectado al módulo Solar LiPo Charger V1.0 que veremos a continuación.

Se recomienda la alimentación por el pin Vin en el Arduino MKRFOX 1200 si vas a utilizar baterías LiPo ya que un voltaje superior a 3V por los conectores donde se conectan las pilas puede dañar la placa. El pin Vin está conectado a un regulador de tensión que evitará que dañes la electrónica.

Cargador solar LiPo V1.0

El cargador solar LiPo o Solar LiPo Charger es un componente que tiene dos funciones. Por un lado nos permite cargar una batería LiPo de 3,7V y por otro lado nos permite alimentar una placa o un componente electrónico.

La gestión para conmutar entre alimentar o cargar la batería la hace de forma automática y utiliza un sistema de carga inteligente para no dañar la batería.

Todo lo hace con energía solar gracias a una placa solar que tenemos que conectar a dos de los conectores. La placa solar no viene incluída.

Lo primero es ver las características técnicas de este componente para saber cómo funciona, qué tipo de paneles solares podemos utilizar y qué batería podemos conectar.

CaracterísticasValor
Voltaje de entrada4,4V a 6V
Corriente de carga500 mA máximo
Voltaje de corte de carga*4,2V
Batería requeridaBatería litio de 3,7V

*Esta es la tensión por la cual el cargador dejará de suministrar corriente de carga a la batería. Las baterías LiPo se pueden dañar si se aplica tensión indefinidamente.

Gracias a esta información podemos saber que la batería que se debe utilizar es una batería LiPo de 3,7V. La carga dependerá de donde vivas. Si vives en un lugar soleado con 1.000 mAh es más que suficiente.

Asegúrate que la batería tiene un conector JST ya que es el que utiliza el cargador solar LiPo de DFRobot.

Si vives en un lugar donde los días de sol no abundan te recomiendo utilizar una batería de 2.000 mAh. Eso ya depende mucho de la climatología donde vayas a poner el dispositivo.

Por otro lado, también puedes modificar el tiempo en el que la placa está apagada cambiando la resistencia del TPL5110. Si aumentas la resistencia aumentarás el tiempo y eso hará que la batería dure más.

Aún así, ahora mismo vamos un poco a ciegas ya que no he comprobado cual es el consumo real del dispositivo. Dentro de poco hablaré de cómo podemos medir este consumo utilizando un medidor de culombios.

Ten en cuenta que cuantos más mAh más grande será la batería y más te costará acoplarla dentro de la carcasa.

El valor de voltaje de entrada (4,4V a 6V) nos indica qué panel solar debemos utilizar. Por otro lado la corriente de carga nos dice la corriente máxima para cargar la batería. Esta información también es útil para elegir el panel solar.

Sabiendo que la potencia se puede expresar como

P = V x I = 6 x 0,5 = 3W

Esto nos indica que el panel solar tiene que ser de 6V y como máximo de 3W. Si tiene menos vatios lo que sucederá es que cargará más despacio la batería aunque también depende de la corriente de carga de la propia batería.

El panel solar que tengo yo es de 6V y 2W que genera una corriente máxima de carga de 333mA.

Las conexiones son muy sencillas. En la parte que pone PWR IN tienes que conectar el panel solar. Respeta la polaridad es decir, el positivo con el positivo y el negativo con el negativo.

En el conector que pone BAT hay que conectar la batería. Se trata de un conector JST muy común en las baterías LiPo. Por último en donde pone VOUT hay que conectar el menos con el GND común del proyecto y el más con el pin VDD del TPL5110.

Y con esto ya tendríamos la alimentación del dispositivo resuelta. Aunque es mucho aventurar, en principio este sistema debería de durar indefinidamente :)

Con esta última parte finalizamos la parte de la electrónica, ahora vamos a pasar a la parte de la programación empezando por el código que hay que cargar en la placa Arduino MKRFOX1200.

Programación estación meteorológica con Arduino y Sigfox

La programación, aunque tengamos muchos componentes, va a resultar muy sencilla. Vamos a ir viendo parte por parte pero lo primero es tener una visión general de todo el programa.

Comenzamos con las librerías y las variables que vamos a necesitar.

Librerías y variables

El código comienza con la declaración de la constante DEBUG_METEO. Esta constante te permite activar o desactivar el modo debug para hacer pruebas. Básicamente lo que hace cuando se descomenta es:

Para salir del modo debug lo único que tienes que hacer es comentar la línea donde se declara la constante DEBUG_METEO.

Cuando vayas a colocar el dispositivo en su lugar final te recomiendo que deshabilites el modo debug comentando esa línea.

Las 3 siguientes líneas importan las librerías SigFox.h, DHT.h y conversions.h.

La librería SigFox.h se encarga de toda la gestión de las comunicaciones con la red de Sigfox. La librería DHT.h es la encargada de obtener temperatura, humedad e índice de calor del sensor DHT22 y la librería conversions.h es un archivo que puedes encontrar en los ejemplos de la librería SigFox.h que sirve para convertir un float en un entero de 16-bit.

A continuación se declaran las constantes para almacenar el número de pin del DHT, el número del pin del TPL5110 y los estados de la estación meteorológica.

Luego se declara un objeto de la clase DHT para gestionar el sensor DHT22 y por último unas variables para controlar el tiempo en modo debug.

Función setup()

En la función setup() vamos a hacer lo de siempre, configurar todo lo necesario para que el programa funcione.

En esta función ya empezamos a hacer uso del modo debug si está activado con las directivas del compilador #ifdef #endif. Estas directivas permiten comprobar si se ha definido la constante DEBUG_METEO.

En caso de estar definida iniciamos la comunicación serie.

Luego iniciamos el sensor DHT22 con la función dht.begin() que no admite ningún parámetro.

En la función setup() es interesante comprobar si tenemos conexión con la red Sigfox. Para iniciar esta comunicación lo único que tienes que hacer es llamar a la función SigFox.begin(). Si conecta devolverá un valor true en caso contrario devolverá false.

Comprobamos este resultado en una condicional if para que si no consigue conectar, no siga ejecutando el código. No tiene sentido seguir si no hay conexión con la red Sigfox. Aquí puede suceder dos cosas dependiendo de si estamos en modo debug o no.

En caso de estar en modo debug, mostrará un mensaje por el monitor serie y se quedará en un bucle while infinito hasta que apagues la placa o corrijas el error.

En un funcionamiento normal lo que hará es mandar el comando al TPL5110 para que corte la alimentación durante el tiempo que hayas configurado con las resistencias como vimos en el esquema eléctrico. Pasado ese tiempo volverá a ejecutar el código desde el principio y a intentar conectar con la red Sigfox.

Es importante entender esto último. Al trabajar con baterías siempre que haya algún fallo o no sea capaz de conectarse con la red Sigfox es importante apagar la placa para ahorrar el máximo de energía.

Por último, si el modo debug está activado habilitará el modo debug que incorpora la librería SigFox.h llamando a la función SigFox.debug().

Función loop()

En la función loop() es donde vamos a tener toda la lógica para que la estación meteorológica con Arduino envíe datos a Sigfox.

Lo primero que te encuentras es la lógica para gestionar la ejecución según el tiempo transcurrido en el modo debug. Es lo típico que se hace con la función millis().

Luego se obtienen la temperatura y la humedad del DHT22. Hay que comprobar que se han obtenido resultados numéricos. En caso contrario se marca como que ha habido un error en la obtención de los datos del sensor.

Cuando un sensor DHT, ya sea el DHT11 o el DHT22, está mal conectado, el valor de temperatura y humedad que devuelve es NaN (es un acrónimo en inglés que significa Not A Number) es decir, que no es un número. Esto es debido principalmente a que no está bien alimentado o que el cable de datos no está bien conectado. En caso de que esto suceda revisa las conexiones.

Una vez obtenidos los datos de temperatura y humedad hay que enviarlos a través de la red de Sigfox. El procedimiento es el mismo que el de la función setup().

Con la función SigFox.begin() se intenta conectar a la red y en caso que no se consiga, se corta la alimentación enviando la señal al TPL5110. Si todo ha ido bien comenzamos la transmisión llamando a la función SigFox.beginPacket().

Para enviar cada dato tienes que llamar a la función SigFox.write() y como parámetro el valor que se quiere enviar.

El primer dato es el estado de la estación. Ahora mismo sólo puede ser dos o trabajando (WORKING) o que ha fallado el DHT (DHTFAILED). En un futuro, si se añaden más sensores, se podrá utilizar para dar el estado del resto de componentes.

Luego, dependiendo de si se ha podido obtener la información del sensor DHT22, se enviarán los datos de temperatura, humedad y el índice de calor. Este último se obtiene de la temperatura y la humedad.

En caso de que el sensor DHT22 no haya podido obtener los datos, enviará todos los valores a 0.

Y en el caso de que si que se hayan obtenido los datos, se enviarán a través de la red Sigfox. Sin embargo los datos que se obtienen del DHT22 son datos del tipo float. Estos datos se podría enviar tal cual pero es más interesante comprimirlos para ahorrar bytes en la transmisión hacia Sigfox.

Precisamente, la librería conversions.h es lo que hace. Esta librería tiene dos funciones: convertFloatToInt16() y convertFloatToUInt16().

La primera función convierte un float (4 bytes) en un int de 2 bytes (16-bit). La segunda convierte un float en un int sin signo de 2 bytes (16-bit).

Si comparamos lo que ocupa un float (4 bytes) y un int (2 bytes) vemos que salimos ganando ya que ocupa el doble pero ¿cómo lo hace? Básicamente lo que hacen estas funciones es comprimir la información.

Cómo se comprimen los datos depende de los parámetros que se pasan a las funciones de la librería conversions.h.

En el caso de la temperatura y el índice de calor el factor de compresión es de 273,0666 y para la humedad es de 595,7818. Puedes calcularlos si sustituyes los parámetros que se envían a las funciones de conversions.h.

Estos dos valores nos harán falta para descomprimir los datos en Node-RED.

Te recomiendo que eches un vistazo a las funciones conversions.h para ver la operación matemática que se realiza, verás que es muy sencilla.

Por último, se llama a la función SigFox.endPacket() para enviar el mensaje y se apaga el módulo Sigfox llamando a la función SigFox.end().

Para finalizar en el modo de operación sin debug se llama a la función apagarAlimentación() que envía la señal al TPL5110 para que corte la alimentación.

Con esto ya tendríamos toda la lógica programada de la estación meteorológica solar con Arduino y Sigfox.

Solo falta entrar en el backend de Sigfox para configurar la callback a la plataforma del IoT ThingerIO pero antes vamos a ver cómo añadir una librería creada por nosotros mismos en el IDE de Arduino.

Código completo de la estación meteorológica solar con Arduino y Sigfox

Crear una librería en el IDE de Arduino

El último paso que hay que hacer es crear la librería conversions.h para incluirla en el código. Hemos visto que al principio del código se añade esta librería pero ¿dónde está?

De momento no existe, es una librería que tenemos que crear nosotros mismos. A continuación vas a ver cómo se hace.

Ahora mismo tendrás el IDE de Arduino con el código que hemos visto en la sección anterior. Guárdalo en tu ordenador.

Crea una pestaña nueva haciendo click en la flecha que hay en la parte superior derecha y seleccionando la opción Nueva Pestaña

Esto mostrará un formulario donde te pide que pongas un nombre al fichero. Escribe conversions.h y haz click en Ok.

En el IDE de Arduino verás que se ha creado una nueva pestaña donde pone conversions.h.

En esta nueva pestaña copia y pega el siguiente código.

Si das al botón de verificar verás que se compila perfectamente.

Este sería el último paso y ya estaría el código preparado para subir a la placa Arduino MKRFOX1200.

Todavía no cargues el código a la placa de Arduino MKRFOX1200 ya que nos queda dos pasos importantes: configurar la plataforma ThingerIO y el backend de Sigfox.

Configuración plataforma del IoT ThingerIO

Antes de configurar el backend de Sigfox, tienes que darte de alta en la plataforma del IoT ThingerIO. Es una plataforma muy completa, muy simple de usar y además los fundadores son españoles.

Uno de sus puntos fuertes es la documentación, tiene muchas funcionalidades documentadas aunque está toda en inglés.

Es una plataforma que lleva tiempo entre nosotros y poco a poco va creciendo en usuarios y en nuevas funcionalidades. Está especialmente orientada a dispositivos del IoT y para los Makers nos ofrecen una versión gratuita con limitaciones.

Con la versión gratuita puedes conectar hasta 2 dispositivos, tener 4 paneles de control, 2 endpoints para comunicar con servicios externos y 4 buckets que te permiten almacenar información en formato series de tiempo.

Los ratios de escritura en los buckets son de 1 llamada cada 60 segundos. En este proyecto es más que suficiente ya que haremos una llamada cada 15 minutos.

Por otro lado mantienen la información durante 1 año. A parte, dispone de una app que se conecta a ThingerIO para mostrar la información. En este proyecto no utilizaremos esta app ya que trabajaremos con Blynk.

Lo primero que tienes que hacer es darte de alta en la plataforma. Necesitarás un email y una contraseña.


Una vez te das de alta y validas tu email, ya puedes entrar al panel de control de ThingerIO. Cuando entras la primera pantalla que ves es un resumen de los dispositivos, paneles de control, buckets, etc… que estás utilizando en tu cuenta.

En la parte izquierda tienes el menú para acceder a todas las funcionalidades de ThingerIO, en la parte del centro tienes el área de trabajo donde aparecerán diferentes formularios y listados con información y en la parte de la derecha arriba tienes acceso a la configuración de tu usuario.

Para poder comunicar desde el backend de Sigfox con ThingerIO es necesario crear dos cosas: un bucket y un token. A parte, vamos a crear un token de lectura para poder acceder desde Node-RED.

Crear un bucket en ThingerIO

Lo primero es crear un bucket donde ir almacenando los datos que se envían desde Arduino: temperatura, humedad e índice de calor. Recuerda que esta información que nos llega está comprimida es decir, no vamos a tener un valor de 23ºC por ejemplo para la temperatura.

Según el factor de compresión que teníamos en la función convertFloatToInt16 de la librería conversions.h los 23ºC se convierten en 6280. Lo mismo sucederá con el índice de calor y la humedad.

Vamos a crear el bucket de información. Entra en la opción del menú Data Buckets y haz click en el botón Add Bucket.

Rellena los campos del formulario que aparecen. En Bucket id es importante que elijas un identificador único de este bucket que no se repita. En Bucket name pon un nombre descriptivo y en Bucket description por una descripción de la información que almacena este bucket.

Por último en Data Source elige la opción From Write Call que te permite almacenar datos haciendo una llamada a través de la API.

Una vez lo tengas todo da al botón de Add Bucket.

Si todo ha ido bien, aparecerá un mensaje indicando que el bucket se ha creado correctamente.

Si entras de nuevo a la opción del menú Data Buckets verás que aparece el bucket que acabamos de crear.

Con esto ya podemos almacenar los datos que se envíen desde Sigfox. Sin embargo, tenemos que dar acceso y para ello necesitas crear un token.

Crear token de escritura para Sigfox

La idea del token es dar acceso con una clave (token) a la callback de Sigfox para que pueda enviar los datos cuando lleguen del Arduino MKRFOX1200.

Entra en la opción del menú Access Tokens y haz click en el botón Add Token.

En el formulario que se abre rellena el Token ID con un identificador único, pon un nombre descriptivo al token en el campo Token Name y haz click en el botón +Add de la sección Token Permissions.

Esto abrirá una nueva ventana para añadir permisos al token que vas a crear. En Select Permission Type selecciona Bucket. En Access selecciona Specific Bucket y luego selecciona el bucket que has creado antes. Aparecerá por el ID.

En Actions selecciona Select specific action y selecciona la opción WriteBucket. Una vez hayas terminado haz click en el botón Add.

Volverás al formulario anterior y aquí debes pulsar el botón Add Token. Una vez pulsado te aparecerá un mensaje diciendo que el token se ha creado y también te aparecerá el Access Token que es la clave que debes guardar.

Esta clave no la tienes que publicar ni compartir con nadie. Podrás acceder a ella cuando quieras entrando de nuevo en la información del token.

Si ahora entras de nuevo en la opción del menú Access Tokens verás el token que has creado.

Si haces click sobre el ID del token podrás ver de nuevo la información y modificar el Access Token.

Solo falta crear un nuevo token para leer los datos desde Node-RED.

Crear token de lectura para Node-RED

El token que vamos a crear a continuación te permitirá leer los datos desde Node-RED.

Accede a la opción del menú Access Tokens y haz click en el botón Add Token.

Vamos a crear un nuevo token pero esta vez sólo de lectura. Rellena los campos del token sin repetir el identificador.

Pulsa el botón Add para añadir los permisos al token. Selecciona el tipo Bucket y el acceso Specific bucket seleccionando el bucket EstacionTerraza. En acciones selecciona Select specific action y selecciona entre todas las opciones ReadBucket.

Por último pulsa el botón Add.

En el formulario tienes que hacer click en el botón Add Token y esto te mostrará el Access Token de lectura del bucket.

Si ahora entras en la opción del menú Access Tokens verás que aparecen los dos tokens que hemos creado, de escritura (EstacionTerraza) y de lectura (EstacionTerrazaNode).

Con esto ya tenemos todo preparado para conectar el backend de Sigfox con ThingerIO y posteriormente veremos cómo conectar Node-RED con esta plataforma.

Vamos a empezar con el backend de Sigfox.

Configuración backend Sigfox estación meteorológica con Arduino

Lo primero que tienes que hacer, si no lo has hecho antes, es dar de alta el dispositivo en el backend de Sigfox. Sigue este tutorial de introducción a la placa Arduino MKRFOX1200.

Una vez lo tengas dado de alta hay que configurar la callback para hacer la llamada a la plataforma en la nube para el IoT ThingerIO.

La callback te va a permitir enviar todos los datos que lleguen del Arduino MKRFOX1200 a otra plataforma en la nube como vimos en el esquema general. Esta plataforma es ThingerIO que es la que hemos configurado.

Antes de nada, ahora si que puedes cargar el código a la placa Arduino MKRFOX1200. Si todo ha ido bien y entras en tu dispositivo desde el backend de Sigfox en Device>Messages comprobarás que están llegando los mensajes.

Para formatearlos y ver los valores en decimal vete a la opción DEVICE TYPE y edita el dispositivo.

Ahora vete a la zona de Payload display y selecciona en el desplegable de Payload parsing la opción de Custom grammar y en Custom configuration copia lo siguiente.

Por último no te olvides de dar al botón Ok para guardar los cambios.

Ahora si vuelves a los mensajes del dispositivo verás algo parecido a esto.

Ya puedes ver los datos en decimal correspondientes a los tes parámetros que estamos enviando.

Como puedes comprobar, lo datos son un poco extraños. Una temperatura de 5434 no tiene mucho sentido. Esto es debido a la compresión de los datos aplicada en la placa de Arduino.

Ahora lo único que falta es configurar la callback para que envíe los datos a ThingerIO.

Configurar callback de Sigfox a ThingerIO

Accede de nuevo a DEVICE TYPE y edita el dispositivo.

En el menú de la izquierda selecciona la opción CALLBACKS y haz click en el botón New.

En el formulario que se abre hay que rellenar varios campos vamos a ir viendo uno por uno.

#1 Selecciona el Type DATA UPLINK y el Channel URL.

#2 El Custom payload config es cómo estamos recibiendo los datos del dispositivo es decir, desde el Arduino MKRFOX1200. Es el mismo formato que hemos utilizado para visualizar los datos en los mensajes. Copia y pega el siguiente código en este campo del formulario.

#3 La Url pattern es la url a la que tenemos que llamar para enviar los datos. Esta url nos la facilita la plataforma en la nube ThingerIO y sigue el siguiente patrón

https://api.thinger.io/v1/users/{usuario}/buckets/{bucket-id}/data

En usuario tienes que poner el usuario que has elegido al darte de alta en ThingerIO. Lo puedes ver si accedes a la plataforma y haces click en el botón de usuario.

Y el bucket-id es el identificador que has puesto al bucket cuando lo has dado de alta. Si has seguido el tutorial será EstacionTerraza.

Con mis datos la url sería la siguiente.

https://api.thinger.io/v1/users/luisdelvalle/buckets/EstacionTerraza/data

#4 En la sección de HTTP Method selecciona el método POST. Es el que utiliza ThingerIO para poder recibir los mensajes.

#5 En la sección de Headers hay que crear una nueva cabecera que se llama Authorization. El valor de esta cabecera es el token de escritura que hemos creado en la sección de ThingerIO.

Debes poner la palabra Bearer y a continuación un espacio y luego el token que es una combinación de letras, números y signos bastante larga. Puedes obtenerlo del panel de control de ThingerIO entrando al token.

#6 En la sección Content type pon application/json que quiere decir que vamos a enviar los datos en formato JSON.

Por último en Body hay que poner el archivo JSON que es el siguiente:

A parte de la temperatura, humedad e índice de calor, también vamos a enviar los datos del dispositivo, relación señal/ruido, la estación desde la que se envía, la latitud y la longitud.

Estos datos forman parte del mensaje aunque no se envíen explícitamente aunque a partir de junio del 2019, ya no estarán accesibles.

No te olvides de hacer click en el botón Ok. Y con esto ya está todo preparado para que en ThingerIO se reciban los datos.

Para probarlo resetea la placa y entra en los mensajes del dispositivo. Verás una flecha verde indicando que el mensaje se ha enviado correctamente a la callback.

Solo queda hacer una cosa y es configurar Node-RED para poder visualizar los datos en el móvil a través de la aplicación Blynk.

Configuración Node-RED y Blynk

Antes de continuar asegúrate que has seguido el tutorial donde explico cómo iniciarte con Node-RED y Raspberry Pi. Partimos por lo tanto de que tienes Node-RED instalado en una Raspberry Pi (o en un ordenador).

Lo primero es crear un flow desde el que vamos a obtener los datos. En este flow arrastra un nodo de inject y un nodo http request y conectalos.

Configura el nodo inject para que se ejecute cada 15 minutos. Para entrar en la configuración haz doble click sobre el nodo.

El nodo http request tiene algo más de configuración. Lo primero el método que debe utilizar es el GET y en la URL tienes que poner la misma que hemos utilizado en el backend de Sigfox pero añadiendo ciertos parámetros a la query string.

https://api.thinger.io/v1/users/{usuario}/buckets/{bucket-id}/data?items=1&sort=desc

Sustituye el {usuario} por tu usuario y el {bucket-id} por el identificador del bucket. Por último, el parámetro items significa el número de datos que quieres leer y el sort cómo se ordenan por fecha.

Si pones sort=desc se ordenan de más recientes a más antiguos y si pones items=1 estás diciendo que solo seleccionas uno, el más reciente. Es decir, esta petición HTTP obtendrá el último dato enviado desde Arduino a Sigfox.

Esta consulta utiliza autenticación así que pulsa el check Use authentication y en Type selecciona bearer authentication.

El Token que tienes que copiar es el que has creado en ThingerIO para lectura, el que hemos llamado EstacionTerrazaNode.

Por último en Return selecciona a parsed JSON object.

No te olvides de dar al botón Done.

Obtener datos del JSON con Node-RED

Si ya conoces algo de Node-RED sabrás que hay unos nodos que se llaman function que prácticamente nos permiten hacer cualquier cosa programando en JavaScript.

Sin embargo (según la recomendación de Node-RED) no resulta muy óptimo utilizar este tipo de nodos para todo. Es más interesante utilizar los nodos predefinidos.

Por ejemplo, para obtener las propiedades de un JSON resulta más óptimo utilizar los nodos change. Este nodo permite cambiar cualquier valor de una propiedad del objeto mensaje de Node-RED por una variable global, por un número o por una propiedad de un JSON entre muchas otras coasas.

De momento sólo tenemos que obtener tres datos: temperatura, humedad e índice de calor que están dentro del JSON.

El JSON que se recibe de ThingerIO trae muchas más cosas, lo puedes ver si pones un nodo debug que muestre objeto msg completo.

Con el nodo change vamos a obtener estos valores así que arrastra 3 nodos de este tipo y pon a cada uno su nombre correspondiente: temperatura, humedad e índice.

Conecta cada nodo change con el nodo http request y por el otro extremo conecta un nodo debug.

Si lo dejamos así no obtendremos nada. Ahora hay que programar cada nodo change. Todos van a tener una programación/configuración parecida. Hay un lenguaje que se llama JSONata que sirve para hacer consultas y transformar datos en JSON.

Si quieres sacar rendimiento a Node-RED te aconsejo que empieces a practicar con este lenguaje ya que es muy potente.

Lo que vamos a hacer es hacer una consulta en el objeto JSON que viene en la propiedad payload del mensaje para obtener estos datos.

Abre el nodo change de temperatura y en la sección de Rules donde pone to elige la opción expression.

Cuando seleccionas esta opción, el campo de texto te permite escribir. Aquí es donde hay que poner la expresión JSONata. También puedes hacer click en los tres puntos (…) y abrirá un editor más completo.

En el editor puedes hacer pruebas e incluso tienes una referencia de las funciones de JSONata. Lo único que tienes que hacer es poner la siguiente expresión.

$round(payload[0].val.temperature/273.0666)

Lo que hace esta expresión de JSONata es obtener el primer elemento del payload y dentro de la propiedad val coger la propiedad temperature y dividir su valor entre 273,0666. Todo esto lo redondea con la función $round

El objetivo de este tutorial no es aprender JSONata. Te recomiendo que mires los ejercicios y ejemplos de la web oficial de este lenguaje para profundizar en el.

Ahora te estarás preguntando ¿por qué se divide por 273,0666? ¿Te acuerdas lo que hicimos en el código del Arduino MKRFOX1200? Aplicamos un factor de conversión en la librería conversions.h. Realmente lo que hacías era multiplicar por un factor de compresión.

Ahora es el momento de descomprimir los datos dividiendo por ese factor de compresión.

Por último no te olvides de dar al botón Done. Verás que en la configuración del nodo aparece la expresión que hemos puesto en el editor.

Para el nodo change de la humedad tienes que hacer lo mismo pero utilizando la siguiente expresión.

$round(payload[0].val.humidity/595.7818)

Y para el nodo change del índice de calor copia la siguiente expresión

$round(payload[0].val.index/273.0666)

Ahora si das a deploy y ejecutas el flow verás en el panel de debug la temperatura, la humedad y el índice de calor ya descomprimido.

Ahora sólo nos queda mostrar esta información en la aplicación móvil Blynk.

Configurar Blynk en Node-RED

Hace tiempo que quería hablar de la aplicación Blynk en el blog y hoy ha llegado el momento. Aunque no vamos a ver todas sus funcionalidades si que aprenderás a comunicarlo con Node-RED de una forma sencilla.

Blynk es una aplicación móvil multiplataforma y un servicio en la nube para el IoT. Cuenta con una cuenta gratuita para makers más que suficiente para crear nuestros proyectos del IoT y probar nuestras ideas.

Para empezar con Blynk lo primero es añadir el conjunto de nodos a Node-RED.

Mientras tanto, puedes ir descargando la app Blynk desde la tienda de aplicaciones para el sistema operativo de tu móvil. Sigue las instrucciones para darte de alta en la plataforma. Luego veremos cómo crear una aplicación.

Accede en el menú de Node-RED a la opción Manage Palette.

En la nueva ventana entra en la pestaña Install y busca la palabra blynk. Instala el conjunto de nodos que pone node-red-contrib-blynk-ws.

Esto añadirá un nuevo conjunto de nodos a la paleta de nodos bajo la categoría Blynk ws.

Como ves hay muchos y cada uno tiene una función. El que nos interesa a nosotros ahora mismo es que pone write. Arrastra 3 nodos de este tipo al flow y los conectas con los nodos change que habías creado.

De momento no podemos hacer mucho con estos nodos ya que primero tenemos que configurar la app blynk en el móvil.

Configuración app Blynk IoT

Imagino que ya tienes instalada la app en tu móvil así que vamos a empezar creando un nuevo proyecto. Entra en la app Blynk y pulsa en New Project.

Pon un nombre y selecciona como dispositivo Raspberry Pi aunque esto da lo mismo. El tipo de conexión va a ser WiFi y selecciona un tema. Por último da al botón Create Project.

Aparecerá una pantalla donde te avisará que el token se enviará a tu dirección de email (la que hayas configurado al darte de alta). Pulsa en el botón OK.

Ahora ya podemos empezar a diseñar la aplicación personalizada. De momento aparecerá una pantalla negra.

La idea es añadir tres etiquetas para mostrar la temperatura, la humedad y el índice de calor.

Para añadir un nuevo elemento a la pantalla sólo tienes que hacer click sobre el fondo negro, esto abrirá un menú lateral con los todos los widgets que puedes utilizar.

Busca el que pone Labeled Value y lo añades a la pantalla.

Los widgets que vas añadiendo a cada pantalla van consumiendo energía. Cuando terminas con toda la energía tienes que comprar más. No es cara pero no es gratis.

Para configurarlo sólo tienes que dar un toque y se abrirá las opciones de configuración del widget. Aquí mostraremos la temperatura del sensor DHT22.

Pon un nombre descriptivo, en INPUT selecciona el V0 que es un pin virtual y en el rango pon de -40 a 80. En LABEL pones C de grados Celsius. El resto de parámetros lo dejas como está y pulsas el botón OK.

Haz lo mismo para la humedad eligiendo el pin virtual V1 y el rango de valores entre 0 y 100 y para el índice de calor elige el pin virtual V2 y el rango de valores entre -40 y 80.

Ahora ya tenemos 3 widgets en la app que nos mostrarán los datos de temperatura, humedad e índice de calor. Sólo queda una cosa y es dar al botón de play que hay arriba a la derecha.

Aparece un error que nos dice que no hay conexión con el dispositivo y es que todavía nos queda configurar Node-RED para que comunique con la app Blynk así que vuelve a Node-RED.

Mostrar datos en la app Blynk desde Node-RED

Después de todo el trabajo que hemos hecho, ya nos va quedando menos para poder ver los datos de la estación meteorológica con Arduino y Sigfox en nuestro móvil.

En el flow tienes que tener los 3 nodos write de Blynk que has añadido y conectado con los 3 nodos change.

Haz doble click sobre el nodo write de temperatura, hay que añadir la configuración del proyecto creado en Blynk. En el apartado Connection haz click en el lápiz de la derecha.

Esto abrirá un nuevo formulario para rellenar los datos del proyecto de Blynk. Lo primero es poner la Url que pueden ser dos si vas a utilizar la nube de Blynk.

La aplicación Blynk también puede ser utilizada en local haciendo la instalación pertinente en la Raspberry Pi o en cualquier otro servidor u ordenador.

Elige la que quieras y la copias en el campo de texto. El otro parámetro es el token que tiene que haber llegado a tu email. Si recuerdas, cuando creaste el nuevo proyecto de Blynk mostró un mensaje indicando que te llegaría al email.

Copialo y pégalo en el campo Auth Token. Por último asegúrate que tienes activado el botón que pone Enabled (enabled this button for connect to blynk on startup).

No te olvides hacer click en el botón Update. En el formulario de configuración del nodo write aparecerá seleccionada la configuración que acabamos de crear.

Solo falta configurar este nodo para enviar los datos al pin virtual 0 que hemos configurado en la app de Blynk para la temperatura.

En Pin Mode selecciona la opción Fixed, en Virtual Pin pon 0 y en Name temperatura. Por último haz click en el botón Done.

Ahora hay que hacer lo mismo para la humedad. El pin virtual sería en este caso el 1. No te olvides de seleccionar en Connection la configuración de Blynk que has creado.

Por último para el índice de calor el pin virtual es el 2.

Ahora si haces Deploy lo primero que verás en el flow es que en los nodos write de Blynk aparece el estado connected a cada pin virtual. Esto quiere decir que se ha conectado con éxito a Blynk.

Ahora solo falta ver los datos en la app Blynk. Si abres la app verás que no aparece nada y es que todavía no se ha enviado ningún dato. Recuerda que has configurado el nodo inject para que envíe los datos cada 15 minutos.

Tienes dos opciones, o esperas esos 15 minutos o haces click en el botón del nodo inject que está a la izquierda.

Con cualquiera de estas dos acciones enviará la información a Blynk y se verá la información de temperatura, humedad e índice de calor.

Realmente lo que está haciendo Node-RED es coger los últimos valores de ThingerIO y enviarlos a la app de Blynk.

Con esto damos por finalizado el tutorial de la estación meteorológica solar con Arduino y Sigfox.

Mejoras de las estación meteorológica solar con Arduino y Sigfox

Como todo proyecto Maker, este es susceptible de mejoras que yo mismo he ido añadiendo y que te aconsejo que tu mismo intentes implementar. A continuación te detallo alguna de ellas.

Lo primero es crear un panel de control con los nodos dashboard de Node-RED. Aquí podrás mostrar los datos en tiempo real y una gráfica con el histórico.

Con respecto a la app de Blynk, puedes añadir un par de widgets SuperChart que son gráficos históricos para la temperatura y humedad.

Por último si ya te ves con mucho ánimo puedes utilizar una base de datos SQLite para almacenar los históricos y luego mostrarla en Grafana por ejemplo.

A parte, a nivel de hardware puedes también hacer:

Y en definitiva cualquier cosa que se te ocurra.

¿Se te ocurre alguna otra mejora con la estación meteorológica con Arduino y Sigfox?

¿Qué te ha parecido este tutorial fácil o difícil?

Estaré encantado de leer tu opinión en los comentarios aquí abajo :)

Salir de la versión móvil