// Pines de componentes
#define PIR_SENSOR_PIN GPIO_NUM_2
#define LED_PIN GPIO_NUM_3
#define BUZZER_PIN GPIO_NUM_6 // Pin para el Buzzer Pasivo
int pirState = LOW; // Estado actual del PIR
int lastPirState = LOW; // Estado anterior del PIR
// Función para generar el sonido de "policía" con el buzzer pasivo
void playPoliceSiren() {
// Patrón simple de dos tonos alternados
tone(BUZZER_PIN, 1000); // Primer tono (ej. 1000 Hz)
delay(200); // Dura 200 ms
tone(BUZZER_PIN, 1500); // Segundo tono (ej. 1500 Hz)
delay(200); // Dura 200 ms
noTone(BUZZER_PIN); // Detiene el sonido entre ciclos si se desea un "gap"
}
void setup() {
Serial.begin(115200);
Serial.println(F("¡Sistema de Alarma Completa (PIR + LED + Buzzer Policial) Activado!"));
pinMode(PIR_SENSOR_PIN, INPUT); // PIR como entrada
pinMode(LED_PIN, OUTPUT); // LED como salida
pinMode(BUZZER_PIN, OUTPUT); // Buzzer como salida (importante para tone())
digitalWrite(LED_PIN, LOW); // Aseguramos que el LED esté apagado al inicio
noTone(BUZZER_PIN); // Aseguramos que el buzzer esté en silencio al inicio
}
void loop() {
pirState = digitalRead(PIR_SENSOR_PIN); // Lee el estado del PIR
if (pirState != lastPirState) {
if (pirState == HIGH) {
// Movimiento detectado: enciende el LED y activa la sirena
digitalWrite(LED_PIN, HIGH);
Serial.println(F("¡ALERTA! MOVIMIENTO DETECTADO. Sirena y LED Activados."));
} else {
// Movimiento cesado: apaga el LED y el buzzer
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN); // Desactiva la sirena
Serial.println(F("Movimiento FINALIZADO. Alarma Desactivada."));
}
delay(50); // Pequeña pausa para estabilizar
lastPirState = pirState;
}
// Si se detecta movimiento (pirState es HIGH), reproduce la sirena continuamente.
// La sirena se detendrá cuando pirState vuelva a LOW en el 'if' anterior.
if (pirState == HIGH) {
playPoliceSiren();
}
delay(10); // Pequeña pausa para no sobrecargar el bucle
}