
Este proyecto muestra cómo utilizar el protocolo de comunicación MQTT con el ESP32 para publicar mensajes y suscribirse a topics de un broker MQTT en servidores como Home Assistant, Node RED, Amazon AWS y openHAB. Como ejemplo, controlaremos el dimmer. El servidor puede ser local o en la nube.
The ESP32 we’ll be programmed using Arduino IDE. The PubSubClient library provides a client for doing simple publish/subscribe messaging with a server that supports MQTT.
Puede cargar el siguiente código en su ESP32. El código está comentado en los lugares donde necesita realizar cambios.
Necesita editar el código con su propio SSID, contraseña y dirección IP del broker MQTT.
- #include <RBDdimmer.h>
- #define outputPin 4
- #define zerocross 5
- dimmerLamp dimmer(outputPin, zerocross); //inicializar puerto para dimmer en placas ESP8266, ESP32, Arduino Due
- #include <WiFi.h> // Para ESP8266 #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- // Credenciales de la red WiFi
- const char *ssid = "REPLACE_WITH_YOUR_SSID"; // nombre de su red WiFi
- const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // contraseña de la red WiFi
- // Credenciales del servidor MQTT.
- // const char *HA_USER = "_____";
- // const char *HA_PASS = "_____";
- IPAddress broker(XXX,XXX,XXX,XXX); // Dirección IP de su broker MQTT, ej.
- const char *ID = "Example_Dimmer"; // Nombre de nuestro dispositivo, ¡debe ser único!
- char *STATE_TOPIC = "dimmer/power/state"; // Topic para publicar el estado de la luz
- char msg[50];
- WiFiClient wclient;
- PubSubClient client(wclient); // Configurar cliente MQTT
- // Manejar mensajes entrantes del broker
- void callback(char* topic, byte* payload, unsigned int length) {
- String response;
- int power_L;
- for (int i = 0; i < length; i++) {
- response += (char)payload[i];
- }
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- Serial.println(response);
- power_L=response.toInt();
- dimmer.setPower(power_L);
- delay(50);
- snprintf (msg, 50, "%ld", dimmer.getPower());
- client.publish(STATE_TOPIC, msg);
- Serial.print("State ");
- Serial.println(msg);
- }
- // Conectar a la red WiFi
- void setup_wifi() {
- Serial.print("\nConnecting to ");
- Serial.println(ssid);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) { // Esperar conexión
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.println("WiFi connected");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- }
- // Reconectar al cliente
- void reconnect() {
- // Bucle hasta reconectarse
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- // Intento de conexión
- if(client.connect(ID,HA_USER,HA_PASS)) {
- client.subscribe(TOPIC);
- Serial.println("connected");
- Serial.print("Subcribed to: ");
- Serial.println(TOPIC);
- Serial.println('\n');
- } else {
- Serial.println(" try again in 5 seconds");
- // Esperar 5 segundos antes de reintentar
- delay(5000);
- }
- }
- }
- void setup() {
- dimmer.begin(NORMAL_MODE, OND); //Inicializar el dimmer
- Serial.begin(115200); // Iniciar comunicación serie a 115200 baudios
- delay(100);
- setup_wifi(); // Conectar a la red
- client.setServer(broker, 1883);
- client.setCallback(callback);// Inicializar la rutina de callback
- }
- void loop() {
- if (!client.connected()) // Reconectar si se pierde la conexión
- {
- reconnect();
- }
- client.loop();
- }
El broker MQTT publica el valor del dimmer (0~100) en el topic dimmer/power/state. El ESP32 está suscrito a estos topics. De este modo, el ESP32 recibe el valor de atenuación (0~100).
Para usar el dimmer con 2–4 o más canales, es necesario agregar los topics y modificar la función callback para leer los topics:
- char *STATE_TOPIC1 = "dimmer/power1/state";
- char *STATE_TOPIC2 = "dimmer/power2/state";
- char *STATE_TOPIC3 = "dimmer/power3/state";
- char *STATE_TOPIC4 = "dimmer/power4/state";