ESP32 + UBIDOTS : PRIMEROS PASOS

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
ESP32 DEVKIT V1 PINOUT
  • Sensor de temperatura y humedad DHT11
DHT11 PINOUT

Entendido ya que pines poseen ambos componentes, realizamos el siguiente circuito.

CIRCUITO ESP32 DHT11 SMELPRO
ESP32 DEVKIT V1SENSOR DHT11
PIN 3.3VVCC
PIN GNDGND
PIN DIGITAL 23DATA

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.

Circuito del ejercicio.

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

Previous Post
Next Post