#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
// ================== PINES ==================
#define PIN_PIR 10
#define PIN_BUZZER 41
#define PIN_LED 2 // <-- NUEVO: Definimos el pin 2 para el LED
// RFID
#define SS_PIN 53
#define RST_PIN 5
// LCD
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 9, 8, 7);
// RFID
MFRC522 mfrc522(SS_PIN, RST_PIN);
// ================== BOTONES ==================
const int botones[] = {22, 23, 24, 25, 26, 27, 28, 29, 30};
// Frecuencias
const int notas[] = {
262,
294,
330,
349,
392,
440,
494,
523,
587
};
// Nombre notas
const char* nombresNotas[] = {
"DO",
"RE",
"MI",
"FA",
"SOL",
"LA",
"SI",
"DO6",
"RE6"
};
// PASSWORD
int password[] = {0, 2, 5, 6, 5};
// ================== VARIABLES ==================
int indiceProgreso = 0;
int errores = 0;
bool alarmaDisparada = false;
bool sistemaActivo = true;
String secuencia = "";
// ================== SETUP ==================
void setup() {
Serial.begin(9600);
// LCD
lcd.begin(16, 2);
lcd.clear();
lcd.print("Iniciando...");
// RFID
SPI.begin();
mfrc522.PCD_Init();
// PIR
pinMode(PIN_PIR, INPUT);
// Buzzer
pinMode(PIN_BUZZER, OUTPUT);
// LED
pinMode(PIN_LED, OUTPUT); // <-- NUEVO: Configuramos el pin del LED como salida
// Botones
for (int i = 0; i < 9; i++) {
pinMode(botones[i], INPUT_PULLUP);
}
delay(1500);
lcd.clear();
lcd.print("Alarma activa");
lcd.setCursor(0, 1);
lcd.print("Esperando PIR");
Serial.println("Sistema iniciado");
}
// ================== LOOP ==================
void loop() {
// =========================
// ALARMA ACTIVADA
// =========================
if (sistemaActivo) {
// Detectar movimiento
if (!alarmaDisparada && digitalRead(PIN_PIR) == HIGH) {
alarmaDisparada = true;
indiceProgreso = 0;
errores = 0;
secuencia = "";
lcd.clear();
lcd.print("!!! ALERTA !!!");
lcd.setCursor(0, 1);
lcd.print("Movimiento");
digitalWrite(PIN_LED, HIGH); // <-- NUEVO: Enciende el LED al detectar movimiento
tone(PIN_BUZZER, 700, 500);
delay(1000);
}
// Si alarma sonando
if (alarmaDisparada) {
revisarBotones();
revisarRFID();
}
}
// =========================
// ALARMA DESACTIVADA
// =========================
else {
lcd.setCursor(0, 0);
lcd.print("Alarma OFF ");
lcd.setCursor(0, 1);
lcd.print("Ingrese clave");
revisarReactivacion();
}
}
// ================== REACTIVAR ALARMA ==================
void revisarReactivacion() {
for (int i = 0; i < 9; i++) {
if (digitalRead(botones[i]) == LOW) {
while (digitalRead(botones[i]) == LOW);
delay(50);
tone(PIN_BUZZER, notas[i], 200);
secuencia += nombresNotas[i];
secuencia += " ";
lcd.clear();
lcd.print("Activando:");
lcd.setCursor(0, 1);
lcd.print(secuencia);
// Verificar secuencia
if (i == password[indiceProgreso]) {
indiceProgreso++;
// PASSWORD CORRECTA
if (indiceProgreso >= 5) {
sistemaActivo = true;
alarmaDisparada = false;
indiceProgreso = 0;
secuencia = "";
lcd.clear();
lcd.print("ALARMA ON");
lcd.setCursor(0, 1);
lcd.print("Activada");
tone(PIN_BUZZER, 1200, 500);
delay(1500);
lcd.clear();
lcd.print("Esperando PIR");
}
} else {
indiceProgreso = 0;
secuencia = "";
lcd.clear();
lcd.print("Clave incorrecta");
tone(PIN_BUZZER, 150, 1000);
delay(1500);
}
}
}
}
// ================== BOTONES ==================
void revisarBotones() {
for (int i = 0; i < 9; i++) {
if (digitalRead(botones[i]) == LOW) {
while (digitalRead(botones[i]) == LOW);
delay(50);
tone(PIN_BUZZER, notas[i], 250);
Serial.print("Boton: ");
Serial.println(nombresNotas[i]);
secuencia += nombresNotas[i];
secuencia += " ";
lcd.clear();
lcd.print("Notas:");
lcd.setCursor(0, 1);
lcd.print(secuencia);
// Verificar password
if (i == password[indiceProgreso]) {
indiceProgreso++;
// PASSWORD COMPLETA
if (indiceProgreso >= 5) {
lcd.clear();
lcd.print("Clave Correcta");
lcd.setCursor(0, 1);
lcd.print("Desactivando");
tone(PIN_BUZZER, 1000, 700);
delay(1500);
desactivarSistema();
}
} else {
errores++;
indiceProgreso = 0;
lcd.clear();
lcd.print("ERROR");
lcd.setCursor(0, 1);
lcd.print("Secuencia mal");
tone(PIN_BUZZER, 150, 1000);
delay(1500);
secuencia = "";
lcd.clear();
lcd.print("Intentar otra");
delay(1000);
}
delay(300);
}
}
}
// ================== RFID ==================
void revisarRFID() {
if (!mfrc522.PICC_IsNewCardPresent()) {
return;
}
if (!mfrc522.PICC_ReadCardSerial()) {
return;
}
String uid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
uid += String(mfrc522.uid.uidByte[i], HEX);
}
uid.toUpperCase();
Serial.print("UID: ");
Serial.println(uid);
// CAMBIAR POR TU UID
if (uid == "1234") {
lcd.clear();
lcd.print("Tarjeta OK");
lcd.setCursor(0, 1);
lcd.print("Alarma OFF");
tone(PIN_BUZZER, 1200, 500);
delay(1000);
desactivarSistema();
} else {
lcd.clear();
lcd.print("Tarjeta NO");
lcd.setCursor(0, 1);
lcd.print("Autorizada");
tone(PIN_BUZZER, 200, 1000);
delay(1500);
}
mfrc522.PICC_HaltA();
}
// ================== DESACTIVAR ==================
void desactivarSistema() {
alarmaDisparada = false;
sistemaActivo = false;
indiceProgreso = 0;
secuencia = "";
noTone(PIN_BUZZER);
digitalWrite(PIN_LED, LOW); // <-- NUEVO: Apaga el LED al desactivar el sistema (con RFID o Botones)
lcd.clear();
lcd.print("Alarma OFF");
lcd.setCursor(0, 1);
lcd.print("Ingrese clave");
Serial.println("Sistema apagado");
}