#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++;
    }
  } 
}