/*
ALARMA DE SEGURIDAD DE UNA CASA
Por: Edilberto Pineda, David Arias y Diego Cardenas
Objetivo:
Uso de teclado matricial con microcontrolador.
Simulación wokwi:
Arduino :
*/
const byte ROWS = 4; // Define el número de filas y columnas del teclado matricial
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {11, 10, 9, 8}; // Conecta las filas del teclado a estos pines
byte colPins[COLS] = {7, 6, 5, 4}; // Conecta las columnas del teclado a estos pines
const int buzzerPin = 10; // Conecta el buzzer a este pin
const int sensorPin = 11; // Conecta el sensor simulado a este pin
char code[] = "7777"; // Define el código para desactivar la alarma
char enteredCode[5]; // Variable para almacenar el código ingresado por el usuario
int codeIndex = 0; // Índice actual en el código ingresado
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH); // Activa la resistencia pull-up interna
Serial.begin(9600);
}
void loop() {
char key = readKeypad();
if (key != 0) {
// Si se presiona una tecla en el teclado matricial, verifica el código
enteredCode[codeIndex] = key;
Serial.print(key); // Imprime la tecla presionada
codeIndex++;
if (codeIndex == 4) {
// Se ingresaron 4 dígitos, verifica el código ingresado
if (checkCode()) {
// Código correcto, desactiva la alarma
digitalWrite(buzzerPin, LOW);
Serial.println(" - Alarma desactivada");
} else {
// Código incorrecto, activa la alarma
digitalWrite(buzzerPin, HIGH);
Serial.println(" - Código incorrecto, alarma activada");
}
codeIndex = 0;
clearEnteredCode();
}
}
}
char readKeypad() {
for (byte r = 0; r < ROWS; r++) {
pinMode(rowPins[r], OUTPUT);
digitalWrite(rowPins[r], LOW);
for (byte c = 0; c < COLS; c++) {
if (digitalRead(colPins[c]) == LOW) {
delay(50); // Debounce
digitalWrite(rowPins[r], HIGH);
pinMode(rowPins[r], INPUT);
return keys[r][c];
}
digitalWrite(rowPins[r], HIGH);
pinMode(rowPins[r], INPUT);
}
}
return 0;
}
bool checkCode() {
for (int i = 0; i < 4; i++) {
if (enteredCode[i] != code[i]) {
return false;
}
}
return true;
}
void clearEnteredCode() {
for (int i = 0; i < 4; i++) {
enteredCode[i] = 0;
}
}