Módulo 10

Conexión con plataformas IoT: ThingsBoard, Blynk, Node-RED

Integración con la Nube y IoT

ESP32 Mecatrónica IoT UNAM

Introducción a las Plataformas IoT

En el ecosistema IoT moderno, las plataformas de integración en la nube se han convertido en elementos fundamentales para el desarrollo de soluciones mecatrónicas escalables y profesionales.

Las plataformas IoT ofrecen servicios completos que incluyen gestión de dispositivos, visualización de datos, análisis en tiempo real y control remoto. En este módulo exploraremos tres de las plataformas más importantes:

ThingsBoard

Plataforma open-source para visualización y gestión de dispositivos IoT con dashboards profesionales.

  • Dashboards personalizables
  • Reglas de negocio
  • APIs REST y MQTT
  • Escalabilidad empresarial
Blynk

Plataforma para crear aplicaciones móviles IoT sin programación, ideal para prototipos rápidos.

  • Apps móviles automáticas
  • Widgets drag-and-drop
  • Notificaciones push
  • Hardware virtual
Node-RED

Herramienta de programación visual para conectar dispositivos, APIs y servicios online.

  • Programación visual
  • Integración de servicios
  • Flujos de datos
  • Extensible con nodos

Arquitectura de Integración IoT

La integración del ESP32 con plataformas IoT sigue una arquitectura de cuatro capas que garantiza escalabilidad y mantenibilidad:

Arquitectura de Sistema IoT

Capa de Dispositivo
ESP32 + Sensores
Capa de Conectividad
Wi-Fi / MQTT / HTTP
Capa de Plataforma
ThingsBoard / Blynk
Capa de Aplicación
Dashboards / Apps
Protocolo MQTT

MQTT (Message Queuing Telemetry Transport) es el protocolo estándar para IoT debido a su bajo ancho de banda, confiabilidad y capacidad de manejar conexiones intermitentes.

Integración con ThingsBoard

ThingsBoard es una plataforma IoT open-source que ofrece capacidades empresariales para gestión de dispositivos, visualización de datos y análisis en tiempo real.

Configuración del Dispositivo

1
Registro en ThingsBoard Cloud

Crea una cuenta en thingsboard.cloud o instala ThingsBoard localmente. Obtén el token de acceso del dispositivo desde el panel de administración.

2
Configuración del Código ESP32
Arduino C++
#include <WiFi.h>
#include <ThingsBoard.h>
#include <DHT.h>

// Configuración WiFi
const char* ssid = "TU_WIFI";
const char* password = "TU_PASSWORD";

// Configuración ThingsBoard
const char* tb_server = "thingsboard.cloud";
const char* token = "TU_DEVICE_TOKEN";

// Configuración del sensor DHT22
#define DHT_PIN 4
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);

// Cliente ThingsBoard
WiFiClient espClient;
ThingsBoard tb(espClient);

void setup() {
  Serial.begin(115200);
  dht.begin();
  
  // Conectar a WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Conectando a WiFi...");
  }
  Serial.println("WiFi conectado");
  
  // Conectar a ThingsBoard
  if (tb.connect(tb_server, token)) {
    Serial.println("Conectado a ThingsBoard");
  }
}

void loop() {
  // Verificar conexión
  if (!tb.connected()) {
    tb.connect(tb_server, token);
  }
  
  // Leer sensores
  float temperatura = dht.readTemperature();
  float humedad = dht.readHumidity();
  
  if (!isnan(temperatura) && !isnan(humedad)) {
    // Enviar telemetría
    tb.sendTelemetryFloat("temperatura", temperatura);
    tb.sendTelemetryFloat("humedad", humedad);
    tb.sendTelemetryInt("timestamp", millis());
    
    Serial.printf("Datos enviados - T: %.2f°C, H: %.2f%%\n", 
                  temperatura, humedad);
  }
  
  tb.loop();
  delay(5000); // Enviar cada 5 segundos
}
3
Creación del Dashboard

En ThingsBoard, crea un dashboard con widgets de:

  • Gráficas de líneas para tendencias temporales
  • Indicadores digitales para valores actuales
  • Mapas de calor para visualizar rangos
  • Alertas para valores fuera de rango

Integración con Blynk

Blynk permite crear aplicaciones móviles para controlar y monitorear dispositivos IoT sin conocimientos de programación móvil.

Configuración con Blynk 2.0

1
Configuración de la App

Descarga Blynk IoT desde App Store/Google Play. Crea un nuevo dispositivo y obtén el Template ID y Auth Token.

2
Código ESP32 para Blynk
Arduino C++
#define BLYNK_TEMPLATE_ID "TU_TEMPLATE_ID"
#define BLYNK_TEMPLATE_NAME "ESP32 Sensor Node"
#define BLYNK_AUTH_TOKEN "TU_AUTH_TOKEN"

#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>

// Credenciales
const char* ssid = "TU_WIFI";
const char* password = "TU_PASSWORD";

// Configuración del sensor
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define LED_PIN 2

DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;

void setup() {
  Serial.begin(115200);
  dht.begin();
  pinMode(LED_PIN, OUTPUT);
  
  // Conectar a Blynk
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
  
  // Timer para enviar datos cada 10 segundos
  timer.setInterval(10000L, sendSensorData);
}

void loop() {
  Blynk.run();
  timer.run();
}

// Función para enviar datos del sensor
void sendSensorData() {
  float temperatura = dht.readTemperature();
  float humedad = dht.readHumidity();
  
  if (!isnan(temperatura) && !isnan(humedad)) {
    // Enviar a pines virtuales
    Blynk.virtualWrite(V0, temperatura);
    Blynk.virtualWrite(V1, humedad);
    
    Serial.printf("Datos enviados a Blynk - T: %.2f°C, H: %.2f%%\n", 
                  temperatura, humedad);
  }
}

// Control de LED desde Blynk
BLYNK_WRITE(V2) {
  int ledState = param.asInt();
  digitalWrite(LED_PIN, ledState);
  Serial.printf("LED %s desde Blynk\n", ledState ? "ENCENDIDO" : "APAGADO");
}

// Sincronización al conectar
BLYNK_CONNECTED() {
  Serial.println("Conectado a Blynk");
  Blynk.syncVirtual(V2); // Sincronizar estado del LED
}
Widgets Recomendados
  • V0: Widget de valor (temperatura)
  • V1: Widget de valor (humedad)
  • V2: Widget de botón (control LED)
  • Gráficas: Para historial de datos

Integración con Node-RED

Node-RED es una herramienta de programación visual que permite crear flujos de datos entre dispositivos IoT, APIs y servicios web de manera gráfica.

Instalación y Configuración

1
Instalación de Node-RED
Terminal
# Instalar Node.js y npm
sudo apt update && sudo apt install nodejs npm

# Instalar Node-RED globalmente
sudo npm install -g node-red

# Ejecutar Node-RED
node-red

# Acceder a http://localhost:1880
2
Código ESP32 para MQTT
Arduino C++
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ArduinoJson.h>

// Configuración WiFi
const char* ssid = "TU_WIFI";
const char* password = "TU_PASSWORD";

// Configuración MQTT (Broker local o HiveMQ)
const char* mqtt_server = "192.168.1.100"; // IP de tu servidor Node-RED
const int mqtt_port = 1883;
const char* mqtt_user = ""; // Usuario MQTT (opcional)
const char* mqtt_password = ""; // Password MQTT (opcional)

// Tópicos MQTT
const char* topic_data = "esp32/sensores";
const char* topic_control = "esp32/control";

// Configuración del sensor
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define LED_PIN 2

DHT dht(DHT_PIN, DHT_TYPE);
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);
  dht.begin();
  pinMode(LED_PIN, OUTPUT);
  
  // Conectar WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Conectando a WiFi...");
  }
  
  // Configurar MQTT
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(onMqttMessage);
  
  Serial.println("Sistema iniciado");
}

void loop() {
  if (!client.connected()) {
    reconnectMQTT();
  }
  client.loop();
  
  // Enviar datos cada 10 segundos
  static unsigned long lastSend = 0;
  if (millis() - lastSend > 10000) {
    sendSensorData();
    lastSend = millis();
  }
}

void sendSensorData() {
  float temperatura = dht.readTemperature();
  float humedad = dht.readHumidity();
  
  if (!isnan(temperatura) && !isnan(humedad)) {
    // Crear JSON
    StaticJsonDocument<200> doc;
    doc["dispositivo"] = "ESP32-001";
    doc["temperatura"] = temperatura;
    doc["humedad"] = humedad;
    doc["timestamp"] = millis();
    
    char buffer[256];
    serializeJson(doc, buffer);
    
    // Publicar datos
    client.publish(topic_data, buffer);
    Serial.printf("Datos enviados: %s\n", buffer);
  }
}

void onMqttMessage(char* topic, byte* payload, unsigned int length) {
  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  
  Serial.printf("Mensaje recibido [%s]: %s\n", topic, message.c_str());
  
  // Control del LED
  if (String(topic) == topic_control) {
    if (message == "LED_ON") {
      digitalWrite(LED_PIN, HIGH);
      Serial.println("LED encendido");
    } else if (message == "LED_OFF") {
      digitalWrite(LED_PIN, LOW);
      Serial.println("LED apagado");
    }
  }
}

void reconnectMQTT() {
  while (!client.connected()) {
    Serial.print("Conectando a MQTT...");
    
    String clientId = "ESP32Client-" + String(random(0xffff), HEX);
    
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
      Serial.println("conectado");
      client.subscribe(topic_control);
    } else {
      Serial.printf("falló, rc=%d, reintentando en 5 segundos\n", client.state());
      delay(5000);
    }
  }
}
3
Flujo de Node-RED

Crea un flujo en Node-RED con los siguientes nodos:

  • MQTT In: Suscribirse a esp32/sensores
  • JSON: Parsear datos del ESP32
  • Function: Procesar y validar datos
  • Dashboard Gauge: Mostrar temperatura y humedad
  • Dashboard Chart: Gráficas históricas
  • MQTT Out: Enviar comandos a esp32/control

Ejercicios Prácticos

1

Dashboard en ThingsBoard

ThingsBoard Dashboard 45 min

Objetivo: Crear un dashboard profesional en ThingsBoard que muestre datos de sensores en tiempo real.

Pasos a realizar:
  • Configurar un dispositivo en ThingsBoard
  • Programar ESP32 para enviar datos de temperatura y humedad
  • Crear widgets de visualización (gráficas, medidores)
  • Configurar alarmas para valores críticos
  • Exportar datos a CSV
Material necesario: ESP32, DHT22, resistencias, cables
2

App Móvil con Blynk

Blynk Mobile 30 min

Objetivo: Desarrollar una aplicación móvil para controlar LEDs y monitorear sensores usando Blynk.

Funcionalidades a implementar:
  • Control de LED RGB desde smartphone
  • Monitoreo de temperatura en tiempo real
  • Notificaciones push para alertas
  • Gráficas históricas de datos
  • Control por voz (opcional)
Descarga Blynk IoT desde App Store o Google Play
3

Automatización con Node-RED

Node-RED MQTT 60 min

Objetivo: Crear un sistema de automatización que procese datos de múltiples sensores y tome decisiones automáticas.

Sistema a desarrollar:
  • Recepción de datos MQTT de múltiples ESP32
  • Procesamiento y análisis de datos
  • Dashboard web en tiempo real
  • Automatización basada en reglas
  • Integración con servicios externos (email, Telegram)
Requiere: Servidor con Node-RED instalado

Proyecto Integrador: Sistema de Monitoreo Ambiental

Sistema Multi-Plataforma de Monitoreo Ambiental

Desarrolla un sistema completo que integre las tres plataformas IoT estudiadas para monitorear las condiciones ambientales de un espacio de trabajo.

Especificaciones del Sistema
Hardware Requerido
  • 3x ESP32 DevKit
  • 3x Sensor DHT22
  • 2x Sensor LDR
  • 1x Sensor de ruido
  • 1x Sensor MQ-135 (calidad aire)
  • LEDs indicadores
  • 1x Ventilador (actuador)
  • Fuentes de alimentación
Funcionalidades del Sistema
  • ThingsBoard: Dashboard principal con análisis histórico y alertas
  • Blynk: Control móvil y notificaciones en tiempo real
  • Node-RED: Lógica de automatización y procesamiento de datos
  • Integración: Los tres sistemas trabajando coordinadamente
Métricas a Monitorear
  • Temperatura: 18-25°C
  • Humedad: 40-60%
  • Luminosidad: 300-500 lux
  • Ruido: < 65 dB
  • Calidad aire: < 1000 ppm CO2

Comparación de Plataformas IoT

Característica ThingsBoard Blynk Node-RED
Facilidad de uso Intermedio Fácil Intermedio
Costo Gratuito Freemium Gratuito
Escalabilidad Excelente Buena Excelente
Personalización Alta Media Muy Alta
App móvil Limitada Excelente No nativa
Programación visual No No
Análisis de datos Avanzado Básico Avanzado
Recomendaciones de Uso
  • ThingsBoard: Ideal para aplicaciones empresariales que requieren análisis profundo y gestión de flotas de dispositivos
  • Blynk: Perfecto para prototipos rápidos y aplicaciones que priorizan la experiencia móvil
  • Node-RED: Excelente para integraciones complejas y automatización de procesos empresariales

Referencias y Recursos Adicionales

Bibliotecas para ESP32
  • ArduinoThingsBoard - Cliente ThingsBoard
  • Blynk - Cliente Blynk IoT
  • PubSubClient - Cliente MQTT
  • ArduinoJson - Manejo de JSON