#include <Arduino.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {13, 10, A0};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
const String defaultPassword = "1234";
String currentPassword = defaultPassword;
bool isAuthenticated = false;
enum State {
ENTER_PASSWORD,
ACCESS_GRANTED,
ACCESS_DENIED,
MENU,
CHANGE_PASSWORD,
ADD_MODE,
START_MODE
};
State currentState = ENTER_PASSWORD;
String inputBuffer = "";
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
lcd.print("Enter password:");
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key == '#') {
handleInput(inputBuffer);
inputBuffer = "";
} else {
inputBuffer += key;
lcd.setCursor(inputBuffer.length() - 1, 1);
lcd.print(key);
}
}
}
void handleInput(const String &input) {
if(input=="reset" || input=="clear") currentState=ENTER_PASSWORD;
switch (currentState) {
case ENTER_PASSWORD :
enterPassword(input);
break;
case MENU:
menu(input);
break;
case CHANGE_PASSWORD:
changePassword(input);
break;
case ADD_MODE:
// Handle ADD_MODE
break;
case START_MODE:
// Handle START_MODE
break;
default:
// Handle other states
break;
}
}
void enterPassword(const String &password) {
if (password == currentPassword) {
currentState = ACCESS_GRANTED;
lcd.clear();
lcd.print("Access granted!");
delay(500);
currentState = MENU;
lcd.clear();
lcd.print("(1)Change password?");
delay(1000);
} else {
currentState = ENTER_PASSWORD;
lcd.clear();
lcd.print("Access denied!");
delay(500);
lcd.clear();
lcd.print("Enter password:");
}
}
void menu(const String &menuSelection) {
switch (menuSelection.toInt()) {
case 1:
currentState = CHANGE_PASSWORD;
lcd.clear();
lcd.print("CHANGE PASSWORD");
break;
case 2:
currentState = ADD_MODE;
lcd.clear();
lcd.print("ADD MODE");
delay(500);
break;
case 3:
currentState = START_MODE;
lcd.clear();
lcd.print("START MODE");
delay(500);
break;
default:
currentState = MENU;
break;
}
}
void changePassword(const String &newpassword) {
lcd.clear();
lcd.print("New password:");
if (newpassword.length() >= 4) {
currentPassword = newpassword;
currentState = MENU;
} else {
lcd.clear();
lcd.print("Bad Password!");
delay(500);
currentState = CHANGE_PASSWORD;
}
}