En la segunda parte de esta guía te muestro como enviar datos de sensores a Ubidots y como visualizarlos en un dashboard.
Introducción
En la primer parte de esta guía te expliqué que es Ubidots, una plataforma de Internet de las cosas (IoT) que te permite almacenar y visualizar datos provenientes de distintos tipos de dispositivos como sensores o medidores.
También vimos como crear una cuenta STEM, que te permite usar los servicios de Ubidots de manera gratuita, aunque con algunas limitaciones. Creamos un dashboard desde cero, lo que implica primero definir un dispositivo (device en la terminología de Ubidots), también las variables asociadas a ese device y finalmente elegimos algunos widgets para mostrar los valores de esas variables (llamados dots).
Si no recuerdas los detalles, puedes ver nuevamente este video en donde explico el procedimiento:
En esta segunda parte te voy a explicar como enviar datos reales a Ubidots para visuaizarlos en el dashboard que ya hemos creado. Estos datos provendrán de una Raspberry Pico conectada a un sensor DHT22 que enviará los valores de temperatura y humedad medidos.
El circuito
El circuito es mínimo, solo contiene las conexiones entre la Raspberry Pico y el sensor:
Debido a limitaciones en el programa de dibujo, la imagen anterior corresponde a una Raspberry Pico “común” pero obviamente debes usar una Pico W que tenga conectividad Wifi. Por la misma razón el sensor mostrado es el DHT11, mientras que yo utilicé el DHT22 (aunque no debería ser problema reemplazarlo)
Conectando con Ubidots
Para establecer una conexión con Ubidots, ya sea para enviar datos a la plataforma o para recibir información de ella, es esencial conocer tres elementos clave:
- La dirección URL
- El método de transferencia de datos
- Un token o clave de autenticación
URL
La dirección o URL es el punto de destino al que debemos “apuntar” desde nuestro programa en Micropython para conectarnos con los servidores de Ubidots. Esta dirección actúa como el enlace directo entre nuestro dispositivo y la plataforma, asegurando que todas las solicitudes y respuestas se envíen al lugar correcto.
La URL tiene este formato:
https://industrial.api.ubidots.com/api/v1.6/devices/<device_label>/
donde <device_label> es el nombre del device o dispositivo que se está comunicando. En este ejemplo es raspberry-pico
Método de transferencia
Define el protocolo de comunicación que utilizarán la plataforma y el dispositivo. Ubidots soporta varios protocolos, siendo los más comunes HTTP y MQTT. Si se opta por HTTP, es crucial especificar el tipo de solicitud que se realizará, como GET para obtener datos, o POST para enviar información. Cada método cumple una función específica y debe ser seleccionado según la operación que se desea ejecutar.
En este ejemplo de aplicación vamos a enviar datos empleando el protocolo HTTP y el método POST.
Token
El token es un identificador único y privado que sirve como clave de acceso. Este token autentica cada interacción con Ubidots, garantizando que solo usuarios autorizados puedan acceder a los datos. Es un componente esencial para la seguridad, protegiendo la integridad de la información y evitando accesos no deseados.
El token fué creado cuando abriste tu cuenta y está asociado al device o dispositivo. Puedes encontrarlo haciendo click en Devices y luego abriendo los detalles del dispositivo particular (Raspberry Pico en este caso).
Ahora que tenemos toda la información necesaria, pasemos a analizar el código que utilizaremos para hacer las mediciones y enviarlas a la plataforma.
El código
El siguiente es el código mínimo y básico. No emplea verificaciones de error, que debieran agregarse para hacer el programa mas robusto.
import dht, time, ujson from machine import Pin import network, urequests sensorTH = dht.DHT22 (Pin(15)) #Conectado a pin 20 (GP15) red ="LosToloNetwork" password ="*******" token = "BBUS-******" def conectaWiFi (red, password): global miRed miRed = network.WLAN (network.STA_IF) if not miRed.isconnected (): miRed.active (True) miRed.connect (red, password) print ('Conectando la red', red +"...") timeout = time.time () while not miRed.isconnected(): #wdt.feed () if (time.ticks_diff (time.time (), timeout) > 10): return False return True while (True): sensorTH.measure () #Mide temp = sensorTH.temperature () hum = sensorTH.humidity () print (temp,"grados") print (hum,"%") conectaWiFi (red, password) url = "https://industrial.api.ubidots.com/api/v1.6/devices/raspberry-pico/" payload = { "Temperatura": temp, "Humedad": hum } respuesta = urequests.post (url, headers = {'content-type': 'application/json', 'X-Auth-Token':token}, data=ujson.dumps(payload)) print (respuesta.status_code) respuesta.close () time.sleep (30)
Analicemos su funcionamiento.
Como siempre en Micropython, lo primero que hacemos es importar las librerías o módulos necesarios.
import dht, time, ujson from machine import Pin import network, urequests
Módulo o clase | Aplicación |
---|---|
dht | Lectura de temperatura y humedad en el DHT22 |
time | Métodos varios como sleep |
ujson | Métodos para trabajar con el formato JSON |
network | Acceso a la red Wifi |
urequests | Para realizar solicitudes HTTP, como GET y POST |
machine.Pin | Clase para controlar pines GPIO |
A continuación se crea el objeto sensorTH asociado al sensor DHT22 que está conectado al pin GP15.
sensorTH = dht.DHT22 (Pin(15)) #Conectado a pin 20 (GP15)
Lo siguiente es preparar algunas credenciales o claves que serán necesarias mas adelante.
red ="LosToloNetwork" password ="*******" token = "BBUS-******"
- red = Nombre de la red Wifi
- password = Contraseña de la red Wifi
- token = Token para acceder a Ubidots, que vimos antes.
Desde luego, debes reemplazar las que dicen “******” por los valores específicos de tu red Wifi y tu cuenta de Ubidots.
Si planeas publicar tu código en Github, te recomiendo que leas este artículo para que esta información no se vea públicamente.
Lo que sigue es la función conectaWifi, que es la misma que uso en todos los ejemplos y que realiza la conexión de la placa con la red Wifi:
def conectaWiFi (red, password): global miRed miRed = network.WLAN(network.STA_IF) if not miRed.isconnected(): miRed.active (True) miRed.connect (red, password) print ('Conectando la red', red +"...") timeout = time.time () while not miRed.isconnected(): #wdt.feed () if (time.ticks_diff (time.time (), timeout) > 10): return False return True
Ahora comienza la parte ejecutable del código, que consiste en un bucle infinito. Lo primero que se hace dentro del bucle es leer los valores de temperatura y humedad del sensor e imprimirlos para controlar que la lectura haya sido correcta.
while (True): sensorTH.measure () #Mide temp = sensorTH.temperature () hum = sensorTH.humidity () print (temp,"grados") print (hum,"%")
Con los valores de temperatura y humedad leídos, se prepara la conexión con el servidor.
Primero, se llama a la función conectaWifi para acceder a la red y luego se carga la URL a la que debemos acceder para enviar los datos en la variable url
conectaWiFi (red, password) url = "https://industrial.api.ubidots.com/api/v1.6/devices/raspberry-pico/"
Una vez hecho esto, se construye una variable tipo diccionario (de nombre payload) que contiene la información a enviar, es decir, los valores medidos. Esta variable se usará luego y los valores se adecuarán al formato JSON (que es bastante similar al diccionario).
JSON (JavaScript Object Notation) es un formato de texto ligero y de fácil lectura, ideal para el intercambio de datos entre aplicaciones. Su simplicidad y eficiencia lo han convertido en un estándar ampliamente utilizado en aplicaciones web, la comunicación entre servidores y clientes, y en proyectos de IoT, donde es comúnmente utilizado para enviar y recibir datos entre dispositivos y plataformas.
payload = { "Temperatura": temp, "Humedad": hum }
Ahora si enviamos los datos a Ubidots.
Usando urequests hacemos una petición POST con dos parámetros: headers y data.
- headers: contiene a su vez dos valores:
- ‘content-type’: ‘application/json’ que indica que los datos enviados están en formato JSON
- ‘X-Auth-Token’:token envía el token para autenticar esta petición
- data: los valores de temperatura y humedad formateados como JSON empleando el método ujson.dumps.
El valor devuelto por el método urequests.post se carga en la variable respuesta.
respuesta = urequests.post (url, headers = {'content-type': 'application/json', 'X-Auth-Token':token}, data=ujson.dumps(payload))
Para terminar y cerrar el bucle, imprimimos el código que indica el resultado de la petición (200 = OK), cerramos la conexión y hacemos un retardo de 30 segundos antes de volver a empezar.
print (respuesta.status_code) respuesta.close () time.sleep (30)
En la siguiente imagen puedes apreciar el dashboard después de recibir algunos datos:
Conclusiones
En esta segunda parte de la guía, hemos profundizado en cómo conectar una Raspberry Pico con un sensor DHT22 para enviar datos de temperatura y humedad a la plataforma Ubidots. Empezamos definiendo los elementos esenciales para la conexión, como la URL, el método de transferencia de datos, y el token de autenticación. Luego vimos cómo construir el circuito necesario y programar la Raspberry Pico para medir los datos y enviarlos a Ubidots usando el protocolo HTTP con el método POST. También revisamos el código que realiza estas operaciones, destacando la importancia de manejar las credenciales y asegurar la correcta conexión a la red WiFi.
Este proceso permite visualizar en tiempo real los datos en el dashboard que creamos en la primera parte, logrando así una integración completa de hardware y software para proyectos IoT.
En resumen, hemos cubierto desde la teoría hasta la implementación práctica, para que aprendas a desarrollar un sistema funcional para monitorear y visualizar datos de sensores en la nube. Te invito a seguir explorando otros tutoriales y proyectos en el blog para continuar aprendiendo y perfeccionando tus habilidades en IoT.
Como siempre, cualquier duda o sugerencia puedes dejarla mas abajo en la sección de comentarios.