#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Konfigurasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C dan ukuran LCD (16 kolom, 2 baris)
// Konfigurasi keypad
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns
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}; // Connect to the row pins of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; // Connect to the column pins of the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Konfigurasi relay
const int relayPin = 10; // Pin kontrol relay
const unsigned long relayDelay = 5000; // Waktu buka kunci (5 detik)
// Kode kunci
String code = "290804";
String inputCode = "";
// Variabel untuk timing
unsigned long relayStartTime = 0;
bool relayActive = false;
// Setup
void setup() {
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // Pastikan relay dalam keadaan off
lcd.begin(16, 2); // Inisialisasi LCD dengan 16 kolom dan 2 baris
lcd.backlight(); // Aktifkan backlight jika ada
lcd.print("Enter Code:");
}
// Loop
void loop() {
char key = keypad.getKey();
if (key) {
inputCode += key;
lcd.setCursor(0, 1);
lcd.print(inputCode);
if (inputCode.length() == 6) { // Panjang kode 6 digit
if (inputCode == code) {
unlockDoor();
lcd.clear();
lcd.print("Access Granted");
lcd.setCursor(0, 1);
lcd.print("Door Open");
relayActive = true;
relayStartTime = millis(); // Catat waktu saat relay diaktifkan
} else {
lcd.clear();
lcd.print("Access Denied");
}
delay(5000); // Tampilkan pesan selama 2 detik
lcd.clear();
lcd.print("Enter Code:");
inputCode = "";
}
// Reset input jika terlalu panjang
if (inputCode.length() > 6) {
inputCode = "";
lcd.clear();
lcd.print("Code Too Long");
delay(2000); // Tampilkan pesan "Code Too Long" selama 2 detik
lcd.clear();
lcd.print("Enter Code:");
}
}
// Matikan relay jika sudah lebih dari waktu yang ditentukan
if (relayActive && (millis() - relayStartTime >= relayDelay)) {
digitalWrite(relayPin, LOW); // Nonaktifkan relay (kunci kembali)
lcd.clear();
lcd.print("Enter Code:");
relayActive = false;
}
}
// Fungsi untuk membuka pintu
void unlockDoor() {
digitalWrite(relayPin, HIGH); // Aktifkan relay (buka kunci)
}