/// {"date":"...", "time":"...", "location":"...", "attribute":1,"artefact":"Led1"} json
#include <WiFi.h> // libreria para conexiòn a wifi
#include "PubSubClient.h" // liberia para mqtt
const char* ssid = "Wokwi-GUEST"; // aqui va el nombre de la red a la que se va a conectar el ESP32
const char* password = ""; // password de la red
//const char* mqttServer = "broker.hivemq.com"; //Broker pùblico
const char* mqttServer = "194.163.159.245"; //Mi broker
int mqttPort = 1883; // puerto lògico para mqtt
WiFiClient espClient; // objeto de la clase wificlient
PubSubClient client(espClient); // objeto de la clase pubsubclient llamado client inicialzado
String flagsensor =""; //bandera cuando cambia de estado el sensor
int Led1 = 2;
int pulsador =0;
void setup() {
pinMode(Led1, OUTPUT); // configuracion del pin como salida de informaciòn
pinMode(pulsador, INPUT); // configuracion del pin con entrada de informaciòn
Serial.begin(9600); // velocidad de conexiòn serial
Serial.print("Conectando a WiFi");
WiFi.begin(ssid, password, 6); // en este punto se envian las credenciales para autentcarse en la red
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado a:\t");
Serial.println(WiFi.SSID()); // la red
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());//ip
Serial.println();
}
void loop() { // esta funciòn es el hilo del programa del ESP 32
delay(100);
if (!client.connected()) { // este if compruba que se mantenga abierta la conexion con mqtt
mqtt();
}
client.loop();
tx2();
}
void tx2(){
delay(100);
String topico="ej/sensor"; // este es el topico al que se envia la informaciòn del sensor
String sensor= String(digitalRead(pulsador)); // aqui se lee la informacion del sensor
if (flagsensor != sensor)// entra al if si cambia de estado
{
flagsensor = sensor;
// aqui construimos el JSON con el nombre del sensor y el valor que tiene
String msgtx= "{\"date\":\"...\", \"time\":\"...\", \"location\":\"...\", \"attribute\":"+sensor+",\"artefact\":\"Pulsador1\"}";
client.publish(topico.c_str(), msgtx.c_str(),true);
Serial.print("Publicado en topico: ");
Serial.println(topico);
Serial.print("Mensaje: ");
Serial.println(msgtx);
Serial.println();
}
}
void callback(char* topic, byte* message, unsigned int length) { // en esta funcion se recibe la informacion que se haya puiblicado en los topicos suscritos
Serial.print("Llegado en topico: ");
Serial.println(topic);
Serial.print("Mensaje: ");
String stMessage;
for (int i = 0; i < length; i++) {
stMessage += (char)message[i];
}
Serial.println(stMessage);
Serial.println();
rx(stMessage); // aqui se envia el mensaje recibido para que sea utilizado por la funcion RX
}
void mqtt() {
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
while (!client.connected()) {
Serial.println("Conectando a MQTT...");
if (client.connect("Esp32")) {
Serial.println(" Conectado");
Serial.println();
client.subscribe("ej/actuador"); // aqui se debe indicar tidos los topicoas a los que se suscribe el esp 32
} else {
Serial.print("ERROR, rc=");
Serial.print(client.state());
Serial.println(" Reintentar en 5 segundos");
delay(5000);
}
}
}
void rx(String msg){ // esta funcion extare la informacion del topico y envia la informacion al actuador que corresponda
delay(100);
int aux1 = msg.indexOf("attribute\":",0); // filtro inicio
int aux2 = msg.indexOf(",\"ar",0); // filtro palabra final
String atributo=msg.substring(aux1+11,aux2); //extrae
int aux11 = msg.indexOf("artefact\":",0);
int aux22 = msg.indexOf("}",0);
String artefacto=msg.substring(aux11+11,aux22-1);// se extrae led 1
// led 1
if(artefacto="Led1"){
int valor = String(atributo).toInt();
if(valor ==1 ) digitalWrite(Led1, HIGH);
else digitalWrite(Led1, LOW);
}
}