#include <WiFi.h>
//Libreria para podernos conectar al broker MQTT
#include <PubSubClient.h>
#include "DHTesp.h" //DHT11 Library for ESP
#define DHTpin 14 //D5 of NodeMCU is GPIO14
DHTesp dht;
float humidity, temperature;
int pinLed = 32;
//Constantes para conectarnos a la red Wi-Fi mediante ssid y su contraseña
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//Dirección del broker MQTT
const char* mqtt_server = "test.mosquitto.org";
//Aquí se realiza configura la conexión del dispositivo para conectarse
//al Wi-Fi y al broker
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
void setup_wifi() {
delay(10);
// Empezamos por conectarnos a una red WiFi
Serial.println();
Serial.print("Conectado a ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Dirección IP: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Llegó el mensaje del tema [");
Serial.print(topic);
Serial.print("] ");
String message;
for (int i = 0; i < length; i++) {
message = message + (char) payload[i]; // convert *byte to string
Serial.print((char)payload[i]);
}
Serial.println();
Serial.print(message);
if (message == "prender")
{
digitalWrite(pinLed, HIGH); // Ponemos el voltaje del led en bajo por que el dispositivo lo tiene invertido
Serial.println();
Serial.println("Se prendio el LED");
}
if (message == "apagar")
{
digitalWrite(pinLed, LOW); // Ponemos el volta del led en alto por que el dispositivo lo tiene invertido
Serial.println("Se apago el LED");
}
}
void reconnect() {
// Bucle hasta que nos volvamos a conectar
while (!client.connected()) {
Serial.print("Intentando la conexión MQTT...");
// Crea una identificación de cliente aleatoria
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Intenta conectarse
if (client.connect(clientId.c_str())) {
Serial.println("conectado");
// Una vez conectado, publique un anuncio...
client.publish("arg/led", "hello world");
// ... y volver a suscribirte
client.subscribe("arg/acciones");
} else {
Serial.print("fallido, rc =");
Serial.print(client.state());
Serial.println(" inténtalo de nuevo en 5 segundos");
// Espere 5 segundos antes de volver a intentarlo
delay(5000);
}
}
}
void setup() {
pinMode(pinLed, OUTPUT); // Inicialice el pin pinLed como salida
Serial.begin(115200);
dht.setup(DHTpin, DHTesp::DHT22); //for DHT11 Connect DHT sensor to GPIO 14
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
delay(200);
if (!client.connected()) {
reconnect();
}
client.loop();
//Get Humidity temperatue data after request is complete
//Give enough time to handle client to avoid problems
delay(dht.getMinimumSamplingPeriod());
humidity = dht.getHumidity();
temperature = dht.getTemperature();
// Publicación de los datos en el servidor MQTT
char humidityStr[6];
char temperatureStr[6];
dtostrf(humidity, 4, 2, humidityStr);
dtostrf(temperature, 4, 2, temperatureStr);
char payload[50];
sprintf(payload, "{\"humidity\": %s, \"temperature\": %s}", humidityStr, temperatureStr);
client.publish("arg/sensor", payload);
Serial.print("Humedad: ");
Serial.print(humidity);
Serial.print("% - Temperatura: ");
Serial.print(temperature);
Serial.println("°C");
}