#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Definición de pines para los componentes
#define BUTTON_PIN 2 // Pin del pulsador
#define BUZZER_PIN 3 // Pin del zumbador
#define LED_PIN_1 4 // Pin del LED 1
#define LED_PIN_2 5 // Pin del LED 2
#define KEYPAD_PIN A0 // Pin analógico para el teclado numérico
// Creación de un objeto LiquidCrystal para manejar la pantalla LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);//
// Definición de la longitud de la contraseña y arrays para almacenar la contraseña ingresada y la contraseña correcta
const int passwordLength = 4; // Longitud de la contraseña
char password[passwordLength] = {'1', '2', '3', '4'}; // Contraseña correcta
char enteredPassword[passwordLength]; // Contraseña ingresada por el usuario
// Definición de las filas y columnas del teclado numérico
const byte ROWS = 4;//Número de filas del teclado numérico.
const byte COLS = 4;//Número de columnas del teclado numérico.
char keys[ROWS][COLS] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Definición de pines para las filas y columnas del teclado numérico
byte rowPins[ROWS] = {A0, A1, A2, A3};//Pines de las filas del teclado numérico.
byte colPins[COLS] = {2, 3, 4, 5};//Pines de las columnas del teclado numérico.
// Creación de un objeto Keypad para manejar el teclado numérico
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
bool alarmactiva = false; // Variable para rastrear si la alarma está activa o no
// Declaraciones de funciones
void checkButton(); // Función para verificar el pulsador
void checkKeypad(char key); // Función para verificar el teclado numérico
bool checkPassword(); // Función para verificar la contraseña ingresada
void alarm(); // Función para activar la alarma
void waitForUser(); // Función de espera visual para el usuario
void setup() { // Configuraciones iniciales, como inicialización de pines, velocidad de comunicación serial, etc.
Serial.begin(9600);//a velocidad de baudios que se utilizará para la comunicación
// Configuración de pines como entrada o salida según se necesite
pinMode(BUTTON_PIN, INPUT);//definimos si es entrada o salida, en este caso es entrada
pinMode(BUZZER_PIN, OUTPUT);//el buzzer es salida
pinMode(LED_PIN_1, OUTPUT);//el LED es salida
pinMode(LED_PIN_2, OUTPUT);//el Led2 es salida también
// Inicialización de la pantalla LCD
lcd.begin(16, 2);
lcd.print("Presiona el");//escribe el mensaje en el display
lcd.setCursor(0, 1);
lcd.print("pulsador");//escribe otro mensaje en el display
}
void loop() {// Código principal que se ejecuta en un bucle infinito
// Verificación del pulsador
if (digitalRead(BUTTON_PIN) == HIGH) {//definimos las entradas analógicas, en este caso está en alto
delay(50);//le damos un retraso
if (digitalRead(BUTTON_PIN) == HIGH) {
checkButton();
}
}
// Verificación del teclado numérico
char key = keypad.getKey();
if (key) {
checkKeypad(key);
}
// Control de la alarma
if (alarmactiva) {
// Si la alarma está activa, seguirá sonando el buzzer
tone(BUZZER_PIN, 1000);
} else {
noTone(BUZZER_PIN);
}
}
// Función para verificar el pulsador
void checkButton() {
lcd.clear();
lcd.print("Confirme pulsador");
// Espera de 5 segundos para confirmar el pulsador
waitForUser();
lcd.clear();
lcd.print("Pulsa otra vez");
unsigned long startTime = millis();
while (digitalRead(BUTTON_PIN) == HIGH) {
if ((millis() - startTime) > 3000) {
alarm();
return;
}
}
lcd.clear();
lcd.print("Pulsador confirmado");
delay(2000);
}
// Función para verificar el teclado numérico
void checkKeypad(char key) {
static int enteredCount = 0;
if (key == '#') {
if (checkPassword()) {
lcd.clear();
lcd.print("Alarma desactivada");
delay(2000);
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, LOW);
lcd.clear();
lcd.print("Presiona el");
lcd.setCursor(0, 1);
lcd.print("pulsador");
alarmactiva = false;
} else {
lcd.clear();
lcd.print("Contraseña incorrecta");
delay(2000);
alarm(); // Llamamos a la función alarm solo cuando la contraseña es incorrecta
lcd.clear();
lcd.print("Presiona el");
lcd.setCursor(0, 1);
lcd.print("pulsador");
alarmactiva = true;
}
enteredCount = 0;
memset(enteredPassword, 0, sizeof(enteredPassword));
} else {
enteredPassword[enteredCount] = key;
enteredCount++;
if (enteredCount == passwordLength) {
enteredCount = 0;
memset(enteredPassword, 0, sizeof(enteredPassword));
}
}
}
// Función para verificar la contraseña ingresada
bool checkPassword() {
for (int i = 0; i < passwordLength; i++) {
if (enteredPassword[i] != password[i]) {
return false;
}
}
return true;
}
// Función para activar la alarma
void alarm() {
lcd.clear();
lcd.print("Pulsador incorrecto");//escribe el mensaje en el display
lcd.setCursor(0, 1);
lcd.print("Intruso detectado!");//escribe el nuevo mensaje
digitalWrite(LED_PIN_1, HIGH);//asignames el estado que seria ALTO
digitalWrite(LED_PIN_2, HIGH);//asignamos el estado ALTO
alarmactiva = true;
delay(5000);
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, LOW);
alarmactiva = false;
lcd.clear();
lcd.print("Presiona el");
lcd.setCursor(0, 1);
lcd.print("pulsador");
}
// Función de espera visual para el usuario
void waitForUser() {
// Espera de 5 segundos con indicación visual
unsigned long startTime = millis();
while ((millis() - startTime) < 5000) {
// Intermitencia del LED para indicación visual
digitalWrite(LED_PIN_1, HIGH);//establecemos al led en estado alto
delay(500);// le damos otro retraso de 5 segundo
digitalWrite(LED_PIN_1, LOW);//definimos al led en estado bajo
delay(500);// le damos otro retraso de 5 segundos
}
}