#include <Keypad.h>
#include <ESP32Servo.h>
#include <ezButton.h>
#define BUTTON_PIN 16 // PIN DEL BOTON
#define SERVO_PIN 21 // PIN DEL SERVO
ezButton button(BUTTON_PIN); // Asignar BUTTON_PIN
Servo myservo; //Crear objeto myservo
//VARIABLES//
int angle = 0; //Angulo inicial del servo
char Str[4] = {'-', '-', '-', '-'};
int character = 0; //Variable de orden del digito
int activated =0; // Estado de la cerradura -> 2=abierto, 0=cerrado
//Configuración del Keypad//
const uint8_t ROWS = 4; // define numero de filas
const uint8_t COLS = 4; // define numero de filas
// define la distribucion de teclas
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 4, 0, 2, 15 }; // pines correspondientes a las filas
uint8_t rowPins[ROWS] = { 19, 18, 5, 17 }; // pines correspondientes a las columnas
// crea objeto con los prametros creados previamente
Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
//Funcionamiento de la cerradura
void setup() {
Serial.begin(9600); // Serial inicial
button.setDebounceTime(50); // Delay antirebote
myservo.attach(SERVO_PIN); // Enlaza myservo con el pin del servo
myservo.write(angle); //Asigna el angulo inicial a myservo
}
void loop() {
button.loop(); //Bucle del boton
if (button.isPressed()) {
//Cambiando angulo del servo
if (angle == 0){
angle = 180;
activated = 2;
Serial.print("Puerta abierta \n");
}
else if (angle == 180){
angle=0;
activated = 0;
character=0;
Serial.print("Puerta cerrada \n");
for (int i = 0; i < 4; i++) {
Str[i] = '-';
}
}
// control servo motor
myservo.write(angle);
}
///////////////PEDIR CONTRASEÑA-KEYPAD OPEN/CLOSE////////////
char customKey = customKeypad.getKey(); //Variable de la contraseña
if (customKey){
if(customKey == 'B' )
{
angle=0;
myservo.write(angle);
activated = 0;
character=0;
for (int i = 0; i < 4; i++) {
Str[i] = '-';
}
Serial.print("borrar y cerrar \n");
}
else if (customKey == 'A' && character == 4) {
// Iniciar la verificación al presionar A con 4 dígitos ingresados
if (Str[0] == '1' && Str[1] == '2' && Str[2] == '3' && Str[3] == '4') {
// Contraseña correcta
angle = 180;
myservo.write(angle);
activated = 2;
Serial.print("contraseña correcta, abierto \n");
}
else {
// Contraseña incorrecta
character = 0;
for (int i = 0; i < 4; i++) {
Str[i] = '-';
}
activated = 0;
Serial.print("contraseña incorrecta \n");
}
}
else if(character<4){
Str[character] = customKey;
Serial.print(customKey);
character++;
}
}
}