#include <Servo.h>

// Mendefinisikan pin yang terhubung ke servo, sensor ultrasonik, dan buzzer
const int servoPin = 9;         // Ganti dengan pin yang sesuai untuk servo
const int trigPin = 2;          // Ganti dengan pin yang sesuai untuk trigger ultrasonik
const int echoPin = 3;          // Ganti dengan pin yang sesuai untuk echo ultrasonik
const int buzzerPin = 5;       // Ganti dengan pin yang sesuai untuk buzzer

Servo myServo;

void setup() {
  // Mengatur pin sebagai OUTPUT untuk servo dan buzzer
  pinMode(servoPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  // Mengatur pin sebagai INPUT dan OUTPUT untuk sensor ultrasonik
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // Menghubungkan servo ke pin yang ditentukan
  myServo.attach(servoPin);

  // Inisialisasi Serial Monitor
  Serial.begin(9600);
}

void loop() {
  // Membaca jarak dari sensor ultrasonik
  int distance = readUltrasonicDistance();

  // Menentukan apakah pintu rel harus terbuka atau tertutup
  if (distance < 10) {
    openGate();   // Jika objek terlalu dekat, buka pintu rel
  } else {
    closeGate();  // Jika objek cukup jauh, tutup pintu rel
  }

  // Memberikan efek suara buzzer sesuai dengan keadaan pintu rel
  if (distance < 10) {
    playTrainSound(); // Jika pintu terbuka, berikan efek suara kereta
  }

  // Tunggu sebentar sebelum membaca ulang sensor
  delay(100);
}

int readUltrasonicDistance() {
  // Kirim sinyal ultrasonik
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Baca durasi pulsa ultrasonik
  int duration = pulseIn(echoPin, HIGH);

  // Hitung jarak berdasarkan durasi pulsa
  int distance = duration * 0.034 / 2;

  // Tampilkan jarak pada Serial Monitor (untuk debugging)
  Serial.print("Jarak: ");
  Serial.print(distance);
  Serial.println(" cm");

  return distance;
}

void openGate() {
  // Buka pintu rel (gerakkan servo)
  myServo.write(0);
}

void closeGate() {
  // Tutup pintu rel (gerakkan servo)
  myServo.write(90);
}

void playTrainSound() {
  // Berikan efek suara buzzer
  tone(buzzerPin, 1000);  // Ganti frekuensi sesuai kebutuhan
  delay(500);             // Berikan efek suara selama 0.5 detik
  noTone(buzzerPin);      // Matikan buzzer
}