/*
    created by arduinobyme.blogspot.com
    support with click ads .. thank's :-)
*/

#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Password.h>

byte currentLength = 0;

Password password = Password("1234"); //inisialisasi password nya.
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); //inisialisasi pada LCD.

//karena tutorial ini menggunakan 4x4 jelas jadi kolom 4 dan baris 4
const byte ROWS = 4; 
const byte COLS = 4;

//inisialisasi lampu sebagai output bila password bila maka akan menyala warna biru,
//dan bila password salah akan menyala lampu merah
const int blue = 18;
const int red = 19;

//inisialisasi umum posisi untuk setiap angka dan huruf pada keypad
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

//inisialisasi colom pada keypad. urutan nya (4,3,2,1)
// jadi nomor pin pada keypad dengan 1 masuk ke pin arduino 15. 
// 2 masuk ke pin arduino 14. begitu seterusnya.
byte colPins[COLS] = {3, 2, 14, 15};  


//inisialisasi colom pada keypad. urutan nya (8,7,6,5)
// jadi nomor pin pada keypad dengan 5 masuk ke pin arduino 4. 
// 6 masuk ke pin arduino 5. begitu seterusnya.
byte rowPins[ROWS] = {7, 6, 5, 4}; 

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  //sumber diambil pada examples di library password.
  keypad.addEventListener(keypadEvent);
  lcd.begin(16,2);
  delay(1000);
  
  
}

void loop(){
  lcd.setCursor(0,0);
  lcd.print("Pass:");
  keypad.getKey();;
  
}


void checkPassword(){
   if(password.evaluate()){
      digitalWrite(blue, HIGH);
      lcd.clear();
      lcd.print("Success ...");
      delay(1000);
      digitalWrite(blue, LOW);
   } else {
      digitalWrite(red, HIGH);
      lcd.clear();
      lcd.print("Wrong ...");
      delay(1000); 
      digitalWrite(red, LOW);  
   }
}

  
void keypadEvent(KeypadEvent eKey){
  
  switch (keypad.getState()){  
    case PRESSED:
	lcd.setCursor(0,1);
        lcd.print(eKey);
	switch (eKey){
	  case '*': checkPassword(); lcd.clear(); currentLength=0;break;
	  case '#': password.reset(); lcd.clear();currentLength=0; break;
	  default:// password.append(eKey);
          password << eKey;
          currentLength++;
        
        //Print some feedback.
        lcd.setCursor(0,0);
        lcd.print("Pass: ");
        for (byte i=0; i<currentLength; i++){
            lcd.print('*');
        }
           
   }
  }
  
}