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