#include <Servo.h>
// ====== DEKLARASI PIN ======
const int pirPin = 11; // PIR sensor output pin
const int buzzerPin = 9; // Buzzer pin
const int ledPin = 8; // LED indicator pin
const int servoPin = 10; // Servo motor signal pin
// ====== PENGATURAN SERVO ======
const int posisiTertutup = 0; // Pintu tertutup (0 derajat)
const int posisiTerbuka = 90; // Pintu terbuka (90 derajat)
// ====== PENGATURAN WAKTU ======
const long waktuTutupOtomatis = 5000; // Pintu tutup otomatis setelah 5 detik
// ====== OBJEK & VARIABEL ======
Servo servoPintu; // Objek servo motor
bool gerakanTerdeteksi = false; // Status gerakan
bool pintuTerbuka = false; // Status pintu
unsigned long waktuGerakanTerakhir = 0;// Waktu gerakan terakhir terdeteksi
void setup() {
// Inisialisasi pin
pinMode(pirPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
// Inisialisasi servo
servoPintu.attach(servoPin);
servoPintu.write(posisiTertutup); // Mulai dengan pintu tertutup
// Inisialisasi Serial Monitor
Serial.begin(9600);
Serial.println("========================================");
Serial.println(" AUTOMATIC DOOR SYSTEM");
Serial.println(" PIR Motion Sensor + Servo Motor");
Serial.println("========================================");
Serial.println("Sistem siap!");
Serial.println("Menunggu deteksi gerakan...");
Serial.println();
// Pastikan semua output mati di awal
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW);
// Test servo (gerakan kecil untuk indikasi sistem siap)
testServo();
}
void loop() {
// Baca status PIR sensor
int pirState = digitalRead(pirPin);
// ====== DETEKSI GERAKAN ======
if (pirState == HIGH) {
// Gerakan terdeteksi!
if (!gerakanTerdeteksi) {
// Gerakan baru terdeteksi (transisi dari LOW ke HIGH)
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
Serial.println("🚶 GERAKAN TERDETEKSI!");
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
gerakanTerdeteksi = true;
}
// Update waktu gerakan terakhir
waktuGerakanTerakhir = millis();
// Aktifkan LED dan Buzzer
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 1000); // Buzzer 1000 Hz
// Buka pintu jika masih tertutup
if (!pintuTerbuka) {
bukaPintu();
}
Serial.print("Status: AKTIF | Pintu: ");
Serial.println(pintuTerbuka ? "TERBUKA" : "TERTUTUP");
} else {
// Tidak ada gerakan
if (gerakanTerdeteksi) {
// Transisi dari ada gerakan ke tidak ada gerakan
Serial.println("Tidak ada gerakan...");
gerakanTerdeteksi = false;
}
// Matikan LED dan Buzzer
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
// Cek apakah pintu perlu ditutup otomatis
if (pintuTerbuka) {
unsigned long waktuSekarang = millis();
unsigned long selisihWaktu = waktuSekarang - waktuGerakanTerakhir;
if (selisihWaktu >= waktuTutupOtomatis) {
// Sudah 5 detik tanpa gerakan → Tutup pintu
tutupPintu();
} else {
// Countdown
long waktuTersisa = (waktuTutupOtomatis - selisihWaktu) / 1000;
Serial.print("Status: STANDBY | Menutup dalam: ");
Serial.print(waktuTersisa);
Serial.println(" detik");
}
}
}
// Delay untuk stabilitas pembacaan sensor
delay(500);
}
// ====== FUNGSI BUKA PINTU ======
void bukaPintu() {
Serial.println(">> MEMBUKA PINTU...");
// Buzzer feedback (3x beep cepat)
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 1500);
delay(100);
noTone(buzzerPin);
delay(100);
}
// Gerakkan servo dari 0° ke 90° (smooth motion)
for (int pos = posisiTertutup; pos <= posisiTerbuka; pos++) {
servoPintu.write(pos);
delay(15); // Delay untuk gerakan halus
}
pintuTerbuka = true;
Serial.println("✓ PINTU TERBUKA (90°)");
Serial.println();
}
// ====== FUNGSI TUTUP PINTU ======
void tutupPintu() {
Serial.println(">> MENUTUP PINTU...");
// Buzzer feedback (2x beep)
for (int i = 0; i < 2; i++) {
tone(buzzerPin, 800);
delay(150);
noTone(buzzerPin);
delay(150);
}
// Gerakkan servo dari 90° ke 0° (smooth motion)
for (int pos = posisiTerbuka; pos >= posisiTertutup; pos--) {
servoPintu.write(pos);
delay(15);
}
pintuTerbuka = false;
Serial.println("✓ PINTU TERTUTUP (0°)");
Serial.println("Menunggu gerakan berikutnya...");
Serial.println();
}
// ====== FUNGSI TEST SERVO ======
void testServo() {
Serial.println("Test servo motor...");
// Gerak kecil untuk test
servoPintu.write(30);
delay(300);
servoPintu.write(0);
delay(300);
Serial.println("✓ Servo siap!");
Serial.println();
}