#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#ifndef PASSWORD_H
#define PASSWORD_H
#define MAX_PASSWORD_LENGTH (20)
#define STRING_TERMINATOR '\0'
class Password {
public:
/**
* @brief Construct object in memory, set all variables
*
* @param pass
*/
Password(char* pass);
/**
* @brief Set the password
*
* @param pass
*/
void set(char* pass);
/**
* @brief Evaluate a string, is it equal to the password?
*
* @param pass
* @return true
* @return false
*/
bool is(char* pass);
/**
* @brief Append a char to the guessed password
*
* @param character
* @return true
* @return false
*/
bool append(char character);
/**
* @brief Reset the guessed password, one can guess again
*
*/
void reset();
/**
* @brief Is the current guessed password equal to the target password?
*
* @return true
* @return false
*/
bool evaluate();
//char* getPassword();
//char* getGuess();
//operators
/**
* @brief password using operator =
*/
Password &operator=(char* pass);
/**
* @brief Test password using ==
*/
bool operator==(char* pass);
/**
* @brief Test password using !=
*/
bool operator!=(char* pass);
/**
* @brief Append to currently guessed password using operator <<
*/
Password &operator<<(char character);
private:
char* target;
char guess[ MAX_PASSWORD_LENGTH ];
byte currentIndex;
};
#endif
Password::Password(char* pass) {
set(pass);
reset();
}
void Password::set(char* pass) { target = pass; }
bool Password::is(char* pass) {
byte i = 0;
while (*pass && i < MAX_PASSWORD_LENGTH) {
guess[i] = pass[i];
i++;
}
return evaluate();
}
bool Password::append(char character) {
if (currentIndex + 1 == MAX_PASSWORD_LENGTH) {
return false;
} else {
guess[currentIndex++] = character;
guess[currentIndex] = STRING_TERMINATOR; // ensure a valid c string
}
return true;
}
void Password::reset() {
currentIndex = 0;
guess[currentIndex] = STRING_TERMINATOR;
}
bool Password::evaluate() {
char pass = target[0];
char guessed = guess[0];
for (byte i = 1; i < MAX_PASSWORD_LENGTH; ++i) {
// check if guessed char is equal to the password char
if ((STRING_TERMINATOR == pass) && (STRING_TERMINATOR == guessed)) {
return true; // both strings ended and all previous characters are equal
} else if ((pass != guessed) || (STRING_TERMINATOR == pass) ||
(STRING_TERMINATOR == guessed)) {
return false; // difference OR end of string has been reached
}
// read next char
pass = target[i];
guessed = guess[i];
}
return false; // a 'true' condition has not been met
}
Password& Password::operator=(char* pass) {
set(pass);
return *this;
}
bool Password::operator==(char* pass) { return is(pass); }
bool Password::operator!=(char* pass) { return !is(pass); }
Password& Password::operator<<(char character) {
append(character);
return *this;
}
#define buzzer 11
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
String newPasswordString; //hold the new password
char newPassword[6]; //charater string of newPasswordString
byte a = 5;
bool value = true;
Password password = Password("0123"); //Enter your password
byte maxPasswordLength = 6;
byte currentPasswordLength = 0;
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns
char keys[ROWS][COLS] = {
{'D', 'C', 'B', 'A'},
{'#', '9', '6', '3'},
{'0', '8', '5', '2'},
{'*', '7', '4', '1'},
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8, 9};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
servo.attach(10);
servo.write(50);
lcd.init();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("WELCOME TO");
lcd.setCursor(0, 1);
lcd.print("DOOR LOCK SYSTEM");
delay(3000);
lcd.clear();
}
void loop() {
lcd.setCursor(1, 0);
lcd.print("ENTER PASSWORD");
char key = keypad.getKey();
if (key != NO_KEY) {
delay(60);
if (key == 'C') {
resetPassword();
} else if (key == 'D') {
if (value == true) {
doorlocked();
value = false;
} else if (value == false) {
dooropen();
value = true;
}
} else {
processNumberKey(key);
}
}
}
void processNumberKey(char key) {
lcd.setCursor(a, 1);
lcd.print("*");
a++;
if (a == 11) {
a = 5;
}
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
doorlocked();
dooropen();
}
}
void dooropen() {
if (password.evaluate()) {
digitalWrite(buzzer, HIGH);
delay(300);
digitalWrite(buzzer, LOW);
servo.write(50);
delay(100);
lcd.setCursor(0, 0);
lcd.print("CORRECT PASSWORD");
lcd.setCursor(0, 1);
lcd.print("DOOR OPENED");
delay(2000);
lcd.clear();
a = 5;
} else {
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
lcd.setCursor(0, 0);
lcd.print("WRONG PASSWORD!");
lcd.setCursor(0, 1);
lcd.print("PLEASE TRY AGAIN");
delay(2000);
lcd.clear();
a = 5;
}
resetPassword();
}
void resetPassword() {
password.reset();
currentPasswordLength = 0;
lcd.clear();
a = 5;
}
void doorlocked() {
if (password.evaluate()) {
digitalWrite(buzzer, HIGH);
delay(300);
digitalWrite(buzzer, LOW);
servo.write(110);
delay(100);
lcd.setCursor(0, 0);
lcd.print("CORRECT PASSWORD");
lcd.setCursor(2, 1);
lcd.print("DOOR LOCKED");
delay(2000);
lcd.clear();
a = 5;
} else {
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
lcd.setCursor(0, 0);
lcd.print("WRONG PASSWORD!");
lcd.setCursor(0, 1);
lcd.print("PLEASE TRY AGAIN");
delay(2000);
lcd.clear();
a = 5;
}
resetPassword();
}
its show error
ReplyDeleteconcordo
Deleteeuhgeuighuuirgbef fb
ReplyDeletehow do you instantly put the code in?
ReplyDeletefor the door lock how will we re-lock it
ReplyDeletedamn it ,
ReplyDeleteis inservible
the screen wont turn on and whats the password?
ReplyDeleteREAD THROUGH ALL THE CODE
Deletetanks
ReplyDeletetanks
ReplyDelete
ReplyDeletethank you sooo much
it is showing errors
ReplyDeletewhat the fuck
ReplyDelete