//Inlcuimos las librerias.
#include "WiFi.h"
#include "PubSubClient.h"
#include "DHTesp.h"
//Declaramos variable para almacenar los pines de LEDs y botón.
int pinDHT = 15;
int ledAzulPin = 13;
// Instancia de DHT.
DHTesp dht;
//Manejo del WiFi.
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient wifiClient;
//Manejo del MQTT.
const char* mqttBroker = "broker.hivemq.com";
const char* mqttClientName = "ClienteNicoMT06EFDI";
const char* mqttUser = "";
const char* mqttPass = "";
const char* publicar_topic = "efdi/mt06/nicoWokwi";
const char* suscribir_topic = "efdi/mt06/nicoPlaca";
PubSubClient mqttClient(wifiClient);
void setup() {
Serial.begin(115200);
// Setup DHT, LEDs, buzzer y botón.
pinMode(ledAzulPin, OUTPUT);
dht.setup(pinDHT, DHTesp::DHT22);
// Setup de WiFi.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("Conectado a: ");
Serial.println(ssid);
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
// Setup de MQTT.
mqttClient.setServer(mqttBroker, 1883);
mqttClient.setCallback(callback);
}
void loop() {
// Verifica si está conectado al broker MQTT.
if (!mqttClient.connected()) {
mqttConnect();
}
// Llamada al loop() de la librería PubSubClient.
mqttClient.loop();
//Obtenemos el arreglo de datos (humedad y temperatura)
TempAndHumidity data = dht.getTempAndHumidity();
float temperatura = data.temperature;
// Condiciones para encender el LED adecuado
if (temperatura >= 20 && temperatura < 25) {
publishMessage(publicar_topic, "azul", true);
} else if (temperatura >= 25 && temperatura < 30) {
publishMessage(publicar_topic, "amarillo", true);
} else if (temperatura >= 30) {
publishMessage(publicar_topic, "rojo", true);
}
// Pequeño retraso para evitar falsos cambios (anti-rebote)
delay(500);
}
// Función mqttConnect()
void mqttConnect() {
while (!mqttClient.connected()) {
Serial.print("Intentando la conexión con MQTT...");
if (mqttClient.connect(mqttClientName, mqttUser, mqttPass)) {
Serial.println("Conectado!");
mqttClient.subscribe(suscribir_topic);
} else {
Serial.print("Error! rc=");
Serial.print(mqttClient.state());
Serial.println(" prueba de nuevo en 5 segundos...");
delay(5000);
}
}
}
// Función callback.
void callback(char* topic, byte* payload, unsigned int lenght) {
String incomingMessage = "";
for (int i = 0; i < lenght; i++) {
incomingMessage += (char)payload[i];
}
Serial.println("Mensaje Arribado: [" + String(topic) + "]: " + incomingMessage);
if (incomingMessage == "on") {
Serial.println("Acción al recibir mensaje ON...");
digitalWrite(ledAzulPin, HIGH);
} else if (incomingMessage == "off") {
Serial.println("Acción al recibir mensaje OFF...");
digitalWrite(ledAzulPin, LOW);
}
}
// Función para publicar un mensaje.
void publishMessage(const char* topic, String payload, boolean retained) {
if (mqttClient.publish(topic, payload.c_str(), retained)) {
Serial.println("Mensaje Publicado: [" + String(topic) + "]: " + payload);
}
}