#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6LPslILFr"
#define BLYNK_TEMPLATE_NAME "Sekuritas Ruangan"
#define BLYNK_AUTH_TOKEN "g83FD3aag7R5P0H6FZSc_LmLKjWPVGnA"

#include <Wire.h>
#include <Keypad.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
Servo myservo; 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 20, 4);

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

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

byte rowPins[ROWS] = { 14, 12, 19, 18 }; 
byte colPins[COLS] = { 5, 4, 27, 15 };

Keypad customKeypad = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS);    //Masukkan info keypad pada library


char customKey;         //Variabel penampung input keypad
int number = 0;         //Variabel penampung nilai angka
int password = 1379;    //Password

#define buzzer 23
#define lampu 25
int a;
int saklar = 0;

char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";

BLYNK_WRITE(V1){
  saklar = (param.asInt());  
  if (saklar == 0) { 
    Blynk.virtualWrite(V0, "SISTEM AKSES MASUK AKTIF");
    number = 0;        
    lcd.setCursor (0, 2);
    lcd.print ("                   ");
    lcd.setCursor (0, 3);
    lcd.print ("                   ");     
    a = LOW; 
  }else{
    a = HIGH;
    number = 0;     
  } 
}

void setup() {
  pinMode(buzzer,OUTPUT);
  pinMode(lampu, OUTPUT);
  myservo.attach(2);
  myservo.write(0);
  Blynk.begin(auth, ssid, pass);
  // Mengaktifkan LCD
  lcd.init();
  lcd.backlight();
  lcd.setCursor (0, 0);
  lcd.print ("    AKSES MASUK");
  lcd.setCursor (0, 1);
  lcd.print ("PASSWORD : ");
  Blynk.virtualWrite(V0, "SISTEM AKSES MASUK AKTIF");
}
  
void loop() {
  
  if (a == LOW){  
  customKey = customKeypad.getKey();    //Baca input keypad  

  //------------Prosedur jika input berupa angka------------//
  switch(customKey){
    case '0' ... '9':      
      number = number * 10 + (customKey - '0');
      lcd.setCursor (11, 1);
      lcd.print (number);
    break;    
      
    //------------Jika input '#' maka cek password------------//
    case '#':
      if(number == password){          //Jika password benar, maka
        myservo.write(90);
        delay(15);    
        lcd.setCursor (0, 2);
        lcd.print ("                   ");     
        lcd.setCursor (0, 2);
        lcd.print (" AKSES DITERIMA");
        lcd.setCursor (0, 3);
        lcd.print ("                   ");
        lcd.setCursor (0, 3);
        lcd.print (" PINTU TERBUKA");
        digitalWrite(lampu, HIGH);
        noTone(buzzer);        
        lcd.setCursor (11, 1);
        lcd.print ("          ");
        lcd.setCursor (11, 1);
        lcd.print ("COCOK");
        number = 0; 
      }
      else{                             //Jika salah, maka
        Blynk.virtualWrite(V0, "ORANG TIDAK MEMILIKI AKSES MASUK");
        Blynk.logEvent("akses_masuk");  // Mengirim Notifikasi
        
        myservo.write(0);
        delay(15);
        lcd.setCursor (0, 2);
        lcd.print ("                   ");
        lcd.setCursor (0, 2);
        lcd.print ("AKSES DITOLAK");
        lcd.setCursor (0, 3);
        lcd.print ("                   ");
        lcd.setCursor (0, 3);
        lcd.print ("ALARAM ON RESET *");
        lcd.setCursor (11, 1);
        lcd.print ("          ");
        lcd.setCursor (11, 1);
        lcd.print ("SALAH");
        digitalWrite(lampu, LOW);
        tone(buzzer, 120); 
        number = 0;     
      }
    break;

    case 'A':
      myservo.write(0);
      delay(15);
      noTone(buzzer);
      lcd.setCursor (11, 1);
      lcd.print ("          "); 
      lcd.setCursor (0, 2);
      lcd.print ("                   ");
      lcd.setCursor (0, 2);
      lcd.print ("PINTU TERTUTUP");
      lcd.setCursor (0, 3);
      lcd.print ("                   "); 
      lcd.setCursor (0, 3);
      lcd.print ("ADA ORANG DI DALAM");
      number = 0;    
      Blynk.virtualWrite(V0, "ADA ORANG DALAM RUANGAN");
    break;

    //------------Jika input '*' maka hapus tampilan------------//
    case '*':
      myservo.write(0);
      delay(15);
      noTone(buzzer);
      lcd.setCursor (11, 1);
      lcd.print ("          ");      
      digitalWrite(lampu, LOW); 
      lcd.setCursor (0, 2);
      lcd.print ("                   ");
      lcd.setCursor (0, 3);
      lcd.print ("                   "); 
      number = 0;        
    break;
  }
  }else{
    myservo.write(0);
    delay(15);
    noTone(buzzer);
    lcd.setCursor (11, 1);
    lcd.print ("          ");      
    digitalWrite(lampu, LOW); 
    lcd.setCursor (0, 2);
    lcd.print ("                   ");
    lcd.setCursor (0, 2);
    lcd.print (" AKSES DIKUNCI");
    lcd.setCursor (0, 3);
    lcd.print ("                   "); 
    lcd.setCursor (0, 3);
    lcd.print (" OLEH PEMILIK");
    Blynk.virtualWrite(V0, "AKSES MASUK DIKUNCI"); 
    delay(1000);
    Blynk.virtualWrite(V1, 1);
    number = 0;    
  }
   Blynk.run();
}
  




NOCOMNCVCCGNDINLED1PWRRelay Module