// --- Sistema de Alarma con Clave y Tres Zonas ---
// Compatible con Nucleo-F446RE en entorno Arduino IDE
// --- Definición de estados ---
const int DESARMADO = 0;
const int RETARDO_ARMADO = 1;
const int ARMADO = 2;
const int RETARDO_ALARMA = 3;
const int ALARMA = 4;
int estado = DESARMADO;
// --- Pines de entradas y salidas ---
const int zona1 = D8, zona2 = D9, zona3 = D10;
const int ledVerde = D2, ledRojo = D3, buzzer = D4;
// --- Parámetros del sistema ---
const String CLAVE = "1234"; // Clave predefinida
String claveIngresada = "";
unsigned long tiempoInicio = 0;
int zonaDisparada = 0; // Guarda la zona que activó la alarma
// --- Configuración inicial ---
void setup() {
Serial.begin(9600);
pinMode(zona1, INPUT_PULLUP);
pinMode(zona2, INPUT_PULLUP);
pinMode(zona3, INPUT_PULLUP);
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
digitalWrite(buzzer, LOW);
Serial.println("Sistema de Alarma iniciado - Estado: DESARMADO");
Serial.println("Ingrese clave para armar/desarmar:");
}
// --- Bucle principal ---
void loop() {
leerClaveSerial();
switch (estado) {
case DESARMADO: gestionarDesarmado(); break;
case RETARDO_ARMADO: gestionarRetardoArmado(); break;
case ARMADO: gestionarArmado(); break;
case RETARDO_ALARMA: gestionarRetardoAlarma(); break;
case ALARMA: gestionarAlarma(); break;
}
}
// --- Lectura de clave por puerto serial (no bloqueante) ---
void leerClaveSerial() {
while (Serial.available()) {
char c = Serial.read();
if (c == '\n' || c == '\r') {
verificarClave();
} else if (isDigit(c)) {
claveIngresada += c;
}
}
}
// --- Verificación de la clave ingresada ---
void verificarClave() {
if (claveIngresada == CLAVE) {
if (estado == DESARMADO) {
estado = RETARDO_ARMADO;
tiempoInicio = millis();
Serial.println("Usuario: Clave correcta. Sistema ARMADO (esperando 5s)");
}
else if (estado == RETARDO_ALARMA || estado == ALARMA || estado == ARMADO) {
// Desarmar o cancelar alarma en cualquier estado activo
estado = DESARMADO;
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
digitalWrite(buzzer, LOW);
zonaDisparada = 0;
Serial.println("Usuario: Sistema DESARMADO (alarma cancelada si estaba activa)");
}
} else {
Serial.println("*Error* Clave incorrecta");
}
claveIngresada = "";
}
// --- Estado: DESARMADO ---
void gestionarDesarmado() {
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
digitalWrite(buzzer, LOW);
}
// --- Estado: RETARDO_ARMADO ---
void gestionarRetardoArmado() {
if (millis() - tiempoInicio >= 5000) {
estado = ARMADO;
digitalWrite(ledVerde, HIGH);
Serial.println("Sistema en vigilancia...");
}
}
// --- Estado: ARMADO ---
void gestionarArmado() {
if (digitalRead(zona1) == LOW) {
zonaDisparada = 1;
} else if (digitalRead(zona2) == LOW) {
zonaDisparada = 2;
} else if (digitalRead(zona3) == LOW) {
zonaDisparada = 3;
} else {
return; // Ninguna zona activada
}
estado = RETARDO_ALARMA;
tiempoInicio = millis();
Serial.print("Sistema alarma: Zona ");
Serial.print(zonaDisparada);
Serial.println(" activada - Inicio retardo 3s antes de sirena...");
}
// --- Estado: RETARDO_ALARMA ---
void gestionarRetardoAlarma() {
if (millis() - tiempoInicio >= 3000) {
estado = ALARMA;
Serial.print("Sistema alarma: Sirena encendida! (Zona ");
Serial.print(zonaDisparada);
Serial.println(")");
}
}
// --- Estado: ALARMA ---
void gestionarAlarma() {
digitalWrite(ledRojo, HIGH);
digitalWrite(buzzer, HIGH);
}