// Sistema de segruidad de una puerta con contraseña y alarma.
// ------ Conexiones ---------
// Servo motor: GND/VSS, VDD/5V, Salida digital pin 5.
// Alarma: GND/VSS, Salida digital pin 4.
// Display I2C: GND/VSS, VDD/5V, SDA/A4, SCL/A5.
// Sensor ultrasonico: GND/VSS, VDD/5V, TRIG/A0, ECHO/A1.
// Teclado 4x4: Primeros 4 pines (9,8,7,6), Segundos 4 pines (13,12,11,10).
// Led rojo: Anodo (+) Pin digital 3. Catodo (-) Resistencia 220 y a GND.
// Led verde:Anodo (+) Pin digital 2. Catodo (-) Resistencia 220 y a GND.
#include <Keypad.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Servo myServo; // Inicializa un objeto de tipo Servo para controlar el servo motor
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inicializa el objeto LCD usando la librería LiquidCrystal_I2C
const byte ROWS = 4; // Número de filas del teclado matricial
const byte COLS = 4; // Número de columnas del teclado matricial
// Matriz que representa las teclas del teclado
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Pines conectados a las filas del teclado
byte colPins[COLS] = {13, 12, 11, 10}; // Pines conectados a las columnas del teclado
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Inicializa el teclado matricial
int ledVerde = 2; // Pin para el LED verde
int ledRojo = 3; // Pin para el LED rojo
String password = "1234"; // Clave de seguridad
String inputPassword; // Variable para almacenar la clave introducida por el usuario
const int trigPin = A0; // Pin del módulo de trasmisor del sensor ultrasónico
const int echoPin = A1; // Pin del módulo de receptor del sensor ultrasónico
const int buzzer = 4; // Pin del zumbador
bool buzzerOn = false; // Variable para controlar si el zumbador está activo
void setup() {
lcd.init(); // Inicializa la pantalla LCD
lcd.backlight(); // Enciende la luz de fondo de la pantalla LCD
myServo.attach(5); // Adjunta el servo al pin 5
pinMode(ledVerde, OUTPUT); // Configura el pin del LED verde como salida
pinMode(ledRojo, OUTPUT); // Configura el pin del LED rojo como salida
pinMode(trigPin, OUTPUT); // Configura el pin del módulo de trasmisor del sensor ultrasónico como salida
pinMode(echoPin, INPUT); // Configura el pin del módulo de receptor del sensor ultrasónico como entrada
pinMode(buzzer, OUTPUT); // Configura el pin del zumbador como salida
}
void loop() {
lcd.setCursor(0,0); // Establece la posición del cursor en la pantalla LCD
lcd.print("Escribir clave:"); // Muestra el mensaje en la pantalla LCD para escribir la clave
inputPassword = ""; // Inicializa la variable de la clave ingresada
while(inputPassword.length() < 4){ // Bucle para recopilar 4 dígitos como clave
char key = keypad.getKey(); // Obtiene la tecla presionada
if(key){ // Si se presiona una tecla
inputPassword += key; // Agrega la tecla presionada a la clave
}
}
if(inputPassword == password){ // Si la clave ingresada es correcta
buzzerOn = false; // Apaga el zumbador
noTone(buzzer); // Detiene cualquier tono que esté sonando en el zumbador
lcd.clear(); // Limpia la pantalla LCD
lcd.setCursor(0,0); // Establece la posición del cursor en la pantalla LCD
lcd.print("Clave Correcta!"); // Muestra "Clave Correcta!" en la pantalla LCD
digitalWrite(ledVerde, HIGH); // Enciende el LED verde
myServo.write(180); // Mueve el servo a 180 grados
delay(3000); // Espera 3 segundos
myServo.write(90); // Mueve el servo a 90 grados
} else { // Si la clave ingresada es incorrecta
lcd.clear(); // Limpia la pantalla LCD
lcd.setCursor(0,0); // Establece la posición del cursor en la pantalla LCD
lcd.print("Clave Incorrecta!"); // Muestra "Clave Incorrecta!" en la pantalla LCD
digitalWrite(ledRojo, HIGH); // Enciende el LED rojo
delay(3000); // Espera 3 segundos
digitalWrite(ledRojo, LOW); // Apaga el LED rojo
long duration, distance; // Variables para medir la distancia con el sensor ultrasónico
digitalWrite(trigPin, LOW); // Inicia el pulso del sensor ultrasónico
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // Mide la duración del pulso
distance = (duration / 2) / 29.1; // Calcula la distancia en centímetros
if (distance <= 2 && !buzzerOn) { // Si la distancia es menor o igual a 2 y el zumbador no está activo
buzzerOn = true; // Activa el zumbador
tone(buzzer, 2000); // Genera un tono de 1000 Hz en el zumbador
}
}
delay(100); // Pequeña pausa antes de repetir el bucle
}