#include <ArduinoJson.h>
#include <WiFi.h>
#include <MQTT.h>
#include <DHT.h>
const int DHT_PIN = 15;
const int DHT_TYPE = DHT22;
DHT dht(DHT_PIN, DHT_TYPE);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
WiFiClient wifiClient;
MQTTClient client;
unsigned long lastMsg = 0;
float temp = 0;
float hum = 0;
const int LED_PIN = 21;
bool isLedOn = false;
float temperatura, humedad=0;
#define TEMPERATURA_MAX 45 // Temperatura maxima - 45°C
#define HUMEDAD_MAX 60 // Humedad maxima - 60%
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
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 connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void messageReceived(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
// Verifica el topico suscripto para definir el estado del led
if (topic == "/demo_iot/esp32/led") {
// Parseo JSON
DynamicJsonDocument doc(200);
deserializeJson(doc, payload);
bool isLedOnRequest = doc["isOn"];
// Actualizo estado del led
digitalWrite(LED_PIN, isLedOnRequest ? HIGH : LOW);
isLedOn = isLedOnRequest;
Serial.println("LED status updated:");
Serial.println(isLedOn ? "ON" : "OFF");
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
client.subscribe("/demo_iot/esp32/led"); // Suscripcion al topico del LED
} else {
Serial.print("failed, rc=");
Serial.print(client.lastError());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void chequeo_temperatura(){
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
//Comparación de la lectura del sensor con el umbral maximo de temperatura/humedad propuesto
if (temperatura > TEMPERATURA_MAX || humedad > HUMEDAD_MAX ) {
digitalWrite(LED_PIN, HIGH); // Enciende el LED
Serial.print("Temperatura/Humedad elevada: " + String(temperatura) + " °C - " + String(humedad) + " % " "\n");
}
else
{
digitalWrite(LED_PIN, LOW); // Apaga el LED
Serial.print("Temperatura/Humedad normal: " + String(temperatura) + " °C - " + String(humedad) + " % " "\n");
}
}
void setup() {
pinMode(LED_PIN, OUTPUT); // Defino PIN de salida para led
Serial.begin(115200);
setup_wifi();
client.begin(mqtt_server, 1883, wifiClient);
client.onMessage(messageReceived);
dht.begin();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 5000) { // publico cada 5 segundos
lastMsg = now;
StaticJsonDocument<200> json;
// Completo el JSON
json["temp"] = temperatura;
json["hum"] = humedad;
json["id"] = "esp32_001";
// Convierto el JSON a String
String jsonString;
serializeJson(json, jsonString);
// Publica al string JSON como topico MQTT
client.publish("/catedra_iot/esp32", jsonString);
Serial.println("Data published:");
Serial.println(jsonString);
chequeo_temperatura();
}
}