Conectar ESP32 con IBM Cloud | IBM Watson IoT Platform

Anteriormente se ha hablado sobre conectar un ESP32 a plataformas de IoT como Cayenne y Qubitro. Sin embargo, tenemos a nuestra disposición otros servicios para comunicar nuestros dispositivos. En este tutorial aprenderás a conectar el ESP32 con IBM Cloud.

IBM Cloud brinda servicios informáticos a través de internet, varios de estos servicios son cobrados según el uso. Entre los servicios disponibles tenemos IBM Watson IoT Platform.

¿Qué es Watson IoT Platform?

Watson IoT Platform es la solución de IBM para conectar dispositivos de IoT y recibir los mensajes de dichos dispositivos.

Puedes acceder a Watson IoT Platform mediante el panel de control de IBM Cloud y realizar las configuraciones desde allí. Pero IBM Cloud y Watson IoT no se ejecutan en el mismo entorno con o que se puede tener más seguridad y disponibilidad de datos.

Materiales

Necesitas una tarjeta de desarrollo con un ESP32 y un sensor DHT11 o DHT22. En este ejemplo estamos conectando el pin de datos del DHT11 al pin D4 del ESP32.

Recuerda que el orden de los pines de ambos dispositivos podría ser diferente al que se muestra en este gráifco.

Diagrama de conexión entre un ESP32 y un DHT11.

Obteniendo MAC del ESP32

Para conectar el ESP32 con IBM Cloud necesitas el identificador físico del ESP32, también llamado MAC. Para ello sube el siguiente código al ESP32 y abre el Monitor Serial.

No es necesario que modifiques algo del código.

uint64_t chipid;

void setup() {
  Serial.begin(115200);
}

void loop() {
  chipid = ESP.getEfuseMac();
  Serial.printf("ESP32 Chip ID = %04X", (uint16_t)(chipid >> 32));
  Serial.printf("%08X\n", (uint32_t)chipid);
  delay(3000);
}

En el Monitor Serie (Ctrl+Mayús+M) verás como se imprime la MAC del ESP32 cada 3 segundos. Guarda este dato.

Preparativos en IBM Cloud

Crear instancia de IBM Cloud IoT Platform

Inicia sesión en el portal de IBM Cloud y busca el recurso de Internet of Things Platform.

Al hacer clic entrarás en una nueva sección. Inicia seleccionando uno de las ubicaciones geográficas en las que se alojará la instancia. La carga de trabajo no es tan pesada esta vez, pero te recomiendo utilizar la más cercana.

A continuación puedes elegir la tarifa. Por defecto puedes usar la tarifa gratuita que es más que suficiente para la amyoría de aplicaciones personales.

Seguidamente dale un nombre a tu servicio y un grupo de recursos en caso lo tengas. En caso estés iniciando a trabajar en Cloud un recurso es un sevicio, como IoT Platform. Un grupo de recursos agrupa varios recursos, como una carpeta. Esto ayuda a mantener el orden, sobre todo si trabajas con varios proyectos.

Las etiquetas también son formas de clasificar los recursos e incluso permitir accesos. Sin embargo, no las necesitas en esta práctica.

Para finalizar marca la casilla de los acuerdos de licencia y presiona el botón “Crear”.

Conectar ESP32 a IBM Cloud

Ahora debes registrar tu ESP32 para conectarlo con IBM Cloud y realizar la comunicación entre el equipo y la plataforma. Después de crear el recurso llegarás a la ventana que se muestra en la captura. Da en el botón crear.

¿Recuerdas que IBM Cloud y Watson IoT se ejecutan en diferentes entornos? Es probable que tengas que iniciar sesión o registrarte en Watson IoT.

Dentro de IBM Watson IoT Platform nombra tu dispositivo, en este caso fui creativo y lo llamé “ESP32”. En el campo de ID añade la MAC. Después presiona el botón “Siguiente”.

Este espacio para añadir metadatos, básicamente datos adicionales para tener información más completa del dispositivo. no es necesario escribir por ahora.

Para autentificar el ESP32 con la plataforma se utilizará un token. Puedes escribirlo para crear el tuyo o dejar el espacio vacío para que se genere automáticamente.

Llegarás a una ventana en la que puedes revisar la información que has brindado a la plataforma. Para terminar el proceso presiona el botón “Finalizar”.

Acabando el registro obtendrás los datos de autenticación. Estos datos se usarán más adelante en el programa.

Desde este panel puedes ver los dispositivo que vinculaste y si están conectados o no.

Hay que finalizar esta parte configurando el nivel de seguridad de la conexión.

En la parte izquierda hay varios íconos. Ve al penúltimo (el candado) y dale clic. Abre la opción “Seguridad de conexión” y modifica el Nivel de Seguridad a TLS opcional.

Estás cada vez más cerca de conectar tu ESP32 con IBM Cloud.

Crear dashboard

Para crear los gráficos ve al primer ícono de la izquierda.

Notarás que hay varios dashboard o paneles. Presiona en el botón “Crear panel nuevo” que está arriba a la derecha. A continuación aparecerá un cuadro para darle nombre a tu panel.

Un panel se compone de tarjetas. Cada tarjeta es una gráfica en la que se visualizarán los datos. Presiona el botón “Añadir nueva tarjeta” para crear una.

Escoge el tipo de visualización que quieres. La primera tarjeta, para este ejemplo, será un gráfico de líneas.

Ahora selecciona el dispositivo desde el que se recibirán los datos.

En esta sección completaremos los siguientes datos:

  • Suceso: es el topic en el protocolo MQTT.
  • Propiedad: lo que identifica el dato que enviamos, en esta caso es la temperatura.
  • Nombre: nombre de la tarjeta.
  • Tipo: el tipo de dato que se mostrará, puede ser un número o texto.
  • Unidad: la forma en la que se mide el dato que llega, en este caso será en grados Celcius.

También se pueden añadir los valores mínimos y máximos valores que mostrarán los gráficos.

A continuación selecciona el tamaño que tendrá la tarjeta.

Y para finalizar escoge el color. La tarjeta se creará después de presionar el botón “Enviar”.

Repite el proceso para crear la tarjeta que muestre los datos de humedad. Pero cambia el Suceso y Propiedad ya que si usas los mismos que en la tarjeta anterior los datos de temperatura y humedad se cruzarán.

También te recomiendo revisar esto en el código del ESP32, de lo contrario la conexión al servidor puede darse sin mostrar los datos en la gráfica. Esto porque los datos estarían yendo a otra dirección. Cuando se muestre el código verás dónde cambiar esto.

Incluso puedes tener más tarjetas de un solo dato. Por ejemplo, aquí hay una segunda tarjeta de los datos de humedad con un estilo diferente.

Conexión de componentes

Programando el ESP32

/*
 * Envío de datos de un ESP32 a IBM Cloud IoT Platform
 * Necesitas:
 * ESP32
 * DHT11 o 22
 * Cuenta de IBM Cloud
 * 
 * Henry Mera - TodoMaker
 * https://todomaker.com/blog/author/hmera/
*/

//Añadir librerías
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include "DHT.h"

//Añade datos de tu red
const char* ssid = "SSID";
const char* password = "Contraseña";

//Configuración del DHT
#define DHTPIN 4
#define DHTTYPE DHT11

//Datos constantes para identificar el ESP32
#define ORG "ID de organización IBM"
#define DEVICE_TYPE "ESP32"
#define DEVICE_ID "MAC del ESP32"
#define TOKEN "Token"

//Direcciónes del servidor y topics
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char pubTopic1[] = "iot-2/evt/estado1/fmt/json";
char pubTopic2[] = "iot-2/evt/estado2/fmt/json";

//Autenticación del ESP32
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;

//Crear cliente seguro
WiFiClient wifiClient;
PubSubClient client(server, 1883, NULL, wifiClient);
DHT dht(DHTPIN, DHTTYPE);


void setup() {
  Serial.begin(115200);
  dht.begin();
  Serial.println();

  //Imprime puntos mientras el ESP32 se conecta a la red
  //Cuando se conecta imprime la IP local
  Serial.print("Connecting to ");
  Serial.print(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");

  Serial.print("WiFi connected, IP address: ");
  Serial.println(WiFi.localIP());

  //Conecta al servidor de IBM
  if (!client.connected()) {
    Serial.print("Reconnecting client to ");
    Serial.println(server);
    while (!client.connect(clientId, authMethod, token)) {
      Serial.print(".");
      delay(500);
    }
    Serial.println("Bluemix connected");
  }
}

long lastMsg = 0;

void loop() {
  client.loop();
  long now = millis();

  //Programar envío cada 3 segundos
  if (now - lastMsg > 3000) {
    lastMsg = now;
    
    //Lee y guarda datos recogidos por el DHT
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
    
    //Concatena los datos de temperatura en texto en formato JSON 
    String payload = "{\"d\":{\"Name\":\"" DEVICE_ID "\"";
    payload += ",\"temperatura\":"; 
    payload += temperature;
    payload += "}}";

    //Imprime cadena de texto
    Serial.print("Sending payload: ");
    Serial.println(payload);

    //Publica mediante MQTT y avisa el resultado de la tarea
    if (client.publish(pubTopic1, (char*) payload.c_str())) {
      Serial.println("Publish ok");
    } else {
      Serial.println("Publish failed");
    }

    //Concatena los datos de humedad en texto en formato JSON 
    String payload1 = "{\"d\":{\"Name\":\"" DEVICE_ID "\"";
    payload1 += ",\"humedad\":";
    payload1 += humidity;
    payload1 += "}}";

    Serial.print("Sending payload1: ");
    Serial.println(payload1);

    if (client.publish(pubTopic2, (char*) payload1.c_str())) {
      Serial.println("Publish ok");
    } else {
      Serial.println("Publish failed");
    }
  }
}

Explicación por partes del código

Empezamos añadiendo 4 librerías para lo siguiente.

  • WiFi.h: usar las funciones del módulo WiFi del ES32.
  • WiFiClient.h: crear conexiones seguras.
  • PubSubClient.h: comunicarse mediante MQTT.
  • DHT.h: simplifica la comunicación el sensor DHT.

Aquí debes poner los datos de identificación que obtuviste al registrar el dispositivo.

#define ORG "ID de organización IBM"
#define DEVICE_TYPE "ESP32"
#define DEVICE_ID "MAC del ESP32"
#define TOKEN "Token"

Aquí se indica el servidor de IBM al que se enviarán los datos. También se señalan los topics del cliente MQTT. En este caso los topics tienen el nombre del suceso que se nombró al crear la tarjeta del dashboard.

char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char pubTopic1[] = "iot-2/evt/estado1/fmt/json";
char pubTopic2[] = "iot-2/evt/estado2/fmt/json";

Se indica al programa que la autenticación del dispositivo será mediante un token y seguidamente se añade la constante que almacena el valor del token.

char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;

Se crea un cliente WiFi llamado wifiClient, este mismo se usará al crear el cliente MQTT con PubSubClient. Adicionalmente, al crear el cliente MQTT se introduce el servidor y puerto 1883. Al usar el puerto 1883 la comunicación no está cifrada.

WiFiClient wifiClient;
PubSubClient client(server, 1883, NULL, wifiClient);

Condición en la que si no hay conexión con el servidor se intentará una reconexión usando los datos de autenticación.

  if (!client.connected()) {
    Serial.print("Reconnecting client to ");
    Serial.println(server);
    while (!client.connect(clientId, authMethod, token)) {
      Serial.print(".");
      delay(500);
    }
    Serial.println("Bluemix connected");
  }

Lee datos de temperatura y humedad, después los almacena en variables.

float humidity = dht.readHumidity();
float temperature = dht.readTemperature();

Después se concatena el dato, en este caso la temperatura, una cadena de texto en formato JSON. Lo que está en la segunda línea puede ser modificado de acuerdo a la propiedad que indicaste al crear la tarjeta del dashboard.

La tercer línea es la variable dentro del entorno de Arduino.

    String payload = "{\"d\":{\"Name\":\"" DEVICE_ID "\"";
    payload += ",\"temperatura\":"; //Esta línea
    payload += temperature;
    payload += "}}";

Imprime la cadena de JSON.

Serial.print("Sending payload: ");
Serial.println(payload);

En esta condición se indica que si se logró hacer el envío se escribirá “Publish ok” en el Monitor Serial.

    if (client.publish(pubTopic1, (char*) payload.c_str())) {
      Serial.println("Publish ok");
    } else {
      Serial.println("Publish failed");
    }

Recibiendo datos en IBM Cloud

Conecta el ESP32 a tu computadora y sube el código (Ctrl+U) , de preferencia también abre el Monitor Serial (Ctrl+Mayús+M) después de subir el código.

Después de conectar el ESP32 con IBM Cloud los datos deben estar llegando para ser mostrados en los paneles.

Abre la pestaña en la que está el dashboard y observa los datos llegar.

Puedes añadir más tarjetas aunque sean de una fuente que ya está siendo graficada.

Conclusiones

IBM Cloud proporciona servicios informáticos a través de internet. Entre estos servicios está Watson IoT Platform, un concentrador de dispositivos y mensajes para soluciones de Internet de las Cosas (IoT o Internet of Things por sus siglas en inglés).

Los mensajes llegan a través del protocolo MQTT.

Para conectar el ESP32 a IBM Cloud registrar un dispositivo y crear el dashboard. En el ESP32 debes añadir los datos de autenticación y estarás listo para enviar los datos.

Síguenos para aprender con más tutoriales.

Comenta si te ha gustado o quieres hablar sobre el proyecto.

Previous Post
Next Post