i have rework little, i hope it is more clearly and easier to understand.
and if you understand then you modify it how you new wish is, like double check of new password or adding supervisor password to reset user password, or whatever.
i had pleasure to dig in this sketch. i thank you for this opportunity. i hope you have similar fun with it.
#include <Keypad.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
char password[4];
char initial_password[4], new_password[4];
int i = 0;
const int relay_pin = 11;
char key_pressed = 0;
const byte rows = 4;
const byte columns = 4;
char hexaKeys[rows][columns] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
const byte row_pins[rows] = {7, 8, 9, 10};
const byte column_pins[columns] = {3, 4, 5, 6};
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
#define isPassOK (!strncmp(password, initial_password, 4))
void setup() {
lcd.init();
lcd.backlight();
pinMode(relay_pin, OUTPUT);
digitalWrite(relay_pin, HIGH);
lcd.setCursor(5, 0);
lcd.print("B & F");
lcd.setCursor(2, 1);
lcd.print("ELECTRONICS");
delay(1000);
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("WELCOME");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ELECTRIC VEHICLE");
lcd.setCursor(0, 1);
lcd.print("CHARGING STATION");
delay(1000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("PLEASE CONNECT");
lcd.setCursor(1, 1);
lcd.print("CHARGING CABLE");
delay(1000);
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("TO YOUR");
lcd.setCursor(0, 1);
lcd.print("ELECTRIC VEHICLE");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AFTER CONNECTION");
lcd.setCursor(0, 1);
lcd.print("ENTER YOUR PIN");
delay(1000);
LCD_EntePass();
initialpassword();
}
void loop() {
key_pressed = keypad_key.getKey();
if (key_pressed == '#') change();
if (key_pressed)
{
password[i++] = key_pressed;
lcd.print('*');
delay(200);
}
if (i == 4) {
i = 0;
if (isPassOK) { // ŞIFRE DOGRU DURUMLARI
digitalWrite(relay_pin, LOW); // Röle çalışır durumda
LCD_PassOK();
}
else { // ŞIFRE YANLIŞ DURUMLARI
digitalWrite(relay_pin, HIGH); // Röle çalışır halde kalsın
LCD_WroPass();
}
LCD_EntePass();
} // if=4 döngüsü kapanış
} // voidloop kapanış
void LCD_PassOK() {
lcd.clear();
lcd.print(" PASSWORD IS");
lcd.setCursor(4, 1);
lcd.print("CORRECT");
delay(3000);
}
void LCD_EntePass() {
lcd.clear();
lcd.print(" Enter Password");
lcd.setCursor(6, 1);
}
void LCD_WroPass() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Wrong Password");
lcd.setCursor(3, 1);
lcd.print("Try Again");
delay(2000);
}
void change() {
int j = 0;
lcd.clear();
lcd.print("Current Password");
lcd.setCursor(6, 1);
while (j < 4) {
char key = keypad_key.getKey();
if (key)
{
password[j++] = key;
lcd.print(key);
}
key = 0;
}
delay(500);
if (isPassOK == false) LCD_WroPass();
else {
j = 0;
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("New Password");
lcd.setCursor(6, 1);
while (j < 4) {
char key = keypad_key.getKey();
if (key)
{
initial_password[j] = key;
lcd.print(key);
EEPROM.write(j, key);
j++;
}
key = 0;
}
lcd.clear();
lcd.print("PIN is Changed");
delay(2000);
}
LCD_EntePass();
key_pressed = 0;
}
void initialpassword() {
int j;
if (EEPROM.read(0) == 0xFF)for (j = 0; j < 4; j++)EEPROM.write(j, j + 49);//if eeprom is empty then password is "1234"
for (j = 0; j < 4; j++)initial_password[j] = EEPROM.read(j);
}