#include <DHTesp.h>
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.emqx.io";
int port = 1883;
char clientId[50];
const int DHT_PIN = 18;
DHTesp dhtSensor;
// Constantes de MQTT
const char* topicTemperatura = "UNIR/Monitoreo/temperatura";
const char* topicHumedad = "UNIR/Monitoreo/humedad";
WiFiClient espClient;
PubSubClient client(espClient);
const int LED_TEMP = 14;
const int LED_HUM = 15;
const int BTN1 = 26;
const int BTN2 = 27;
// Variable para rastrear el estado de la conexión MQTT
boolean mqttConectado = false;
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(LED_TEMP, OUTPUT);
pinMode(LED_HUM, OUTPUT);
pinMode(BTN1, INPUT_PULLDOWN);
pinMode(BTN2, INPUT_PULLDOWN);
// Inicio de la conexión WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Inicio de la conexión MQTT
client.setServer(mqttServer, port);
}
void loop() {
// Intentar reconectar si no está conectado
if (!mqttConectado) {
reconnect();
}
// Mantener la conexión MQTT activa
client.loop();
// Leer datos del sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float Temp = data.temperature;
float Hum = data.humidity;
// Publicar datos en MQTT solo si la conexión está activa
if (mqttConectado) {
client.publish(topicTemperatura, String(Temp).c_str());
client.publish(topicHumedad, String(Hum).c_str());
}
// Codigo de la temepratura y humedad
int estadoBoton1 = digitalRead(BTN1);
int estadoBoton2 = digitalRead(BTN2);
digitalWrite(LED_TEMP, (estadoBoton1 == LOW && Temp > 45.0) ? HIGH : LOW);
digitalWrite(LED_HUM, (estadoBoton2 == LOW && (Hum < 25.0 || Hum > 60.0)) ? HIGH : LOW);
delay(1000);
}
void reconnect() {
// Intentar la conexión
if (client.connect(generateClientId())) {
Serial.println("Conectado a MQTT.");
mqttConectado = true;
} else {
Serial.print("Falló la conexión a MQTT, rc=");
Serial.println(client.state());
}
}
const char* generateClientId() {
//Generar ID del cliente
long r = random(1000);
sprintf(clientId, "ESP32_Client-%ld", r);
Serial.print("Client ID: ");
Serial.println(clientId);
return clientId;
}