// ---------------------------- LIBRARIES: ESP32 ---------------------------- //
#include <DHT.h> // DHT.
#include <WiFi.h> // WIFI.
#include <PubSubClient.h> // MQTT.
// #include <ArduinoJson.h> // JSON-FILES.
// -------------------------------------------------------------------------- //
// DHT22.
const int dhtPin = 15;
DHT dht22(dhtPin, DHT22);
// WIFI.
const char* ssid = "Wokwi-GUEST"; // Nombre de la red.
const char* password = ""; // Contraseña de la red.
WiFiClient espClient; // Crear un cliente WiFi.
PubSubClient client(espClient); // Crear un cliente MQTT.
// Configuración del broker MQTT
const char* mqtt_server = "test.mosquitto.org"; // Dirección del BROKER.
// LEDs.
const int ledGreen = 2;
const int ledRed = 5;
const int ledYellow= 4;
// Variables.
unsigned long lastMsg = 0; // Tiempo del último mensaje publicado.
float temperature = 0; float humidity = 0;
// SETUP: WIFI -------------------------------------------------------------- //
void setup_wifi() {
delay(10);
Serial.print("- Conectando a: "); Serial.println(ssid);
WiFi.mode(WIFI_STA); // Configura el modo WiFi en estación.
WiFi.begin(ssid, password); // Inicia la conexión WiFi.
// Espera a que se establezca la conexión WiFi.
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Muestra información de la conexión WiFi.
Serial.println(""); Serial.println("Conexión WIFI exitosa.");
Serial.println("- Dirección IP: "); Serial.println(WiFi.localIP());
}
// CALLBACK: MQTT------------------------------------------------------------ //
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("- Mensaje recibido: [ "); Serial.print(topic); Serial.print(" ] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Convierte el PAYLOAD a string.
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)payload[i];
}
// Controlar el LED basado en el mensaje recibido.
if (String(topic) == "/ThinkIOT/led") {
if (messageTemp == "1") {
digitalWrite(ledGreen, HIGH); // Encender LED verde.
} else if (messageTemp == "0") {
digitalWrite(ledGreen, LOW); // Apagar LED verde.
}
}
}
// RECONNECT: MQTT ---------------------------------------------------------- //
void reconnect() {
// Loop hasta que se establezca la conexión.
while (!client.connected()) {
Serial.print("- Intentando conectar al broker MQTT...");
String clientId = "Ed-";
clientId += String(random(0xffff), HEX); // Crea un ID único para el cliente.
// Intenta conectar al broker
if (client.connect(clientId.c_str())) {
Serial.println("Conectado.");
client.publish("/ThinkIOT/Publish", "- Bienvenido."); // Publica mensaje de bienvenida.
client.subscribe("/ThinkIOT/Subscribe"); // Se suscribe a un tema.
client.subscribe("/ThinkIOT/led"); // Se suscribe al tema para controlar el LED.
} else {
Serial.print("Falló, rc=");
Serial.print(client.state());
Serial.println("- intentando de nuevo en cinco segundos...");
delay(5000); // Espera cinco segundos antes de intentar reconectar.
}
}
}
// SETUP: MAIN -------------------------------------------------------------- //
void setup() {
pinMode(ledGreen, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
Serial.begin(115200); // Inicia comunicación serie a 115200 baudios.
setup_wifi(); // Configura la conexión WIFI.
client.setServer(mqtt_server, 1883); // Configura el servidor MQTT.
// Configura la función de callback para los mensajes entrantes.
client.setCallback(callback);
}
// LOOP: MAIN --------------------------------------------------------------- //
void loop() {
// Reconecta al broker MQTT si la conexión se ha perdido.
if (!client.connected()) { reconnect(); }
client.loop(); // Mantiene la conexión MQTT activa.
unsigned long now = millis();
if (now - lastMsg > 2000) { // Publica datos cada dos segundos.
lastMsg = now;
// Lee los datos del sensor DHT.
temperature = dht22.readTemperature();
humidity = dht22.readHumidity();
// Publica datos de temperatura/humedad en los temas correspondientes.
String temperatureString = String(temperature, 2);
client.publish("/ThinkIOT/temperature", temperatureString.c_str());
String humidityString = String(humidity, 1);
client.publish("/ThinkIOT/humidity", humidityString.c_str());
// Muestra datos en el Monitor Serial.
Serial.print("- Temperatura: "); Serial.println(temperature);
Serial.print("- Humedad: "); Serial.println(humidity);
// Controla LEDs basados en los datos de temperatura.
if (temperature < 24) {
digitalWrite(ledYellow, LOW);
} else {
digitalWrite(ledYellow, HIGH);
}
if (temperature > 0) {
digitalWrite(ledGreen, HIGH);
} else {
digitalWrite(ledGreen, LOW);
}
if (temperature == 0) {
digitalWrite(ledRed, HIGH);
delay(1000); digitalWrite(ledRed, LOW); // Apagar LED rojo tras un segundo.
} else {
digitalWrite(ledRed, LOW);
}
}
}
// -------------------------------------------------------------------------- //