#include <Keypad.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
char password[4]; // 1234
char initial_password[4], new_password[4];
int i = 0;
int relay_pin = 11;
char key_pressed = 0;
#define setupDelay 5000
#define setupDelay 200
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'}
};
// byte row_pins[rows] = {7, 8, 9, 10};
// byte column_pins[columns] = {3, 4, 5, 6};
byte row_pins[rows] = {5, 4, 3, 2};
byte column_pins[columns] = {A3, A2, A1, A0};
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
void setup() {
lcd.init();
lcd.backlight();
pinMode(relay_pin, OUTPUT);
digitalWrite(relay_pin, HIGH); // LOCK
lcd.setCursor(5, 0);
lcd.print("B & F");
lcd.setCursor(2, 1);
lcd.print("ELECTRONICS");
delay(setupDelay);
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("WELCOME");
delay(setupDelay);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ELECTRIC VEHICLE");
lcd.setCursor(0, 1);
lcd.print("CHARGING STATION");
delay(setupDelay);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("PLEASE CONNECT");
lcd.setCursor(1, 1);
lcd.print("CHARGING CABLE");
delay(setupDelay);
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("TO YOUR");
lcd.setCursor(0, 1);
lcd.print("ELECTRIC VEHICLE");
delay(setupDelay);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AFTER CONNECTION");
lcd.setCursor(0, 1);
lcd.print("ENTER YOUR PIN");
delay(setupDelay);
lcd.clear();
lcd.print(" Enter Password");
lcd.setCursor(6, 1);
initialpassword();
}
void loop() {
digitalWrite(relay_pin, HIGH); // LOCK
key_pressed = keypad_key.getKey();
if (key_pressed == '#')
change();
if (key_pressed)
{
password[i++] = key_pressed;
lcd.print('*');
}
if (i == 4)
{
delay(200);
for (int j = 0; j < 4; j++)
initial_password[j] = EEPROM.read(j);
if (!(strncmp(password, initial_password, 4))) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("PASSWORD IS");
lcd.setCursor(4, 1);
lcd.print("CORRECT");
digitalWrite(relay_pin, LOW); // OPEN
delay(8000);
lcd.setCursor(0, 0);
lcd.print("to set new pin");
lcd.setCursor(0, 1);
lcd.print("Press >#< button");
delay(5000);
lcd.clear();
lcd.print(" Enter Password");
lcd.setCursor(0, 1);
i = 0;
}
else {
digitalWrite(relay_pin, HIGH); // LOCK
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Wrong Password");
lcd.setCursor(3, 1);
lcd.print("Try Again");
delay(2000);
lcd.setCursor(0, 0);
lcd.print("Press >#< button");
lcd.setCursor(0, 1);
lcd.print("to set new pin");
delay(2000);
lcd.clear();
lcd.print(" Enter Password");
lcd.setCursor(0, 1);
i = 0;
}
}
}
void change() {
int j = 0;
lcd.clear();
lcd.print("Current Password");
lcd.setCursor(0, 1);
while (j < 4) {
char key = keypad_key.getKey();
if (key)
{
new_password[j++] = key;
lcd.print(key);
}
key = 0;
}
delay(500);
if ((strncmp(new_password, initial_password, 4))) {
lcd.clear();
lcd.print("Wrong Password");
lcd.setCursor(0, 1);
lcd.print("Try Again");
delay(1000);
}
else {
j = 0;
lcd.clear();
lcd.print("New Password");
lcd.setCursor(0, 1);
while (j < 4) {
char key = keypad_key.getKey();
if (key)
{
initial_password[j] = key;
lcd.print(key);
EEPROM.write(j, key);
j++;
}
}
lcd.print("PIN is Changed");
delay(1000);
}
lcd.clear();
lcd.print(" Enter Password");
lcd.setCursor(0, 1);
key_pressed = 0;
}
void initialpassword() {
int j;
for (j = 0; j < 4; j++)
EEPROM.write(j, j + 49);
for (j = 0; j < 4; j++)
initial_password[j] = EEPROM.read(j);
}
/*
+-----------------------------------+
| +---|EXT|--------|USB|---+ | +---------------+
| | PWR A5/SCL |-------|--| SCL LCD 1602 |
| | A4/SDA |-------|--| SDA | +-----+
| | UNO AREF | +--|--| GND | +----|LOCK+|
| | GND |----+ +--| VCC | | +--|LOCK-|
| | IOREF SCK/D13 | | | +---------------+ | | +-----+
| | RST DI/D12 | | | +---------------+ | | +-----+
| | 3V3 DO/D11~|----|--|--|SIG RELAY N/C|--+ +--| PS- |
+--| +5V D10~| | +--|VCC COM|-------| PS+ |
| GND D9~| +-----|GND N/O| +-----+
| GND D8 | +---------------+ ||
| Vin D7 | +---------------+ ++===(mains)
| D6~| | KEYPAD |
+--------| A0 D5~|--------R4| 1 2 3 A |
| +------| A1 D4 |--------R3| 4 5 6 B |
| | +----| A2 INT1/D3 |--------R2| 7 8 9 C |
| | | +--| A3 INT0/D2~|--------R1| * 0 # D |
| | | | | A4/DA RS CK DI TX>D1 | +---------------+
| | | | | A5/CL GD D0 5V RX<D0 | C C C C
| | | | +------------------------+ 1 2 3 4
| | | | | | | |
| | | +------------------------------------------+ | | |
| | +-----------------------------------------------+ | |
| +----------------------------------------------------+ |
+---------------------------------------------------------+
*/