//       Alarm Parkir Mobil
// Nama : Khazim Fikri Al-Fadhli
// NIM  : 20.240.0007

#include "pitches.h"  // Memanggil Note Nada

#define SPEAKER_PIN 8 // Mendefinisikan pin buzzer
#define ECHO_PIN 6 // Mendefinisikan pin echo sensor ultrasonic
#define TRIG_PIN 5 // Mendefinisikan pin trigger sensor ultrasonic
#define BUTTON_PIN 7  // Mendefinisikan pin push button

int alarm_tone = NOTE_G5; // Mendefinisikan note G5 sebagai bunyi buzzer
int pin_led_red = 4; // Mendifinisikan pin lambu LED Merah
int pin_led_yellow = 3; // Mendifinisikan pin lambu LED Kuning
int pin_led_green = 2; // Mendifinisikan pin lambu LED Hijau
int status = 1; // Mendefinisikan status alat

void setup(){
  pinMode(SPEAKER_PIN, OUTPUT); // Mengatur pin buzzer sebagai output
  pinMode(TRIG_PIN, OUTPUT); // Mengatur pin trigger sensor ultrasonic sebagai output
  pinMode(ECHO_PIN, INPUT); // Mengatur pin echo sensor ultrasonic sebagai input
  pinMode(pin_led_red, OUTPUT); // Mengatur pin LED Merah sebagai output
  pinMode(pin_led_yellow, OUTPUT); // Mengatur pin LED Kuning sebagai output
  pinMode(pin_led_green, OUTPUT); // Mengatur pin LED Hijau sebagai output
  pinMode(7, INPUT); // Mengatur pin button sebagai input
}

float jarak_cm(){ // Membuat fungsi pendeteksi jarak dalam satuan CM
  digitalWrite(TRIG_PIN, LOW); // Membuat pin trigger sensor low
  delayMicroseconds(2); // melakukan delay selama 2 micro second
  digitalWrite(TRIG_PIN, HIGH); // Membuat pin trigger sensor high
  delayMicroseconds(10); // melakukan delay selama 10 micro second
  digitalWrite(TRIG_PIN, LOW); // Membuat pin trigger sensor low

  int duration = pulseIn(ECHO_PIN, HIGH); // Menghitung durasi dengan menghidupkan pin echo
  return duration * 0.034 / 2; // menghitung jarak dalam satuan CM dengan perhitungan berdasarkan durasi
}

void loop(){
  if (digitalRead(BUTTON_PIN) == HIGH){ // Jika tombol ditekan maka
    Serial.println(status); // Menampilkan status alat saat tombol ditekan
    if (status == 1){ // jika status alat aktif maka
      status = 0; // status alat akan di non-aktifkan
      delay(100); // membuat delay untuk perubahan status
    } else { // jika status alat non-aktif maka
      status = 1; // status alat akan di aktifkan
      delay(100); // membuat delay untuk perubahan status
    }
  }

  if (status == 1){ // jika status alat aktif maka
    float cm = jarak_cm(); // mengambil nilai jarak dalam satuan CM yang ditangkap sensor

    if(cm < 10){ //jika jarak < 10 cm maka
      digitalWrite(SPEAKER_PIN,HIGH); // buzzer menyala selama delay
      tone(SPEAKER_PIN, alarm_tone); // mengubah bunyi buzzer
      digitalWrite(pin_led_red, HIGH); // Menyalakan LED Merah
      digitalWrite(pin_led_yellow, LOW); // Mematikan LED Kuning
      digitalWrite(pin_led_green, LOW); // Mematikan LED Hijau
      delay(50); // membuat delay 50 ms

      digitalWrite(SPEAKER_PIN,LOW); // buzzer mati selama delay
      digitalWrite(pin_led_red, LOW); // Mematikan LED Merah
      noTone(SPEAKER_PIN); // mematikan bunyi tone buzzer 
      delay(100); // membuat delay 100ms
    }

    else if (cm < 30){ //jika jarak < 30 cm maka
      digitalWrite(SPEAKER_PIN,HIGH); // buzzer menyala selama delay
      tone(SPEAKER_PIN, alarm_tone); // mengubah bunyi buzzer
      digitalWrite(pin_led_red, HIGH); // Menyalakan LED Merah
      digitalWrite(pin_led_yellow, LOW); // Mematikan LED Kuning
      digitalWrite(pin_led_green, LOW); // Mematikan LED Hijau
      delay(100); // membuat delay 100 ms

      digitalWrite(SPEAKER_PIN,LOW); // buzzer mati selama delay
      digitalWrite(pin_led_red, LOW); // Mematikan LED Merah
      noTone(SPEAKER_PIN); // mematikan bunyi tone buzzer 
      delay(200); // membuat delay 200ms
    }

    else if(cm < 70){ //jika jarak < 70 cm maka
      digitalWrite(SPEAKER_PIN,HIGH); // buzzer menyala selama delay
      tone(SPEAKER_PIN, alarm_tone); // mengubah bunyi buzzer
      digitalWrite(pin_led_red, LOW); // Mematikan LED Merah
      digitalWrite(pin_led_yellow, HIGH); // Menyalakan LED Kuning
      digitalWrite(pin_led_green, LOW); // Mematikan LED Hijau
      delay(250); // membuat delay 250 ms

      digitalWrite(SPEAKER_PIN,LOW); //buzzer mati selama delay
      digitalWrite(pin_led_yellow, LOW); // Mematikan LED Kuning
      noTone(SPEAKER_PIN); // mematikan bunyi tone buzzer 
      delay(400); // membuat delay 400ms
    }
    else if(cm < 150){ //jika jarak < 150 cm maka
      digitalWrite(SPEAKER_PIN,HIGH); //buzzer menyala selama delay
      tone(SPEAKER_PIN, alarm_tone); // mengubah bunyi buzzer
      digitalWrite(pin_led_red, LOW); // Mematikan LED Merah
      digitalWrite(pin_led_yellow, LOW); // Mematikan LED Kuning
      digitalWrite(pin_led_green, HIGH); // Menyalakan LED Hijau
      delay(500); // membuat delay 500 ms

      digitalWrite(SPEAKER_PIN,LOW); //buzzer mati selama delay
      digitalWrite(pin_led_green, LOW); // Mematikan LED Hijau
      noTone(SPEAKER_PIN); // mematikan bunyi tone buzzer 
      delay(700); // membuat delay 700ms
    }
  }
}

//       Alarm Parkir Mobil
// Nama : Khazim Fikri Al-Fadhli
// NIM  : 20.240.0007