4. ESP32 ejemplo comunicacion mqtt en node-red
Ejemplo de programa básico para utilizar una placa ESP32 como unidad remota de entradas y salidas digitales y analógicas, utilizando comunicación broker mqtt con nodered.
El objetivo del programa es probar el funcionamiento de la placa ESP32, para comunicarse con un broker MQTT y crear un panel de control basado en Node-Red.
Creamos el tema rafa/esp32/pin2/out, al cual nos suscribimos en el broker mqtt. El ESP32 utiliza la información recibida para controlar el led integrado en la placa PCB.
/*
* Ejemplo de comunicación mqtt TCP/IP con el ESP32
*
* Descripción: Programa básico para utilizar una placa ESP32 como unidad remota de entradas
* y salidas digitales y analógicas, utilizando comunicación broker mqtt con nodered.
*
* Librería MQTT: https://github.com/knolleary/pubsubclient
*
* Autor: Rafa Aranda
* Fecha: 0-04-2024
* Versión: 1.0
*/
// Librerías
#include <WiFi.h>
#define DEBUG_SW 1
#include <PubSubClient.h>
// Asignación de Pins a Salidas digitales
#define LED_PIN 2
// Puerto del servidor MQTT
#define MQTT_PUERTO 1884
// Funciones prototipo
//void getInputs(void);
//void setOutputs(void);
void setup_wifi(void);
void llega_mensaje(char* topic, byte* payload, unsigned int length);
void conectar(void);
// Variables globales
//#define MSG_BUFFER_SIZE (50)
//char msg[MSG_BUFFER_SIZE]; // Mensaje
// Parámetros de red
const char* ssid = "linksys"; // Para la escuela
const char* password = "12345678";
const char* mqtt_server = "www.alciro.org"; // Direccion del servidor mqtt
const char* mqttUser = "";
const char* mqttPassword = "";
/* Subcripciones a temas (topics)
* Se ha de seguir una ordenación coherente como:
* usuario/dispositivo/conexión/acción -> rafa/esp32/pin1/salida, rafa/esp32/registro1/velocidad
* casa/habitación/dispositivo/magnitud -> casaRafa/comedor/sensor/temperatura, casaRafa/comedor/actuador/luz
* Caracteres comodín
* Multi-level: # para suscribirse a todos los hijos bajo esa cola
* Single Level: + para suscribirse solo a ese nivel
*/
#define sub1 "rafa/esp32/pin2/out"
#define sub2 "rafa/esp32/pin3/in"
// Objetos
WiFiClient espClient;
PubSubClient client(espClient);
// Configuración inicial
void setup(){
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, MQTT_PUERTO);
client.setCallback(llega_mensaje);
}
// Programa principal
void loop(){
if (!client.connected()){ // Conexión MQTT
conectar();
}
//getInputs(); // Leer entradas digitales
//getAnalog(); // Leer entradas analógicas
client.loop(); // Sondear las comunicaciones MQTT
// PROGAMA DE AUTOMATIZACIÓN DE......
//----------------------------------------------------------------------------------------------------
/* Aquí mi programa de automatización utilizando los datos de las variables asociadas al mqtt,
parámetros y consignas para hacer mi proyecto..... */
//setOutputs(); // Activar las salidas
}
/* setup_wifi
* Conexión a la red WiFi
*/
void setup_wifi(void){
delay(10);
// Conectando con la red WiFi
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Inicia el generador de números pseudoaleatorios, lo que hace que comience en un punto arbitrario
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
/* llega_mensaje
* Función Callback para analizar los mensajes mqtt
*/
void llega_mensaje(char* topic, byte* payload, unsigned int length){
String mensaje;
// Lanzamos los mensajes recibido por el terminal
Serial.print("Mensaje del topic {");
Serial.print(topic);
Serial.print("} ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
mensaje += (char)payload[i];
}
Serial.println();
// Acciones a realizar de los mensajes recibidos
if (strstr(topic, sub1)){ // Si es el topic al que estamos subcritos
if (mensaje == "false"){
digitalWrite(LED_PIN, LOW); // Encender el LED. Se entrega un LOW, está conectado a +
Serial.println(" pin on");
}else{
digitalWrite(LED_PIN, HIGH); // Apagar el LED. Se entrega un HIGH, está conectado a +
Serial.println(" pin off");
}
}else if(topic, sub2){ // Si es el topic al que estamos subcritos
/* Aquí mi programa de atención al topic subcrito */
}else{
Serial.println("topic desconocido");
}
}
/* conectar
* Conexión con el broker MQTT
*/
void conectar(void){
// Esperar hasta conectar con el servidor MQTT
while (!client.connected()) {
Serial.print("Intentando conexión MQTT... ");
// Creamos un client ID random
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
// Intenta conectar
if (client.connect(clientId.c_str() , mqttUser, mqttPassword)) {
Serial.println("conectado");
// Una vez conectado, publica un anuncio..
client.publish("outTopic", "hello world");
// Y nos subcribimos a los topics desdeados
client.subscribe(sub1);
//client.subscribe(sub2);
/* aquí otros topics */
} else {
Serial.print("ERROR, estado = ");
Serial.print(client.state());
Serial.println(" se intentará de nuevo en 5 segundos");
// Esperamos 5 segundos
delay(5000);
}
}
}