#include <Servo.h>
#include <LiquidCrystal_I2C.h>
const int PIR_PIN = 8; // Pin untuk sensor PIR
const int LED_OPEN = 2; // Pin untuk LED saat pintu terbuka
const int LED_WELCOME = 3; // Pin untuk LED sambutan
const int SERVO_PIN = 6; // Pin untuk motor servo
int pirStatus = 0; // Status sensor PIR
Servo doorServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long lastMotionTime = 0; // Waktu terakhir deteksi gerakan
const unsigned long openDuration = 5000; // Durasi pintu tetap terbuka dalam milidetik (misal: 5000 ms = 5 detik)
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
Serial.println("Smart Door");
doorServo.attach(SERVO_PIN);
pinMode(PIR_PIN, INPUT);
pinMode(LED_OPEN, OUTPUT);
pinMode(LED_WELCOME, OUTPUT);
doorServo.write(90); // Pastikan pintu tertutup pada awalnya
}
void loop() {
displayWelcomeMessage(); // menampilkan pesan selamat datang
pirStatus = digitalRead(PIR_PIN); // Baca status sensor PIR
if (pirStatus == HIGH) {
openDoor(); // Buka pintu
lastMotionTime = millis(); // waktu terakhir gerakan terdeteksi
}
// pintu terbuka untuk durasi tertentu setelah deteksi gerakan terakhir
if (millis() - lastMotionTime <= openDuration) {
blinkLED(LED_OPEN, 500); // Buat LED berkedip saat pintu terbuka
} else {
digitalWrite(LED_OPEN, LOW); // Pastikan LED mati saat pintu tertutup
closeDoor(); // Tutup pintu
}
}
void displayWelcomeMessage() {
digitalWrite(LED_WELCOME, HIGH); // Nyalakan LED sambutan
lcd.setCursor(2, 0);
lcd.print("selamat datang ");
lcd.setCursor(2, 1);
lcd.print("dirumah hafidz ");
delay(2000);
lcd.clear();
digitalWrite(LED_WELCOME, LOW); // Matikan LED sambutan
}
void openDoor() {
lcd.clear();
lcd.print(" Mari masuk ");
doorServo.write(30); // Buka pintu (posisi 30 derajat)
Serial.println("Pintu Terbuka");
}
void closeDoor() {
doorServo.write(90); // Tutup pintu (posisi 90 derajat)
Serial.println("Pintu Tertutup");
}
void blinkLED(int pin, int interval) {
static unsigned long lastBlinkTime = 0;
static bool ledState = false;
if (millis() - lastBlinkTime >= interval) {
ledState = !ledState;
digitalWrite(pin, ledState); // Ganti status LED
lastBlinkTime = millis();
}
}