#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.emqx.io"; // Nombre del broker / dirección
int port = 1883; // Puerto del broker
String stMac; // String para la dirección Mac
char mac[50]; // Vector definido para 50 asignaciones o espacios de la dirección mac
char clientId[50];
// Instancia de objetos
WiFiClient espClient; // cliente WiFi
PubSubClient client(espClient); // Cliente publicador y suscriptor en MQTT, apropiado del cliente WiFi
#define ledPin 13 // Pin de estado
#define ledPin_2 5
void setup() {
Serial.begin(115200);
randomSeed(analogRead(0)); // Ocupar el pin de forma interna para evitar que actúe como antena de ruidos electromagnéticos ambientales (Pines desconectados)
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
wifiConnect(); // Se ejecuta la función de conexión Wifi
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(WiFi.macAddress());
stMac = WiFi.macAddress();
stMac.replace(":", "_");
Serial.println(stMac);
client.setServer(mqttServer, port); // Se establece conexión con MQTT, Dirección del broker/Puerto de entrada
client.setCallback(callback); // Secuencia invocada pendiente de que ocurra un evento
pinMode(ledPin, OUTPUT);
pinMode(ledPin_2, OUTPUT);
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
// función para reconectar con el servidor
void mqttReconnect() {
while (!client.connected()) { //Mientras el cliente (ESP32) no esté conectado...
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r); // Se obtiene el ID del cliente en modo String y que será arrojado por el buffer, uniendo formatos.
if (client.connect(clientId)) { // Si el cliente se conecta...
Serial.print(clientId);
Serial.println(" Conected");
client.subscribe("Servo_state"); // El cliente se suscribe al tópico "topcName/led"
//client.subscribe("topicName/on");
//client.subscribe("topicName/off");
client.publish("Conection_state", "hello world, ESP32 connected !"); // El cliente se suscribe al tópico "topicName/pub y publica "Hello world...""
} else { // Si no se conecta...
Serial.print("failed, rc=");
Serial.print(client.state()); // Estado del cliente/Id, -2 para error de conexión
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) { // Cuando ocurre un evento de envío de datos en el servidor...
Serial.print("Message arrived on topic: "); //
Serial.print(topic); // Se imprime el tópico en el que llegó el mensaje
Serial.print(". Message: ");
String stMessage; // Variable de tipo string para almacenar el mensaje que llega
// Secuencia para hacer la acumulación de los bits
for (int i = 0; i < length; i++) {
//Serial.print((char)message[i]);
stMessage = stMessage + (char)message[i]; // stMessage guarda el mensaje
}
Serial.println(stMessage);
if (String(topic) == "Servo_state") { // topicName_led Si el tópico coincide con "topicName/led..."
//Serial.print("Changing output to ");
if (stMessage == "star") { // Si el mensaje coincide con la palabra "on..."
//Serial.println("on");
analogWrite(ledPin, 45);
analogWrite(ledPin_2, 45);
delay(1000);
analogWrite(ledPin, 135);
analogWrite(ledPin_2, 135);
delay(1000);
analogWrite(ledPin, 180);
analogWrite(ledPin_2, 180);
delay(1000);
analogWrite(ledPin, 300);
analogWrite(ledPin_2, 300);
delay(1000);
//digitalWrite(ledPin, HIGH);
client.publish("Conection_state", "Enable"); // El ESP32 publica en el tópico "topicName/pub, el mensaje: "Encendido""
}
else if (String(stMessage) == "off") { // Si el mensaje es "off..."
//Serial.println("off");
analogWrite(ledPin, 0);
analogWrite(ledPin_2, 0);
//digitalWrite(ledPin, LOW);
client.publish("Conection_state", "Apagado"); // El ESP32 publica en el tópico "topicName/pub, el mensaje: "Apagado"
}
}
}
void loop() {
delay(50);
if (!client.connected()) { // Si el cliente no se conecta...
mqttReconnect(); // Se ejecuta el void de reconexión
}
client.loop(); // Se ejecuta indefinidamente el objeto cliente.
}