//Libraries
#include <LiquidCrystal.h>
#include <Keypad.h>
/*-------------------------------KEYPAD---------------------------------------*/
const byte numRows= 4; //number of rows on the keypad
const byte numCols= 4; //number of columns on the keypad
char keypressed;
char keymap[numRows][numCols]=
{
{'7','8','9','A'},
{'4','5','6','B'},
{'1','2','3','C'},
{'*','0','#','D'}
};
//Code that shows the the keypad connections to the arduino terminals
byte rowPins[numRows] = {4, 5, 6, 7};//Rows 0 to 3
byte colPins[numCols] = {0, 1, 2, 3};//Columns 0 to 3
//initializes an instance of the Keypad class
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
/*-------------------------------CONSTANTS------------------------------------*/
LiquidCrystal lcd(13,12,11,10,9,8); //LCD
const int buzzer = A1; //Buzzer/small speaker
const int lock = A3; //Electric door opener
/*-------------------------------VARIABLES------------------------------------*/
String password
="1234"; //Variable to store the current password
String tempPassword=""; //Variable to store the input password
int doublecheck; //Check twice the new passoword
boolean armed = false; //Variable for system state (armed:true / unarmed:false)
boolean input_pass; //Variable for input password (correct:true / wrong:false)
boolean storedPassword = true;
boolean changedPassword = false;
boolean checkPassword = false;
int i = 1; //variable to index an array
/*----------------------------------------------------------------------------*/
void setup(){
pinMode(lock,OUTPUT);
lcd.begin(16, 2); //Setup the LCD's number of columns and rows
//Print welcome message...
lcd.setCursor(0,0);
lcd.print(" LES CIMENTS DE ");
lcd.setCursor(4,1);
lcd.print(" BIZERTE ");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
}
void loop() { //Main loop
unlockTheDoor();
}
/********************************FUNCTIONS*************************************/
void unlockTheDoor(){
lockAgain: //goto label
tempPassword="";
lcd.clear();
i=6;
noTone(buzzer);
digitalWrite(lock, LOW);
while(!checkPassword){
lcd.setCursor(0,0);
lcd.print("ENTER PASSWORD: ");
lcd.setCursor(0,1);
lcd.print("PASS>");
keypressed = myKeypad.getKey(); //Read pressed keys
if (keypressed != NO_KEY){ //Accept only numbers and * from keypad
if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
keypressed == '8' || keypressed == '9' ){
tempPassword += keypressed;
lcd.setCursor(i,1);
lcd.print("*"); //Put * on lcd
i++;
tone(buzzer,800,200); //Button tone
}
else if (keypressed == 'C'){
changePassword();
goto lockAgain;
}
else if (keypressed=='#'){
break;
}
else if (keypressed == 'A'){ //Check for password
if (password==tempPassword){//If it's correct...
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Correct password");
lcd.setCursor(0,1);
lcd.print("Door is unlocked");
tone(buzzer,100); //Play a tone while door is unlocked
digitalWrite(lock, HIGH);//unlock the door for 5 seconds
delay(5000);
goto lockAgain;
}
else{ //if it's false, retry
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Password incorrect");
lcd.setCursor(0,1);
lcd.print("Try again ... ");
delay(500);
tempPassword="";
tone(buzzer,500,200);
delay(300);
tone(buzzer,500,200);
delay(300);
goto lockAgain;
}
}
}
}
}
//Change current password
void changePassword(){
retry: //label for goto
tempPassword="";
lcd.clear();
i=1;
while(!changedPassword){ //Waiting for current password
keypressed = myKeypad.getKey(); //Read pressed keys
lcd.setCursor(0,0);
lcd.print("CURRENT PASSWORD");
lcd.setCursor(0,1);
lcd.print(">");
if (keypressed != NO_KEY){
if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
keypressed == '8' || keypressed == '9' ){
tempPassword += keypressed;
lcd.setCursor(i,1);
lcd.print("*");
i++;
tone(buzzer,800,200);
}
else if (keypressed=='#'){
break;
}
else if (keypressed == 'A'){
i=1;
if (password==tempPassword){
storedPassword=false;
tone(buzzer,500,200);
newPassword(); //Password is corrent, so call the newPassword function
break;
}
else{ //Try again
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Password incorrect");
lcd.setCursor(0,1);
lcd.print("Try again ... ");
delay(1000);
tempPassword="";
tone(buzzer,500,200);
delay(300);
tone(buzzer,500,200);
delay(300);
goto retry;
}
}
}
}
}
String firstpass;
//Setup new password
void newPassword(){
tempPassword="";
changedPassword=false;
lcd.clear();
i=1;
while(!storedPassword){
keypressed = myKeypad.getKey(); //Read pressed keys
if (doublecheck==0){
lcd.setCursor(0,0);
lcd.print("SET NEW PASSWORD");
lcd.setCursor(0,1);
lcd.print(">");
}
else{
lcd.setCursor(0,0);
lcd.print("One more time...");
lcd.setCursor(0,1);
lcd.print(">");
}
if (keypressed != NO_KEY){
if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
keypressed == '8' || keypressed == '9' ){
tempPassword += keypressed;
lcd.setCursor(i,1);
lcd.print("*");
i++;
tone(buzzer,800,200);
}
else if (keypressed=='#'){
break;
}
else if (keypressed == 'A'){
if (doublecheck == 0){
firstpass=tempPassword;
doublecheck=1;
newPassword();
}
if (doublecheck==1){
doublecheck=0;
if (firstpass==tempPassword){
i=1;
firstpass="";
password = tempPassword; // New password saved
tempPassword="";//erase temp password
lcd.setCursor(0,0);
lcd.print("PASSWORD CHANGED");
lcd.setCursor(0,1);
lcd.print("----------------");
storedPassword=true;
tone(buzzer,500,400);
delay(2000);
lcd.clear();
break;
}
else{
firstpass="";
newPassword();
}
}
}
}
}
}