//Smart Door - Smart Home By Afrand Syahromi get helps from gpt and Arduino Web.
// Memasang library
#include <Keypad.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
// Konfigurasi keypad
const byte baris = 4;
const byte kolom = 4;
char keys[baris][kolom] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_baris[] = {10, 11, 12, 13};
byte pin_kolom[] = {2, 3, 4, 5};
Keypad keypad = Keypad(makeKeymap(keys), pin_baris, pin_kolom, baris, kolom);
// Konfigurasi servo
Servo servo;
// Konfigurasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Konfigurasi LED, buzzer dan pir motion
const int ledMerah = 8;
const int ledHijau = 9;
const int ledKuning = A0;
const int buzzer = 7;
const int pir = 0;
int pirState = LOW; // Variabel untuk menyimpan status sensor PIR
int val = 0;
// Variabel
String password = "3628"; // Password untuk menjalankan Servo
String input = "";
void setup() {
Serial.begin(9600);
servo.attach(6); // Pin PWM Servo
servo.write(90); // Tutup servo / Tutup Pintu
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Masukkan Password"); // Meminta untuk mengisi input / password
pinMode(ledMerah, OUTPUT); // Lampu Gagal
pinMode(ledHijau, OUTPUT); // Lampu Berhasil
pinMode(ledKuning, OUTPUT); // Lampu Tunggu
pinMode(buzzer, OUTPUT); // Buzzer
pinMode(pir, INPUT); // Sensor Pir Motion
}
void loop() {
smart_door(); // Membuat Nesting
}
void smart_door() {
smart_key(); // Membuat Nesting dalam Nesting
detect(); // Membuat Nesting dalam Nesting
}
void smart_key() {
char key = keypad.getKey();
if (key) {
if (key == '#') { // Kondisi jika # di tekan
// Cek password
if (input == password) { // Kondisi jika input / password yang diberikan benar / sesuai
servo.write(0); // Buka servo / pintu
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Password Benar!");
lcd.setCursor(0, 1);
lcd.print("Pintu Terbuka");
// Menambahkan animasi untuk status
for (int i = 0; i < 16; i++) {
lcd.scrollDisplayLeft(); // Menggeser tampilan ke kiri
delay(100);
digitalWrite(ledHijau, HIGH); // Menyalakan Lampu Berhasil
tone(buzzer, 1000, 500); // Menyalakan Buzzer
delay(2000); // Mengatur timing waktu dalam delay 1000 = 1 detik
servo.write(90); // Tutup servo / pintu
digitalWrite(ledHijau, LOW); // Mematikan Lampu Berhasil
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan Password"); // Meminta untuk mengisi input / password
} else { // Kondisi jika input / password yang berikan salah / tidak sesuai
lcd.setCursor(0, 1);
lcd.print("Password Salah!");
digitalWrite(ledMerah, HIGH); // Menyalakan Lampu Gagal
tone(buzzer, 500, 500); // Menyalakan Buzzer
delay(2000); // Mengatur timing waktu dalam delay 1000 = 1 detik
digitalWrite(ledMerah, LOW); //Mematikan Lampu Gagal
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan Password"); // Meminta untuk mengisi input / password
}
input = "";
} else if (key == '*') {
// Hapus input
input = "";
lcd.setCursor(0, 1);
lcd.print(" ");
} else {
// Tambahkan input
input += key;
lcd.setCursor(0, 1);
lcd.print(input);
}
}
}
void detect() {
val = digitalRead(pir); // Membaca nilai dari sensor PIR
if (val == HIGH) { // Jika ada gerakan terdeteksi
digitalWrite(ledKuning, HIGH); // Nyalakan LED
if (pirState == LOW) { // Jika sebelumnya tidak ada gerakan
Serial.println("Gerakan Terdeteksi!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selamat");
lcd.setCursor(0, 1);
lcd.print("Datang");
delay(1000); // Mengatur timing waktu dalam delay 1000 = 1 detik
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan Password"); // Meminta untuk mengisi input / password
pirState = HIGH; // Update status sensor PIR
}
} else { // Jika tidak ada gerakan
digitalWrite(ledKuning, LOW); // Matikan LED
if (pirState == HIGH) { // Jika sebelumnya ada gerakan
Serial.println("Tidak Ada Gerakan");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan Password"); // Meminta untuk mengisi input / password
pirState = LOW; // Update status sensor PIR
}
}
}