#include <Keypad.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
// Kebutuhan LCD
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// Kebutuhan Servo
#define pinServo 2
Servo myServo;
// Kebutuhan Buzzer
#define pinBuzzer 52
#define restart 51
// Kebutuhan PB (Sensor Asap)
#define asap 53
// Kebutuhan Keypad
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 26, 27, 28, 29 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 22, 23, 24, 25 }; // Pins connected to R1, R2, R3, R4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// VARIABLE
String password;
int isLogin = 0;
bool isBuatKode = false;
bool isPass = false;
bool isKunci = false;
bool isBuzzer = false;
int attempt = 0;
bool isAsap = false;
// FUNGSI FUNGSI
// ========================================
void pesanAwal(){
lcd.setCursor(4,0);
String pesan = "DoorLock";
for(byte i = 0; i < pesan.length(); i++){
lcd.print(pesan[i]);
delay(100);
}
lcd.setCursor(0,1);
lcd.print("-- SMART ROOM --");
delay(2000);
}
// ========================================
void newPass(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Enter Password :");
lcd.setCursor(4,1);
lcd.print("[______]");
String code = masukkanKode();
if(password == code){
lcd.clear();
lcd.setCursor(1,0);
lcd.print("ENTER NEW PASS");
lcd.setCursor(4,1);
lcd.print("[______]");
String pass = masukkanKode();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CONFIRM NEW PASS");
lcd.setCursor(4,1);
lcd.print("[______]");
String confirm = masukkanKode();
tungguScreen(200);
if(pass == confirm){
safeEEPROM(pass);
password = pass;
isPass = true;
kunci(true);
lcd.clear();
} else {
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Password tidak");
lcd.setCursor(5,1);
lcd.print("sesuai");
delay(2000);
newPass();
}
} else {
lcd.clear();
tone(pinBuzzer, 500, 500);
lcd.setCursor(1,0);
lcd.print("Password tidak");
lcd.setCursor(5,1);
lcd.print("sesuai");
delay(1000);
newPass();
}
}
// ========================================
void login(){
lcd.clear();
lcd.setCursor(1,0);
lcd.print("ENTER PASSWORD");
lcd.setCursor(4,1);
lcd.print("[______]");
String pass = masukkanKode();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CONFIRM PASSWORD");
lcd.setCursor(4,1);
lcd.print("[______]");
String confirm = masukkanKode();
if(pass == confirm){
safeEEPROM(pass);
password = pass;
isPass = true;
kunci(true);
lcd.clear();
} else {
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Password tidak");
lcd.setCursor(5,1);
lcd.print("sesuai");
delay(2000);
login();
}
}
// ========================================
void safeEEPROM(String pass){
// safe bahwa sudah pernah login
EEPROM.write(255, 200);
// safe pass ke EEPROM
for(byte i = 0; i < pass.length(); i++){
EEPROM.write(i, pass[i]);
// Serial.println(pass[i]);
// delay(100);
}
}
// ========================================
String bacaEEPROM(){
String password = "";
for(byte i = 0; i <= 5; i++){
int data = EEPROM.read(i);
String value = String(data - 48);
password += value;
}
return password;
// Serial.println("Jadi pass nya : " + String(password));
// delay(1000);
}
// ========================================
void tungguScreen(int delayMillis) {
lcd.setCursor(2, 1);
lcd.print("[..........]");
lcd.setCursor(3, 1);
for (byte i = 0; i < 10; i++) {
delay(delayMillis);
lcd.print("=");
}
}
// ========================================
void confirm(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Enter Password :");
lcd.setCursor(4,1);
lcd.print("[______]");
String code = masukkanKode();
tungguScreen(200);
if(password == code){
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Kunci Terbuka.");
buka();
kunci(true);
lcd.clear();
} else {
if(attempt < 4){
attempt++;
lcd.clear();
tone(pinBuzzer, 500, 500);
lcd.setCursor(1,0);
lcd.print("Password tidak");
lcd.setCursor(5,1);
lcd.print("sesuai");
delay(1000);
} else {
tone(pinBuzzer, 1000);
isBuzzer = true;
lcd.clear();
delay(3000);
}
}
}
// ========================================
void kunci(bool value){
isKunci = value;
myServo.write(90);
}
void buka(){
myServo.write(180);
delay(3000);
}
// ========================================
void alarm(){
myServo.write(180);
tone(pinBuzzer, 1000, 300);
delay(200);
noTone(pinBuzzer);
delay(200);
}
// ========================================
void menu(){
char key = keypad.getKey();
if(isKunci){
lcd.setCursor(1,0);
lcd.print("Tekan # untuk");
lcd.setCursor(1,1);
lcd.print("membuka kunci.");
}
if(key == 'A'){
newPass();
} else if(key == '#'){
if(isBuzzer){
noTone(pinBuzzer);
confirm();
}
confirm();
}
}
// ========================================
String masukkanKode(){
lcd.setCursor(5, 1);
String pass = "";
while (pass.length() < 6) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
lcd.print('*');
pass += key;
}
}
return pass;
}
void setup() {
Serial.begin(9600);
pinMode(asap, INPUT_PULLUP);
pinMode(restart, INPUT_PULLUP);
lcd.init();
lcd.backlight();
myServo.attach(pinServo);
pesanAwal();
lcd.clear();
}
void loop() {
if(digitalRead(restart) == LOW){
isAsap = false;
}
isLogin = EEPROM.read(255);
if(digitalRead(asap) == LOW){
isAsap = true;
}
if(isAsap == true){
alarm();
} else {
if(isPass == false){
password = bacaEEPROM();
}
if(isLogin == 200){
kunci(true);
menu();
} else {
login();
}
}
}