const int buttonPin = 2; // Pin untuk push button
const int ledMerah = 13; // Pin untuk LED merah
const int ledKuning = 12; // Pin untuk LED kuning
const int ledHijau = 11; // Pin untuk LED hijau
bool forceToRed = false; // Flag untuk memaksa lampu ke merah
int buzzer = 3;
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Gunakan pull-up internal pada pin push button
pinMode(ledMerah, OUTPUT);
pinMode(ledKuning, OUTPUT);
pinMode(ledHijau, OUTPUT);
pinMode(buzzer, OUTPUT);
Serial.begin(9600); // Untuk debugging dengan Serial Monitor
}
void loop() {
// Membaca status tombol
if (digitalRead(buttonPin) == LOW) {
forceToRed = true; // Jika tombol ditekan, aktifkan flag forceToRed
// Nada seperti palang pintu kereta
for (int i = 0; i < 3; i++) {
tone(buzzer, 1000); // Frekuensi 1000 Hz
delay(1000); // Beep selama 200 ms
noTone(buzzer); // Matikan suara
delay(1000); // Jeda 100 ms sebelum beep berikutnya
}
} else {
noTone(buzzer); // Matikan buzzer jika tombol tidak ditekan
}
// Siklus lampu merah
digitalWrite(ledMerah, HIGH);
delay(2000); // Lampu merah menyala selama 3 detik
digitalWrite(ledMerah, LOW);
// Reset flag setelah lampu merah selesai
forceToRed = false;
// Siklus lampu kuning dengan pengecekan button setiap 100 ms
for (int i = 0; i < 10; i++) { // Lampu kuning menyala selama 1 detik (10x100 ms)
digitalWrite(ledKuning, HIGH);
delay(100);
if (digitalRead(buttonPin) == LOW) { // Jika tombol ditekan, langsung lompat ke lampu merah
forceToRed = true;
break; // Keluar dari loop kuning
}
noTone(buzzer); // Matikan buzzer selama lampu kuning menyala
}
digitalWrite(ledKuning, LOW);
// Jika tombol ditekan, kembali ke lampu merah
if (forceToRed) {
forceToRed = false; // Reset flag dan lompat ke lampu merah
return;
}
// Siklus lampu hijau dengan pengecekan button setiap 100 ms
for (int i = 0; i < 30; i++) { // Lampu hijau menyala selama 3 detik (30x100 ms)
digitalWrite(ledHijau, HIGH);
delay(100);
if (digitalRead(buttonPin) == LOW) { // Jika tombol ditekan, langsung lompat ke lampu merah
forceToRed = true;
break; // Keluar dari loop hijau
}
noTone(buzzer); // Matikan buzzer selama lampu hijau menyala
}
digitalWrite(ledHijau, LOW);
// Jika tombol ditekan, kembali ke lampu merah
if (forceToRed) {
forceToRed = false; // Reset flag dan lompat ke lampu merah
return;
}
}