#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define ONE_WIRE_BUS 4
#define LDR_PIN 36
#define LED_PIN 26
#define BUZZ_PIN 27
#define BUTTON_PIN 25
const float TEMP_LIMITE = 60.0;
const int LDR_UMBRAL = 500;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "iot/sensor/data";
WiFiClient espClient;
PubSubClient client(espClient);
bool buzzerApagado = false;
bool botonPresionado = false;
float tempSimulada = 25.0;
int luzSimulada = 4000;
unsigned long lastEvent = 0;
const unsigned long EVENT_INTERVAL = 30000;
unsigned long lastSend = 0;
const unsigned long SEND_INTERVAL = 1000;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZ_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
Serial.println("Sistema de monitoreo del servidor - MQTT (simulado)");
Serial.println("Conectando a WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi conectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, mqtt_port);
conectarMQTT();
}
void conectarMQTT() {
while (!client.connected()) {
Serial.print("Conectando a MQTT...");
String clientId = "ESP32_IoT_Monitor-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" conectado!");
} else {
Serial.print(" falló, rc=");
Serial.print(client.state());
Serial.println(" reintentando en 5 segundos");
delay(5000);
}
}
}
void enviarDatos(float temperatura, int luz, bool alarma) {
if (!client.connected()) {
conectarMQTT();
}
StaticJsonDocument<200> doc;
doc["temperature"] = temperatura;
doc["lightLevel"] = luz;
doc["isAlarm"] = alarma;
doc["timestamp"] = millis();
char buffer[256];
serializeJson(doc, buffer);
if (client.publish(mqtt_topic, buffer)) {
Serial.println("Datos enviados por MQTT exitosamente: " + String(buffer));
} else {
Serial.println("Error enviando datos por MQTT");
}
}
void loop() {
if (!client.connected()) {
conectarMQTT();
}
client.loop();
static unsigned long t = 0;
t++;
tempSimulada += random(-2, 3) * 0.1;
luzSimulada += random(-50, 51);
unsigned long currentMillis = millis();
if (currentMillis - lastEvent >= EVENT_INTERVAL) {
lastEvent = currentMillis;
buzzerApagado = false;
if (random(2) == 0) {
tempSimulada = random(65, 85);
luzSimulada = random(3500, 4095);
Serial.println(">>> EVENTO: Sobrecalentamiento extremo!");
} else {
tempSimulada = random(90, 95);
luzSimulada = random(50, 300);
Serial.println(">>> EVENTO: Flama intensa detectada!");
}
}
tempSimulada = constrain(tempSimulada, 15, 95);
luzSimulada = constrain(luzSimulada, 50, 4095);
bool estadoBoton = digitalRead(BUTTON_PIN) == LOW;
if (estadoBoton && !botonPresionado) {
buzzerApagado = true;
tempSimulada = 25.0;
luzSimulada = 4000;
botonPresionado = true;
Serial.println(">>> RESET: Valores óptimos restablecidos");
}
if (!estadoBoton) botonPresionado = false;
bool alarma = (tempSimulada > TEMP_LIMITE) || (luzSimulada < LDR_UMBRAL);
digitalWrite(LED_PIN, alarma);
if (alarma && !buzzerApagado) tone(BUZZ_PIN, 1000);
else noTone(BUZZ_PIN);
Serial.print("Temp: ");
Serial.print(tempSimulada);
Serial.print(" °C | Flama: ");
Serial.print(luzSimulada);
Serial.print(" | Alarma: ");
Serial.println(alarma ? "SI" : "NO");
if (currentMillis - lastSend >= SEND_INTERVAL) {
lastSend = currentMillis;
enviarDatos(tempSimulada, luzSimulada, alarma);
}
delay(1000);
}