Micropython: Guardando lecturas del BME280 en Google Sheet

Cuando tenemos un microcontrolador o un módulo con la capacidad de acceder a Internet, se abre un abanico de posibilidades casi infinitas. En otros artículos les mostré como enviar alertas por email o como mostrar en un servidor información se sensores. En esta oportunidad veremos otra alternativa, que es guardar los datos leídos, en este caso de un sensor BME280 conectado a un ESP32, en una planilla de Google.

Introducción

A veces necesitamos enviar los datos que generamos con nuestros dispositivos a un servidor para ser visualizados en un dashboard o panel, como nos permite hacer Thingspeak, entre otros servicios. Pero en otras oportunidades nos alcanza con sólo almacenarlos para hacer luego un análisis de los mismos con alguna otra herramienta. Si este es el caso, una posibilidad es guardarlos en una planilla de Google (Google Sheet), parte del servicio gratuito que nos ofrece la empresa del buscador. Podemos crear la cantidad de planillas que sean necesarias, cada una con los datos provenientes de nuestros dispositivos convenientemente ordenados sobre los cuales después podemos operar con distintas funciones como filtros o cálculos estadísticos, representarlos en distintos formatos de gráficos, etc.

El servicio IFTTT

Para guardar los datos en Google Sheet vamos a necesitar un intermediario, no podemos hacerlo de manera directa. Este intermediario es IFTTT, un servicio que ya lleva varios años en Internet que ofrece la posibilidad de crear aplicaciones (applets) del estilo “si pasa esto, haz aquello” (if this, then that, de allí su nombre), ofreciendo cientos de posibilidades y combinaciones de condiciones y acciones diferentes. La empresa ofrece un plan gratuito que nos permite crear hasta tres applets y otro pago que no tiene limitaciones y cuenta con mas funcionalidades.

Las applets de IFTTT tienen un disparador (trigger) y una acción asociada (action). Las acciones pueden estar asociadas a distintos servicios, como hacer llamadas telefónicas, enviar SMS, un mensaje de Telegram, guardar datos en Google Drive, Dropbox o Evernote y los disparadores pueden provenir de muchas fuentes, como un asistente de voz, un evento del calendario, un mail o una publicación de Facebook. En IFTTT podemos encontrar muchas applets ya creadas que podemos modificar para adaptarlas a nuestras necesidades, pero si no encontramos una apropiada, podemos crear una propia.

Entre todos los eventos o disparadores de IFTTT, los que nos interesan particularmente para esta aplicación son los llamados Webhooks, que no son otra cosa que solicitudes web a una determinada URL, provista por IFTTT, empleando el protocolo HTTP (si quieren repasar como funciona HTTP les sugiero que lean este artículo anterior).

Vamos entonces a crear un applet usando un webhook que disparará el almacenamiento de los datos recibidos en una planilla de Google. Los pasos son los siguientes (asumo que ya crearon una cuenta en IFTTT):

En la pantalla principal, seleccionar el botón Create

Fig. 1

Hacemos click en Add para que se muestren todos los servicios que pueden funcionar como disparadores. Buscamos Webhook

Fig. 2

Seleccionamos Webhooks. IFTTT nos aclara que este disparador se activará cuando se reciba una solicitud web. Después veremos los detalles de esa solicitud. Para continuar hacemos click en Receive a web request

Fig. 3

Le damos un nombre al disparador. Como el BME280 nos entrega Temperatura, Presión y Humedad, lo llamamos SensorTPH. Luego hacemos click en Create trigger

Fig. 4

Ahora debemos especificar la acción que desencadena ese disparador. Hacemos click en Add (en Then that)

Fig. 5

Buscamos Google para ver todos los servicios asociados (como podemos ver son varios) y elegimos Google Sheets

Fig. 6

Tenemos dos opciones: Agregar una fila a una planilla y Actualizar una celda. Elegimos la primera

Fig. 7

A continuación se nos pide información sobre la planilla. Debemos darle un nombre (PruebaBME280) y especificar que datos se guardarán en cada fila y de que manera. Los datos recibidos serán tres valores numéricos correspondientes a la Temperatura, Presión y Humedad medidas (que pasan a llamarse Value1, Value2 y Value3). Podemos cambiar el orden de los campos, borrarlos o agregar otros haciendo click en Add ingredient (siempre separados con |||)

Fig. 8

Hacemos click en Create action (ya casi terminamos!) y podemos ver como queda el applet. Pulsamos sobre Continue

Fig. 9

Cambiamos si queremos el título del applet y hacemos click en Finish

Fig. 10

Con esto ya tenemos listo el applet. Queda ahora configurar nuestro dispositivo con el BME280 para que pueda enviar las solicitudes HTTP. Para ello debemos ir primero a esta página:

maker.ifttt.com

Donde se agrupan los webhooks y hacer click en Documentation

Fig. 11

Entonces IFTTT les mostrará la clave (Key) que los identifica en cada acceso y la URL a la que deben realizar la solicitud (usando los métodos GET o POST).

Fig. 12

En la URL deben reemplazar {event} por el nombre que le dimos al disparador (en este caso SensorTPH). La URL quedaría algo así (borrando mi clave personal)

https://maker.ifttt.com/trigger/SensorTPH/with/key/-----------su clave--------------------

Ya veremos mas adelante como hay que utilizarla.

El circuito

Para esta prueba usaremos el mismo circuito básico con el BME280 conectado a un ESP32 que vimos en en un artículo anterior.

Fig. 13. Esquemático
Fig. 14. Conexiones

El programa

Para acceder al sensor BME280 utilizaremos la librería de robert-hh que se puede descargar desde su repositorio en Github. Recuerden que debemos copiarla primero en la memoria del ESP32 para poder utilizarla. Si no recuerdan el procedimiento, pueden repasarlo en este artículo.

El programa para enviar los datos a Google Sheet queda como se ve a continuación.

#Envía datos de temperatura, humedad y presión a una planilla de Google cada 1 minuto

import network, urequests
from machine import I2C, Pin
from bme280_float import *
from utime import sleep

def conectaWifi (red, password):
     global miRed
     miRed = network.WLAN(network.STA_IF)     
     if not miRed.isconnected():              #Si no está conectado…
         miRed.active(True)                   #activa la interface
         miRed.connect(red, password)         #Intenta conectar con la red
         print('Conectando a la red', red +"…")
         timeout = time.time ()
         while not miRed.isconnected():           #Mientras no se conecte..
             if (time.ticks_diff (time.time (), timeout) > 10):
                 return False
     return True

i2c = I2C(1, scl = Pin(22), sda = Pin(21), freq = 400000)
bme280 = BME280(i2c=i2c)

if conectaWifi ("--red--", "--contraseña--"):
     print ("Conexión exitosa!")
     print('Datos de la red (IP/netmask/gw/DNS):', miRed.ifconfig())
 
     while (True):
          time.sleep (60)     
          valores = bme280.read_compensated_data ()  #Carga los tres al mismo tiempo     
          temp = valores [0]     
          pres = valores [1]     
          hum  = valores [2]     
          print (temp, pres, hum)     #Imprime los tres valores     

          #Envía los tres valores a IFTTT     
          respuesta = urequests.post   ("https://maker.ifttt.com/trigger/SensorTPH/with/key/---su clave---?value1=" + str(temp) + "&value2=" + str(pres) + "&value3=" + str(hum) + "")     

          #Muestra resultados de la solicitud
          print(respuesta.text)     
          print (respuesta.status_code)     
          respuesta.close ()

else:
     print ("Imposible conectar")
     miRed.active (False)

Analicemos el funcionamiento del programa:

Comenzamos en la línea 3 importando el módulo network para conectarnos a la red y el módulo urequests para hacer solicitudes Web.

En la línea 4 importamos las clases I2C y Pin del módulo machine, para la interfaz I2C.

En la línea 5 importamos todo el contenido del módulo BME280_float.

En la línea 6 importamos la función sleep desde el módulo utime.

Desde la línea 8 a la 19 tenemos la definición de la función conectaWifi que nos servirá para conectarnos a la red.

Luego, en la línea 21 instanciamos o creamos un objeto llamado i2c de la clase I2C. Como parámetros en el constructor le pasamos el valor “1” que indica que debe usar la interfaz I2C por hardware y no implementarlo por software, los pines GPIO de scl sda y la frecuencia de trabajo).

A continuación en la línea 22 creamos el objeto bme280 para el sensor, de la clase BME280 y como parámetro le pasamos el objeto i2c creado en la línea anterior.

En la línea 24 realizamos la conexión a la red con la función conectaWifi y si no hubo inconvenientes iniciamos un bucle en la línea 28.

Esperamos un minuto (el tiempo entre lecturas) en la línea 29 y medimos con el BME280 en la línea 30. Usamos el método read_compensated_data que nos devuelve un array con los tres valores medidos.

Entre la línea 31 y la 33 pasamos a tres variables los elementos de ese array y las imprimimos en la consola en la línea 34 para ver los datos que vamos a enviar.

En la línea 37 se hace la solicitud web usando el formato del método GET. Recuerden que ese método emplea el siguiente formato general:

www.ejemplo.com/prog.php?dato1=valor&dato2=valor

Reemplazamos la URL del ejemplo por la que nos provee IFTTT (que vimos mas arriba) y concatenamos las tres variables de temperatura (temp), presión (pres) y humedad (hum) en formato de string. Recuerden que deben incluir la clave (Key) que les dio IFTTT.

respuesta = urequests.post   ("https://maker.ifttt.com/trigger/SensorTPH/with/key/---su clave---?value1=" + str(temp) + "&value2=" + str(pres) + "&value3=" + str(hum) + "")     

Finalmente en las líneas 40 y 41 se imprime la respuesta obtenida del servidor y en la 42 se cierra la conexión.

Para que los datos se vean correctamente en la planilla debemos asegurarnos de que el separador decimal sea el punto (.) en coincidencia con el formato de los datos que estamos enviando. Para ello debemos seleccionar (en la planilla) ArchivoConfiguración de la hoja de cálculo y elegir en Configuración regional un país que utilice ese formato (como Estados Unidos). Opcionalmente podemos darle formato a las columnas para establecer la cantidad de decimales.

Si todo está configurado correctamente, al correr el programa debemos comenzar a ver las lecturas en la planilla, con el siguiente aspecto:

Fig. 15. Algunos valores en la planilla

Y en la consola de Thonny:

Fig. 16. Consola de Thonny

Algunas gráficas realizadas apartir de los datos almacenados:

Fig. 17. Gráficos a partir de valores

Conclusiones

Vimos una alternativa para almacenar los datos generados desde un dispositivo, que es guardarlos en una planilla de Google Sheet. Analizamos el funcionamiento y posibilidades del servicio IFTTT, que tiene mucho potencial para aplicaciones de IoT. Finalmente vimos el paso a paso para crear una aplicación que envía los datos de temperatura, presión y humedad leídos desde un sensor BME280 conectado a un ESP32 y los almacena en una planilla para su posterior análisis.

Espero que el artículo les haya sido de utilidad, en el futuro publicaré otros con mas aplicaciones de los servicios de IFTTT que podemos aprovechar para nuestros proyectos de Internet de las cosas. Cualquier idea, aporte, duda o sugerencia la pueden dejar mas abajo, en la sección de comentarios.

2 comentarios en «Micropython: Guardando lecturas del BME280 en Google Sheet»

  1. Hola Ernesto, felicidades por el blog. Es muy didáctico.

    Estoy intentando enviar datos del sensor BME 280 desde el ESP32 hacia una base de datos en un servidor mySQL. Estoy buscando cómo adaptar el código que has indicado aquí para poder enviarlo a la base de datos. Alguna ayuda de cómo encontrarlo?

    Muchas gracias!

    Responder

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias