Esta guía muestra cómo utilizar elESP32con elPubSubClientbiblioteca
para conectarse a un corredor MQTT, publicar datos de sensores y suscribirse a temas.
PubSubClient es un cliente MQTT ligero para plataformas Arduino y ESP. Soporta MQTT v3.1.1,
hacerlo ideal para IoT y aplicaciones incrustadas que funcionan en dispositivos limitados como ESP32.
Antes de comenzar, asegúrese de que tiene:
En ESP32, conectarse a MQTT implica:
conexión de vacíoToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
(WiFi.status() != WL_CONNECTED) {
(500)
Serial.print());
}
Serial.println(" conectado");
}
conexión de vacío ToMQTT() {
(!client.connected())))) {}
Serial.print("Connecting to MQTT...");
si (client.connect("SensorClient", mqtt_user, mqtt_password) {}
Serial.println(" conectado");
♪♪
Serial.print(" falló, rc=");
Serial.print(client.state());
Serial.println(" - retratar en 5 segundos");
(5000)
}
}
}
DynamicJsonDocument doc(256);
doc["value"] = 5;
Carga de carga útil;
serializeJson(doc, payload);
cliente.publish("sensor/status", payload.c_str());
si (client.connect("SensorClient", mqtt_user, mqtt_password) {}
cliente.subscribe("sensor/control");
}
Para darse de baja:
cliente.unsubscribe("sensor/control");
La desconexión limpia asegura que el corredor libera recursos vinculados a la sesión y evita el mantenimiento conexiones de toma.
cliente.disconnect();
El boceto proporcionado conecta el ESP32 a Wi-Fi, luego establece unMQTTconexión utilizandoPubSubClientbiblioteca. Monitoriza continuamente un sensor digital enGPIO 33.Siempre que el sensor cambios de valor (por ejemplo, 0 → 1 o 1 → 0), el ESP32 crea unJSON payloadcomo 'valor':1} y lo publica al temasensor/estad.
El código también mantiene la conexión MQTT viva con cliente.loop() y automáticamente intenta reconectarse si se pierde la conexión del corredor.
Identificar a Arduino.h
■#incluye ■WiFi.h
■#include יPubSubClient.h
Identificar a ArduinoJson.h
// credenciales WiFi
const char* ssid = "xxxxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxxxx";
// credenciales de corretaje MQTT
const char* mqt_server = "xxxxxxxxxxxxxxxxxx";
const char* mqt_user = "xxxxxxxxxxxxxxxxx";
const char* mqt_password = "xxxxxxxxxxxxx";
// Pin conectado al sensor digital
sensor de int Pin = 33;
WiFiClient espClient;
PubSubClient client(espClient);
// Almacene el último valor conocido del sensor para detectar cambios
int lastSensor Valor = -1;
conexión de vacíoToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
(WiFi.status() != WL_CONNECTED) {
(500)
Serial.print());
}
Serial.println(" conectado");
}
conexión de vacío ToMQTT() {
(!client.connected()))) {}
Serial.print("Connecting to MQTT...");
si (client.connect("SensorClient", mqtt_user, mqtt_password) {}
Serial.println(" conectado");
♫ ... {
Serial.print(" falló, rc=");
Serial.print(client.state());
Serial.println(" - retratar en 5 segundos");
(5000)
}
}
}
vacio publicarSensorValue(valor único) {
DynamicJsonDocument doc(256);
doc["value"] = valor;
Carga de carga útil;
serializeJson(doc, payload);
cliente. public("sensor/status", payload.c_str());
Serial.println("Published on change: " + payload);
}
configuración de vacío() {}
Serial.begin(115200);
pinMode(sensorPin, INPUT);
connectToWiFi();
client.setServer(mqt_server, 1883);
connectToMQTT();
/ Inicializar con el estado actual para evitar falso primer gatillo
lastSensorValue = digitalRead(sensorPin);
}
vacío loop() {}
si (!client.connected()) {}
connectToMQTT();
}
cliente.loop(); // Mantener la conexión MQTT
corriente Valor = digitalRead(sensorPin);
si (Value real != lastSensorValue) {
últimoSensor Valor = corriente Valor;
publicarSensorValue(valo real); // Publicar sólo si el valor ha cambiado
}
retrasos(10); // Retraso corto para el ruido de la depuración, tweak si es necesario
}