#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
Servo myservo; // Servo object
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD dengan I2C address 0x27
// Keypad configuration
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; // Pin row dihubungkan ke pin digital Arduino
byte colPins[COLS] = {5, 4, 3, 2}; // Pin kolom dihubungkan ke pin digital Arduino
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String password = "3242"; // Password default sistem
String inputPassword = ""; // Buffer untuk password yang diinput
String newPassword = ""; // Buffer untuk password baru
bool locked = true; // Status kunci
bool settingNewPassword = false; // Status setting password baru
bool verifyPasswordMode = false; // Menyimpan status apakah sedang dalam mode
//verifikasi password untuk mengganti password
#define MAX_PASSWORD_LENGTH 6 //batas maks password
void setup() {
myservo.attach(10); // Hubungkan servo ke pin 10
lcd.begin(20,4);
lcd.init();
lcd.backlight();
lcd.setCursor(1,1);
lcd.print("PrIvAtE sPaCe bOX");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
myservo.write(0); // Posisi servo terkunci
}
void loop() {
char key = keypad.getKey();
if (key) {
if (settingNewPassword) {
// Proses setting password baru
handleNewPasswordInput(key);
} else {
// Proses input password untuk membuka kunci
handlePasswordInput(key);
}
}
}
void handlePasswordInput(char key) {
if (key == '#') { // Konfirmasi password yang diinput
if (verifyPasswordMode) {
// Jika sedang dalam mode verifikasi password untuk mengganti password
if (inputPassword == password) {
lcd.clear();
lcd.setCursor(1, 1);
lcd.print("Correct Password :D");
delay(2000);
settingNewPassword = true; // Mengizinkan untuk mengatur password baru
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set New Password:");
} else {
lcd.clear();
lcd.setCursor(1, 1);
lcd.print("Wrong Password :(");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
}
verifyPasswordMode = false; // Kembali ke mode normal
} else if (inputPassword == password) {
lcd.clear();
lcd.setCursor(1, 1);
lcd.print("Access Granted :D");
delay(800);
myservo.write(90); // Buka kunci (servo bergerak)
locked = false; // Brankas terbuka
delay(5000); // Waktu buka kunci
myservo.write(0); // Kunci kembali
locked = true; // Brankas terkunci kembali
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
} else {
lcd.clear();
lcd.setCursor(1, 1);
lcd.print("Access Denied :(");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
}
inputPassword = ""; // Reset input password
} else if (key == '*') {
inputPassword = ""; // Reset jika tombol * ditekan
lcd.setCursor(0, 1);
lcd.print(" "); // Hapus baris password di layar LCD
} else if (key == 'A') {
// Mode untuk mengganti password, tetapi harus verifikasi password lama dulu
verifyPasswordMode = true; // Aktifkan mode verifikasi password
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Verify Password:");
inputPassword = ""; // Reset input password untuk verifikasi
} else {
if (inputPassword.length() < MAX_PASSWORD_LENGTH) {
inputPassword += key; // Tambahkan input dari keypad ke buffer password
lcd.setCursor(0, 1);
// Tampilkan '*' sebagai pengganti password yang sedang diinput
lcd.print(" "); // Hapus baris password sebelumnya untuk mencegah tampilan bertumpuk
lcd.setCursor(0, 1); // Kembali ke awal baris kedua
for (int i = 0; i < inputPassword.length(); i++) {
lcd.print('*');
}
} else{
lcd.clear();
lcd.setCursor(1, 1);
lcd.print("Password Max 6");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
for (int i = 0; i < inputPassword.length(); i++) {
lcd.print('*');
}
}
}
}
void handleNewPasswordInput(char key) {
if (key == '#') { // Konfirmasi password baru
password = newPassword; // Set password baru
lcd.clear();
lcd.setCursor(1, 1);
lcd.print("Password Updated");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Password:");
settingNewPassword = false; // Kembali ke mode input password normal
newPassword = ""; // Reset buffer password baru
} else if (key == '*') {
newPassword = ""; // Reset jika tombol * ditekan
lcd.setCursor(0, 1);
lcd.print(" "); // Menghapus baris kedua
} else {
if (newPassword.length() < MAX_PASSWORD_LENGTH){
newPassword += key; // Tambahkan input dari keypad ke buffer password baru
lcd.setCursor(0, 1);
// Tampilkan '*' untuk setiap karakter yang diinput
lcd.print(" "); // Hapus baris password sebelumnya
lcd.setCursor(0, 1); // Kembali ke awal baris kedua
for (int i = 0; i < newPassword.length(); i++) {
lcd.print('*');
}
} else {
lcd.clear();
lcd.setCursor(1, 1);
lcd.print("Password Max 6");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set New Password:");
lcd.setCursor(0, 1);
for (int i = 0; i < newPassword.length(); i++) {
lcd.print('*');
}
}
}
}