#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];
char master_password[4] = {'2', '4', '6', '8'}; // Password master
int vcc = 11;
int push_button_pin = 11;
int i = 0;
int relay_pin = 10;
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'}
};
byte row_pins[rows] = {2, 3, 4, 5};
byte column_pins[columns] = {6, 7, 8, 9};
Keypad keypad_key = Keypad(makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
int failedAttempts = 0; // Jumlah percobaan gagal
unsigned long lastFailedAttemptTime = 0; // Waktu terakhir percobaan gagal
const unsigned long cooldownPeriod = 10000; // Waktu cooldown (10 detik)
void setup() {
lcd.begin(16, 2);
lcd.backlight();
pinMode(relay_pin, OUTPUT);
pinMode(vcc, OUTPUT);
pinMode(push_button_pin, INPUT_PULLUP);
lcd.print("Electronic Lock ");
lcd.setCursor(0, 1);
lcd.print("By Excel Zona");
delay(3000);
lcd.clear();
lcd.print("Masukkan PIN:");
lcd.setCursor(0, 1);
initialpassword();
}
void loop() {
digitalWrite(relay_pin, LOW);
key_pressed = keypad_key.getKey();
if (digitalRead(push_button_pin) == LOW) { // Cek jika tombol push ditekan
digitalWrite(relay_pin, HIGH); // Aktifkan relay
delay(3000); // Tunda selama 3 detik
digitalWrite(relay_pin, LOW); // Matikan relay setelah 3 detik
}
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.print("Sandi Benar");
digitalWrite(relay_pin, HIGH);
failedAttempts = 0; // Reset jumlah percobaan gagal
delay(3000);
lcd.clear();
lcd.print("Masukkan PIN:");
lcd.setCursor(0, 1);
i = 0;
} else {
if (isCooldownActive()) {
lcd.clear();
lcd.print("Cooldown Aktif");
delay(2000);
lcd.clear();
lcd.print("Masukkan PIN:");
lcd.setCursor(0, 1);
} else {
lcd.clear();
lcd.print("Sandi Salah");
delay(2000);
lcd.clear();
lcd.print("Masukkan PIN:");
lcd.setCursor(0, 1);
i = 0;
failedAttempts++;
if (failedAttempts >= 3) {
// Jika percobaan gagal lebih dari 3 kali, mulai waktu cooldown
lastFailedAttemptTime = millis();
}
}
}
}
}
void change() {
int j = 0;
lcd.clear();
lcd.print("Sandi Saat ini:");
lcd.setCursor(0, 1);
while (j < 4) {
char key = keypad_key.getKey();
if (key) {
new_password[j++] = key;
lcd.print('*');
}
key = 0;
}
delay(500);
if ((strncmp(new_password, initial_password, 4)) && (strncmp(new_password, master_password, 4))) {
lcd.clear();
lcd.print("Sandi Salah");
lcd.setCursor(0, 1);
lcd.print("Coba Lagi");
delay(1000);
} else {
j = 0;
lcd.clear();
lcd.print("Sandi Baru:");
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.clear();
lcd.print("Sandi Diubah");
delay(1000);
}
lcd.clear();
lcd.print("Masukkan PIN:");
lcd.setCursor(0, 1);
key_pressed = 0;
}
void initialpassword() {
int j;
for (j = 0; j < 4; j++) {
initial_password[j] = EEPROM.read(j);
if (initial_password[j] == 255) { // Cek apakah EEPROM kosong
EEPROM.write(j, '1'); // Jika kosong, atur password awal
initial_password[j] = '1';
}
}
}
bool isCooldownActive() {
return millis() - lastFailedAttemptTime < cooldownPeriod;
}