INTRODUCCION
En el mundo del Internet de las Cosas, hay que tener en cuenta un punto muy importante, como lo es la elección de la plataforma a la cual se enviarán los datos medidos. Existen muchísimas opciones en la web y en el mercado, y en esta oportunidad veremos la conexión a Ubidots, una plataforma para IoT definida para el envío y recepción de datos. Se realizará un circuito, y con las credenciales necesarias, podremos hacer una conexión hacia Ubidots para enviar los datos de nuestro sensor DHT11, para medición de temperatura y humedad.
MOMENTO DE HACER NUESTRO CIRCUITO
Para la realización de este proyecto, vamos a necesitar los siguientes componentes:
- ESP32 DevKit V1
- Sensor de Temperatura y Humedad DHT11
- Cable USB-Micro USB
- Cables Jumper Male-Male
- Protoboard
Ahora, procedemos a revisar el diagrama de PinOut del ESP32 DevKit v1 y del sensor DHT11 para realizar las conexiones.
- ESP32 DevKit V1
- Sensor de temperatura y humedad DHT11
Entendido ya que pines poseen ambos componentes, realizamos el siguiente circuito.
ESP32 DEVKIT V1 | SENSOR DHT11 |
PIN 3.3V | VCC |
PIN GND | GND |
PIN DIGITAL 23 | DATA |
ANTES DE PROGRAMAR…
Tenemos que tener instalado la librería para usar el sensor DHT11, y la librería para hacer la conexión hacia el Bróker MQTT de Ubidots.
Instalamos primero, la librería del sensor DHT11
Ahora, para instalar la librería de Ubidots a usar con el ESP32 DevKit, nos dirigimos al siguiente website: https://help.ubidots.com/en/articles/748067-connect-an-esp32-devkitc-to-ubidots-over-mqtt, y buscamos el paso 7 de dicha guía.
Damos click al enlace “Ubidots ESP MQTT”, y se nos decargará un archivo de nombre “esp32-mqtt-main.zip”.
Para agregar la librería al IDE de Arduino, vamos a la sección Programa/Incluir Librería/ Añadir biblioteca.zip
Ahora seleccionamos el archivo “esp32-mqtt-main.zip”
Una vez seleccionada e instalada, se nos mostrará en la sección de Librerías, y se denominará “Ubidots MQTT for ESP32“
Como último paso previo, debemos ingresar a la plataforma Ubidots y debemos crearnos una cuenta; el enlace es el siguiente: https://ubidots.com/
Para el caso de este proyecto, se eligió el modo de cuenta estudiantil; si usted desea usar la cuenta Premium, no habría problema.
Una vez creada la cuenta, vamos a buscar la clave Token de nuestra cuenta, que usaremos en el código dentro del IDE de Arduino.
Una vez obtenida esa clave Token, y una vez concluido los pasos anteriores, procedemos a crear nuestro código.
PROGRAMAMOS LA TARJETA…
Para realizar la programación del microcontrolador, usaremos el Arduino IDE, por la facilidad y lo sencillo que es programar con dicho programa.
El código a cargar en Arduino UNO es el siguiente:
/*
* El ejemplo de esta semana es una conexión sencilla hacia la plataforma Ubidots
*
* Para esta semana, necesitamos lo siguiente:
* ESP32 DevKit V1
* Sensor DHT11
* Protoboard
* Cable USB- Micro USB
* Cables Jumper Male-male
* Una red WiFi existente en nuestro hogar, lugar de trabajo, etc.
*
* Las conexiones físicas se mencionaron en el inciso anterior
* Realizado por: Sebastian Carranza C. - TodoMaker
*/
/*Incluimos primero las librerías instaladas*/
#include "UbidotsEsp32Mqtt.h"
#include "DHT.h"
/*Definimos que el Pin de Datos del sensor estará conectado al pin 23 del ESP32*/
#define DHTPIN 23
/*Definimos que el tipo de sensor que estamos utilizando es un DHT11*/
#define DHTTYPE DHT11 // DHT 11
/*Se actualizan algunos parámetros del DHT11 con los puntos definidos anteriormente*/
DHT dht(DHTPIN, DHTTYPE);
/*Definimos primero el Token que nos brinda la plataforma Ubidots para hacer la conexión*/
const char *UBIDOTS_TOKEN = "INSERTAR AQUI EL TOKEN DE UBIDOTS";
/*Definimos SSID y PASSWORD de nuestra red WiFi*/
const char *WIFI_SSID = "SSID";
const char *WIFI_PASS = "PASSWORD";
/*Definimos el nombre de nuestro dispositivo, el cual aparecerá en la plataforma Ubidots*/
const char *DEVICE_LABEL = "todomaker-dht11";
/*Definimos las variables que se medirán y que serán publicadas en la plataforma Ubidots*/
const char *VARIABLE_LABEL_1 = "temperatura";
const char *VARIABLE_LABEL_2 = "humedad";
/*Definimos la frecuencia de publicación de 5 segundos*/
const int PUBLISH_FREQUENCY = 5000;
/*Definimos unas variables extra, que incluye la librería*/
unsigned long timer;
uint8_t analogPin = 34;
/*Definimos que las variables de la librería UBIDOTS trabajarán con el Token*/
Ubidots ubidots(UBIDOTS_TOKEN);
/*La librería nos da una función de Subscripción para mensajes de regreso desde la plataforma Ubidots hacia nuestro circuito*/
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
}
/*Definimos la función Setup() para iniciar nuestro circuito*/
void setup()
{
/*Iniciamos el terminal Serial a 115200*/
Serial.begin(115200);
/*Imprimimos el siguiente texto para asegurar el encendido del circuito*/
Serial.println("Medición inciada");
Serial.println("DHT11 Encendido");
/*Iniciamos nuestro sensor DHT11*/
dht.begin();
/*Incluimos un retardo de 1 segundo*/
delay(1000);
/*Ahora, se incluye las funciones de conexión de la Plataforma, como la conexión a internet con las credenciales de WiFi*/
// ubidots.setDebug(true); //Descomentar esto para que los mensajes de depuración estén disponibles
ubidots.connectToWifi(WIFI_SSID, WIFI_PASS);
/*Se inicia la función de subscripción para los mensajes de retorno, que se definió líneas arriba*/
ubidots.setCallback(callback);
/*Se incluye las funciones de Setup y Reconnect, predefinidas de la librería*/
ubidots.setup();
ubidots.reconnect();
timer = millis();
}
/*Iniciamos el bucle de la función Loop()*/
void loop()
{
/*Definimos que, si no se conecta a la plataforma Ubidots, se pasa la función Reconnect() para volver a establecer la conexión*/
if (!ubidots.connected())
{
ubidots.reconnect();
}
/*En esta condicional, iniciamos la medición de Temperatura y Humedad del sensor, y la información será enviada a la Plataforma*/
if (abs(millis() - timer) > PUBLISH_FREQUENCY)
{
/*Hacemos la medición de Temperatura y Humedad del sensor, y lo definimos en variables Float */
float h = dht.readHumidity();
float t = dht.readTemperature();
/*Definimos que el valor de Temperatura será enviado por la variable 1, a la plataforma Ubidots*/
ubidots.add(VARIABLE_LABEL_1, t);
/*Definimos que el valor de Humedad será enviado por la variable 2, a la plataforma Ubidots*/
ubidots.add(VARIABLE_LABEL_2, h);
/*Hacemos la publicación de los datos en el dispositivo definido*/
ubidots.publish(DEVICE_LABEL);
/*Para mostrar los datos, los imprimimos en el terminal Serial*/
Serial.println("Enviando los datos a Ubidots: ");
Serial.println("Temperatura: " + String(t));
Serial.println("Humedad: " + String(h));
Serial.println("-----------------------------------------");
timer = millis();
}
/*Agregamos un delay de 10 segundos para el envío, y que luego de este tiempo, se proceda a reiniciar el bucle*/
delay(10000);
ubidots.loop();
}
El funcionamiento del código se muestra a continuación:
- Como primer paso (y muy importante, por cierto), debemos llamar a la librería UbidotsEsp32Mqtt.h junto a la librería DHT.h, ambas fueron instaladas en los incisos anteriores
/*Incluimos primero las librerías instaladas*/
#include "UbidotsEsp32Mqtt.h"
#include "DHT.h"
- Ahora, definimos que el pin de Datos del sensor estará conectado al pin digital 23 del ESP32 DevKit V1, y que además, estamos usando el sensor DHT11.
/*Definimos que el Pin de Datos del sensor estará conectado al pin 23 del ESP32*/
#define DHTPIN 23
/*Definimos que el tipo de sensor que estamos utilizando es un DHT11*/
#define DHTTYPE DHT11 // DHT 11
/*Se actualizan algunos parámetros del DHT11 con los puntos definidos anteriormente*/
DHT dht(DHTPIN, DHTTYPE);
- Definimos una variable constante char, donde se debe ingresar nuestro Token obtenido de la plataforma Ubidots.
/*Definimos primero el Token que nos brinda la plataforma Ubidots para hacer la conexión*/
const char *UBIDOTS_TOKEN = "INSERTAR AQUI EL TOKEN DE UBIDOTS";
- Definimos como constantes char nuestras credenciales de la red WiFi a la cual se conectará la tarjeta ESP32 DevKit V1.
/*Definimos SSID y PASSWORD de nuestra red WiFi*/
const char *WIFI_SSID = "SSID";
const char *WIFI_PASS = "PASSWORD";
- Aquí debemos definir como constantes char el nombre del DISPOSITIVO que se creará en la plataforma Ubidots, y las VARIABLES que se medirán en el código; en este caso, se usarán las variables de Temperatura y Humedad. Colocamos una frecuencia de publicación de los datos, de 5 segundos.
/*Definimos el nombre de nuestro dispositivo, el cual aparecerá en la plataforma Ubidots*/
const char *DEVICE_LABEL = "todomaker-dht11";
/*Definimos las variables que se medirán y que serán publicadas en la plataforma Ubidots*/
const char *VARIABLE_LABEL_1 = "temperatura";
const char *VARIABLE_LABEL_2 = "humedad";
/*Definimos la frecuencia de publicación de 5 segundos*/
const int PUBLISH_FREQUENCY = 5000;
- Definimos además unas variables extra, que vienen por defecto con nuestra librería.
/*Definimos unas variables extra, que incluye la librería*/
unsigned long timer;
uint8_t analogPin = 34;
- Definimos aquí que, las variables relacionadas a la librería Ubidots, trabajarán con el Token definido anteriormente.
/*Definimos que las variables de la librería UBIDOTS trabajarán con el Token*/
Ubidots ubidots(UBIDOTS_TOKEN);
- Nuestra librería incluye una función de Subscripción, es decir para leer los mensajes que van de regreso desde la plataforma Ubidots hacia nuestro circuito.
/*La librería nos da una función de Subscripción para mensajes de regreso desde la plataforma Ubidots hacia nuestro circuito*/
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
}
- En la función Setup(), iniciamos nuestro terminal Serial e imprimimos frases para iniciar la medición.
/*Definimos la función Setup() para iniciar nuestro circuito*/
void setup()
{
/*Iniciamos el terminal Serial a 115200*/
Serial.begin(115200);
/*Imprimimos el siguiente texto para asegurar el encendido del circuito*/
Serial.println("Medición inciada");
Serial.println("DHT11 Encendido");
- Iniciamos a la librería con DHT.begin() e incluimos un retardo de 1 segundo.
dht.begin();
/*Incluimos un retardo de 1 segundo*/
delay(1000);
- Se incluyen y definen funciones de la librería, como la conexión a internet con nuestras credenciales de la red WiFi, y el inicio de la función de subscripción para los mensajes de retorno.
/*Ahora, se incluye las funciones de conexión de la Plataforma, como la conexión a internet con las credenciales de WiFi*/
// ubidots.setDebug(true); //Descomentar esto para que los mensajes de depuración estén disponibles
ubidots.connectToWifi(WIFI_SSID, WIFI_PASS);
/*Se inicia la función de subscripción para los mensajes de retorno, que se definió líneas arriba*/
ubidots.setCallback(callback);
- Se incluyen funciones de la librería Ubidots, como la Setup() y Reconnect(). Esta última se explica líneas abajo. Aquí cerramos la función Setup() del código.
/*Se incluye las funciones de Setup y Reconnect, predefinidas de la librería*/
ubidots.setup();
ubidots.reconnect();
timer = millis();
}
- Iniciamos la función Loop(), y definimos que si no se logra la conexión a la plataforma Ubidots, se activa la función Reconnect(), para lograr reconectar nuestro dispositivo con la plataforma.
/*Iniciamos el bucle de la función Loop()*/
void loop()
{
/*Definimos que, si no se conecta a la plataforma Ubidots, se pasa la función Reconnect() para volver a establecer la conexión*/
if (!ubidots.connected())
{
ubidots.reconnect();
}
- Con esta condicional, iniciamos la medición de las variables usando nuestro sensor. Se define como variables float a la medición de Temperatura y Humedad.
/*En esta condicional, iniciamos la medición de Temperatura y Humedad del sensor, y la información será enviada a la Plataforma*/
if (abs(millis() - timer) > PUBLISH_FREQUENCY)
{
/*Hacemos la medición de Temperatura y Humedad del sensor, y lo definimos en variables Float */
float h = dht.readHumidity();
float t = dht.readTemperature();
- El envío de los datos empieza aquí. El valor de temperatura será enviado por la VARIABLE_LABEL_1 y el valor de humedad será enviado por la VARIABLE_LABEL_2, todo esto será publicado en el dispositivo de la variable DEVICE_LABEL.
/*Definimos que el valor de Temperatura será enviado por la variable 1, a la plataforma Ubidots*/
ubidots.add(VARIABLE_LABEL_1, t);
/*Definimos que el valor de Humedad será enviado por la variable 2, a la plataforma Ubidots*/
ubidots.add(VARIABLE_LABEL_2, h);
/*Hacemos la publicación de los datos en el dispositivo definido*/
ubidots.publish(DEVICE_LABEL);
- Mostramos los datos obtenidos en el terminal Serial y definimos que Timer estará medido en milisegundos. Aquí cerramos la condicional definida en el paso anterior.
/*Para mostrar los datos, los imprimimos en el terminal Serial*/
Serial.println("Enviando los datos a Ubidots: ");
Serial.println("Temperatura: " + String(t));
Serial.println("Humedad: " + String(h));
Serial.println("-----------------------------------------");
timer = millis();
}
- Agregamos un retardo de 10 segundos para el envío y luego de este, se pasa a reiniciar el bucle con la función .loop() definida por la librería.
/*Agregamos un delay de 10 segundos para el envío, y que luego de este tiempo, se proceda a reiniciar el bucle*/
delay(10000);
ubidots.loop();
}
HORA DE PROBAR DEL CIRCUITO…
Se muestra a continuación imágenes del código en el IDE de Arduino, como del circuito realizado.
HORA DE EJECUTAR Y PROBAR EL PROYECTO…
Una vez hecho el circuito y subido nuestro código, obtendremos los siguientes resultados.
Los datos que se enviaron, se mostrarán en la plataforma Ubidots en la siguiente manera:
CONCLUSIONES
Una vez finalizado el ejercicio y con el envío de datos realizándose de forma continua, podemos llegar a la conclusión de que el envío de datos a las plataformas de Internet de las Cosas, es un ejercicio bastante interesante y práctico, por lo que a manera de que vayamos realizando más ejercicios y teniendo más practicando usando plataformas (no solo Ubidots, se puede usar también ThingSpeak, Thingsboard, etc), el panorama para proyectos se ampliará y tendremos mucho más experiencia al momento de decidir por la plataforma a utilizar al momento de desarrollar un prototipo, un proyecto, etc.
Te invitamos a tomar el curso de Introducción al ESP32: Introducción al ESP32 | TodoMaker’s School