#include <ESP32Servo.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h> 
#include <Wire.h>

const byte ROWS = 4;    //Jumlah baris keypad
const byte COLS = 4;    //Jumlah kolom keypad

#define vm 32
#define vd 5
#define buzzer 4

#define SDA 23 //Define pinos SDA 
#define SCL 22 //Define pinos SCL
LiquidCrystal_I2C lcd(0x27,16,2);

char customKey; 
int number = 0;  
int password = 1234;

// SERVOMOTORCONFIGS
int anguloServo = 0;
Servo servo;
int pinServo=2;

char Keys[ROWS][COLS] = {  
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {14,13,12,15};
byte colPins[COLS] = {21,27,25,26};

Keypad customKeypad = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS);

int contador = 0;

void setup() {
pinMode(vm, OUTPUT);
pinMode(vd, OUTPUT);
pinMode(buzzer, OUTPUT);

  // LCD
  Wire.begin(SDA, SCL); // Conecta o pino I2C. 
  lcd.init(); // Inicialização do drive do LCD
  lcd.backlight(); // Acende a luz de fundo

  servo.attach(pinServo, 500, 2500);
}

void loop() {
  digitalWrite(vm, 0);
  digitalWrite(vd, 0);

  lcd.setCursor(0,0);
  lcd.print("Digite a Senha:");

  customKey = customKeypad.getKey();
    switch(customKey){
    case '0' ... '9':
      lcd.setCursor(0,1);
      number = number * 10 + (customKey - '0');
      lcd.print(number);
      digitalWrite(buzzer, 1);
      delay(300);
      digitalWrite(buzzer, 0);
    break;

  case '#':
      if(number == password){          
        lcd.setCursor(0,1);
        lcd.print("Acesso Liberado"); 
        servo.write(anguloServo); 
        digitalWrite (vd, HIGH);
        digitalWrite (vm, LOW);
        delay (2000);
        number = 0;
        lcd.clear(); 
        servo.write(90);
      }
  else{                             
        lcd.setCursor(0,1);
        lcd.print("Acesso Negado");  
        digitalWrite (vd, LOW);
        digitalWrite (vm, HIGH);
        contador++;
        delay(2000);
        number = 0;
        lcd.clear();
      }
    break;
    }

  if (contador == 5) { // Se a LED vermelha acendeu 5 vezes
    for (int i = 0; i < 5; i++) { // Repete o alarme 5 vezes
      lcd.setCursor(6,0);
      lcd.print("ALARME");
      lcd.setCursor(4,1);
      lcd.print("DISPARADO");
      digitalWrite(buzzer, HIGH); // Liga o buzzer
      delay(500); // Aguarda 0,5 segundos
      digitalWrite(buzzer, LOW); // Desliga o buzzer
      delay(500); // Aguarda 0,5 segundos
      lcd.clear();
    }
    contador = 0; // Reinicia o contador
  }
}
$abcdeabcde151015202530fghijfghij