int waktuKalibrasi = 5; // Waktu kalibrasi sensor (detik)
long unsigned int rendahPada; // Waktu ketika sensor mengeluarkan sinyal rendah
long unsigned int jeda = 5000; // Jeda waktu dianggap tidak ada gerakan (milidetik)
boolean kunciRendah = true; // Variabel boolean untuk mengontrol logika gerakan berakhir
boolean ambilWaktuRendah; // Variabel boolean untuk mengontrol logika pengambilan waktu rendah
int pinPIR = 7; // Pin digital terhubung ke output sensor PIR
int pinBuzzer = 5; // Pin digital terhubung ke output Buzzer
void setup() {
Serial.begin(9600); // Inisialisasi komunikasi serial dengan baud rate 9600
pinMode(pinPIR, INPUT); // Mengatur pin sensor PIR sebagai input
pinMode(pinBuzzer, OUTPUT); // Mengatur pin Buzzer sebagai output
digitalWrite(pinPIR, LOW); // Menetapkan pin sensor PIR menjadi rendah
// Berikan waktu pada sensor untuk melakukan kalibrasi
Serial.print("Mengkalibrasi sensor ");
for (int i = 0; i < waktuKalibrasi; i++) {
Serial.print(".");
delay(1000); // Tunggu 1 detik
}
Serial.println(" selesai");
Serial.println("SENSOR AKTIF");
delay(50); // Tunggu 50 milidetik sebelum melanjutkan
}
////////////////////////////
// LOOP
void loop() {
if (digitalRead(pinPIR) == HIGH) { // Jika sensor PIR mendeteksi gerakan
tone(pinBuzzer, 1000); // Aktifkan Buzzer dengan frekuensi 1000 Hz
if (kunciRendah) {
kunciRendah = LOW; // Set kunciRendah menjadi FALSE
Serial.println("---");
Serial.print("Deteksi gerakan pada ");
Serial.print(millis() / 1000); // Cetak waktu deteksi gerakan (detik)
Serial.println(" detik");
delay(50); // Tunggu 50 milidetik sebelum melanjutkan
}
ambilWaktuRendah = HIGH; // Set ambilWaktuRendah menjadi TRUE
}
if (digitalRead(pinPIR) == LOW) { // Jika sensor PIR tidak mendeteksi gerakan
if (ambilWaktuRendah) {
rendahPada = millis(); // Simpan waktu transisi dari tinggi ke rendah
ambilWaktuRendah = LOW; // Set ambilWaktuRendah menjadi FALSE
}
noTone(pinBuzzer); // Matikan Buzzer
if (!kunciRendah && millis() - rendahPada > jeda) {
kunciRendah = HIGH; // Set kunciRendah menjadi TRUE
Serial.print("Gerakan berakhir pada ");
Serial.print((millis() - jeda) / 1000); // Cetak waktu berakhirnya gerakan (detik)
Serial.println(" detik");
delay(50); // Tunggu 50 milidetik sebelum melanjutkan
}
}
}