//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
    }
  } 
}

$abcdeabcde151015202530fghijfghij