#include <Servo.h>
Servo palang;
#define TRIG 2
#define ECHO 3
#define BUZZER 5
#define LED_MERAH 6
#define LED_HIJAU 7
#define SERVO 9
long durasi;
int jarak;
// Variabel untuk pengaturan waktu (millis) tanpa delay
unsigned long waktuSebelumnya = 0;
const long intervalBuzzer = 300; // Kecepatan kedipan buzzer (300ms)
bool statusBuzzer = false;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(LED_HIJAU, OUTPUT);
palang.attach(SERVO);
// Kondisi awal: kereta tidak terdeteksi
palang.write(0);
digitalWrite(LED_HIJAU, HIGH);
digitalWrite(LED_MERAH, LOW);
noTone(BUZZER);
Serial.begin(9600);
}
void loop() {
// Mengukur jarak
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
durasi = pulseIn(ECHO, HIGH);
jarak = durasi * 0.034 / 2;
Serial.print("Jarak: ");
Serial.print(jarak);
Serial.println(" cm");
unsigned long waktuSekarang = millis();
// Jika ada kereta/objek dalam jarak 20 cm
if (jarak > 0 && jarak <= 20) {
// Palang turun
palang.write(90);
digitalWrite(LED_HIJAU, LOW);
// Membuat Buzzer dan LED Merah berkedip tanpa delay
if (waktuSekarang - waktuSebelumnya >= intervalBuzzer) {
waktuSebelumnya = waktuSekarang;
statusBuzzer = !statusBuzzer; // Balikkan status (ON/OFF)
if (statusBuzzer) {
tone(BUZZER, 1000);
digitalWrite(LED_MERAH, HIGH);
} else {
noTone(BUZZER);
digitalWrite(LED_MERAH, LOW);
}
}
} else {
// Palang naik jika kereta sudah lewat
palang.write(0);
digitalWrite(LED_MERAH, LOW);
digitalWrite(LED_HIJAU, HIGH);
noTone(BUZZER);
}
delay(50); // Delay kecil agar pembacaan serial monitor tidak terlalu cepat
}