/* * MECRO FLIGHT CORE - PROYECTO 09: DETECTOR DE INTRUSOS (PIR)
* Arquitectura: Sensores Digitales, Calibración y Alarma
* Hardware: ESP32 + HC-SR501 + Buzzer + LED
*/
// --- 1. DEFINICIONES DE HARDWARE ---
const int PIN_PIR = 13; // Salida del sensor (Input para el ESP32)
const int PIN_BUZZER = 12; // Alarma sonora
const int PIN_LED = 14; // Alarma visual (LED externo)
// --- 2. VARIABLES DE ESTADO ---
int estadoPIR = LOW; // Asumimos que no hay movimiento al inicio
int lectura = 0; // Variable para guardar lectura actual
// Configuración PWM para el Buzzer (LEDC v3.0)
const int PIN_PWM_BUZZER = PIN_BUZZER;
void setup() {
Serial.begin(115200);
pinMode(PIN_PIR, INPUT);
pinMode(PIN_LED, OUTPUT);
// En v3.0, attach se hace automático al usar ledcWriteTone si es necesario,
// o usamos ledcAttach para ser explícitos.
ledcAttach(PIN_PWM_BUZZER, 2000, 8); // Pin, Frecuencia base, Resolución
Serial.println("--- SISTEMA DE SEGURIDAD MECRO ---");
Serial.print("Calibrando Sensor PIR (Simulado)... ");
// FASE DE CALIBRACIÓN
// En la vida real, el HC-SR501 necesita 30-60s para estabilizarse térmicamente.
// Aquí simulamos una espera corta y un parpadeo de "Armado".
for(int i = 0; i < 5; i++){
digitalWrite(PIN_LED, HIGH); delay(100);
digitalWrite(PIN_LED, LOW); delay(400);
Serial.print(".");
}
Serial.println(" LISTO.");
Serial.println(">>> SISTEMA ARMADO: VIGILANDO <<<");
// Sonido de confirmación (Doble beep)
ledcWriteTone(PIN_PWM_BUZZER, 3000); delay(100);
ledcWriteTone(PIN_PWM_BUZZER, 0); delay(100);
ledcWriteTone(PIN_PWM_BUZZER, 3000); delay(100);
ledcWriteTone(PIN_PWM_BUZZER, 0);
}
void loop() {
// 1. LEER SENSOR
lectura = digitalRead(PIN_PIR);
// 2. LÓGICA DE ALARMA
if (lectura == HIGH) {
// --- MOVIMIENTO DETECTADO ---
digitalWrite(PIN_LED, HIGH); // Encender LED
// Sirena Policial (Barrido de frecuencia)
// Subida
for (int f = 500; f < 2000; f += 100) {
ledcWriteTone(PIN_PWM_BUZZER, f);
delay(20);
}
// Bajada
for (int f = 2000; f > 500; f -= 100) {
ledcWriteTone(PIN_PWM_BUZZER, f);
delay(20);
}
// Detección de Flanco de Subida (Rising Edge)
// Solo imprime UNA VEZ cuando empieza el movimiento
if (estadoPIR == LOW) {
Serial.println("¡ALERTA! Movimiento Detectado en Sector A");
estadoPIR = HIGH;
}
}
else {
// --- ZONA SEGURA ---
digitalWrite(PIN_LED, LOW);
ledcWriteTone(PIN_PWM_BUZZER, 0); // Silencio
// Detección de Flanco de Bajada (Falling Edge)
if (estadoPIR == HIGH) {
Serial.println("Movimiento finalizado. Zona segura.");
estadoPIR = LOW;
}
}
}