#include <WiFi.h>
#include <PubSubClient.h>
// Definir parámetros de conexión WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Parámetros de MQTT
const char* mqttServer = "18.118.252.242";
const int mqttPort = 1883;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
// Definir pines y variables
const int motionSensorPin = 27; // Pin para el sensor de movimiento
const int buzzerPin = 25; // Pin para la alarma (por ejemplo, un buzzer)
bool motionDetected = false; // Bandera de detección de movimiento
unsigned long lastMotionTime = 0; // Tiempo de la última detección de movimiento
// Función para conectar el ESP32 al WiFi
void connectToWiFi() {
Serial.print("Conectando a WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi conectado");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
}
// Función de reconexión al servidor MQTT
void reconnectToMQTT() {
while (!mqttClient.connected()) {
Serial.print("Conectando a MQTT...");
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (mqttClient.connect(clientId.c_str())) {
Serial.println("Conectado a MQTT");
// Suscribirse a los temas necesarios
mqttClient.subscribe("home/motion/control");
} else {
Serial.print("Fallo en la conexión, rc=");
Serial.print(mqttClient.state());
Serial.println(" Reintentando en 5 segundos");
delay(5000);
}
}
}
// Callback para manejar mensajes entrantes MQTT
void mqttCallback(char* topic, byte* payload, unsigned int length) {
String message = "";
// Convertir el payload (bytes) en un String legible
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
// Mostrar el mensaje recibido para depuración
Serial.print("Mensaje recibido [");
Serial.print(topic);
Serial.print("]: ");
Serial.println(message);
// Procesar los comandos basados en el tema
if (String(topic) == "home/motion/control") {
if (message == "alarm_on") {
digitalWrite(buzzerPin, HIGH); // Activar alarma
Serial.println("Alarma ENCENDIDA");
} else if (message == "alarm_off") {
digitalWrite(buzzerPin, LOW); // Desactivar alarma
Serial.println("Alarma APAGADA");
} else {
Serial.println("Comando desconocido en 'home/motion/control'");
}
} else {
Serial.println("Tema desconocido recibido.");
}
}
void setup() {
Serial.begin(115200);
pinMode(motionSensorPin, INPUT); // Configurar el sensor de movimiento como entrada
pinMode(buzzerPin, OUTPUT); // Configurar el buzzer como salida
connectToWiFi(); // Conexión al WiFi
mqttClient.setServer(mqttServer, mqttPort); // Configuración del servidor MQTT
mqttClient.setCallback(mqttCallback); // Establecer la función callback para mensajes
// Asegurarse de que estemos conectados a WiFi y MQTT
while (!mqttClient.connected()) {
reconnectToMQTT();
}
}
void loop() {
mqttClient.loop(); // Mantener la conexión MQTT activa
// Verificar si se detectó movimiento
bool currentMotionState = digitalRead(motionSensorPin);
if (currentMotionState == HIGH && !motionDetected) { // Si se detectó movimiento
motionDetected = true; // Cambiar el estado de la bandera
mqttClient.publish("home/motion", "1"); // Publicar mensaje MQTT
Serial.println("¡Movimiento Detectado!");
// Aquí podrías añadir más lógica para controlar el buzzer o alarmas
digitalWrite(buzzerPin, HIGH); // Activar alarma (buzzer)
}
if (currentMotionState == LOW && motionDetected) { // Si ya no se detecta movimiento
motionDetected = false;
mqttClient.publish("home/motion", "0"); // Publicar mensaje MQTT
Serial.println("Sin Movimiento");
// Detener la alarma (buzzer)
digitalWrite(buzzerPin, LOW);
}
delay(1000); // Esperar un segundo antes de la siguiente comprobación
}