/*--- Challenge 2: Smart Password Keypad dengan Output Teks LCD dan LED
I Nengah Arnawa
IoT4-8
---*/
#include <Keypad.h> //mengambil library keypad
#include <LiquidCrystal_I2C.h>  //mengambil library LCD

#define  BARIS 4  //definisikan jumlah baris keypad
#define  KOLOM 4  //definisikan jumlah kolom keypad
#define ledhijau 23
#define ledmerah 32

char tuts[BARIS][KOLOM] = { //tuts maksudnya tombol keypad, ini mirip matriks
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[BARIS] = {14, 12, 19, 18}; //di pin mana input baris terhubung
byte colPins[KOLOM] = {5, 4, 2, 15};    //di pin mana input kolom terhubung di esp32

//menggunakan isian dari library keypad
Keypad keypadnya = Keypad(makeKeymap(tuts), rowPins, colPins, BARIS, KOLOM);
//menggunakan isian dari librari LCD
LiquidCrystal_I2C layar(0x27, 16, 2);

//inputan user
int nomor = 0;
int sandi = 4567; //passwordnya


int kolomCursor = 0;  //kolom kursor tempat mengetik ada 16
int barisCursor = 0;  //baris kursor tempat mengetik hanya 0 dan 1 karena 16x2

void setup() {
  layar.init(); //mungkin untuk menyiapkan Layar LCD
  layar.backlight(); // untuk menghidupkan lampu latar belakang layar
  pinMode(ledmerah, OUTPUT);
  pinMode(ledhijau, OUTPUT);
  Serial.begin(115200); // nanti saya ada menampilkan layar serial kalau tulisan penuh
}

void loop() {
  char ketikan = keypadnya.getKey();  //menyuruh untuk mengambil data tuts yng ditekan
  layar.setCursor(kolomCursor, barisCursor);//letakkan kursor di awal
  layar.print("Password:"); //muncul ini di lcd

  switch (ketikan) {  //bila ada ketikan, bilamana:
    case '0'...'9':
      layar.setCursor(kolomCursor, barisCursor + '1'); //mulai menulis di baris berikutnya
      nomor = nomor * 10 + (ketikan - '0'); //membuat nomor yang diketik muncul sebagai satuan terakhir
      layar.print(nomor);     //menyuruh layar mencetak ketikan tuts
      break;

    case '#':
      if (nomor == sandi) {
        layar.clear();
        layar.setCursor(kolomCursor, barisCursor);
        layar.print("Accepted!");
        digitalWrite(ledhijau, HIGH);
        Serial.println("Password BENAR");
        delay(2000);
        layar.clear();
        nomor = 0;
        

      }
      else {
        layar.clear();
        layar.setCursor(kolomCursor, barisCursor);
        layar.print("Access Denied!");
        digitalWrite(ledmerah, HIGH);
        Serial.println("Password SALAH");
        delay(2000);
        nomor = 0;
        layar.clear();
        

      }
      break;
    case'*':
      nomor = 0;
      layar.clear();
      delay(1000);
      break;
  }
  digitalWrite(ledmerah, LOW);
  digitalWrite(ledhijau, LOW);
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
led1:A
led1:C
led2:A
led2:C
r1:1
r1:2
r2:1
r2:2