// Pin untuk lampu lalu lintas
#define greenLED 6
#define yellowLED 5
#define redLED 4
// Pin untuk tombol penyeberangan pejalan kaki
#define crossingButton 2
/// Waktu default untuk lampu hijau, kuning, dan merah (detik)
const int defaultGreenTime = 5;
const int defaultYellowTime = 3;
const int defaultRedTime = 5;
// Waktu tambahan untuk lampu merah jika tombol ditekan (detik)
const int extraRedTime = 5;
// Status lampu lalu lintas
enum TrafficLightState {
GREEN,
YELLOW,
RED
};
TrafficLightState currentState = GREEN;
void setup() {
// Set pin-mode untuk lampu lalu lintas
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
// Set pin-mode untuk tombol penyebrangan
pinMode(crossingButton, INPUT_PULLUP);
// Inisialisasi Serial Monitor
Serial.begin(115200);
// Mulai dengan lampu hijau
setTrafficLight(GREEN, defaultGreenTime);
}
void loop() {
// Baca status tombol penyebrangan
int buttonState = digitalRead(crossingButton);
// Jika tombol ditekan saat lampu hijau atau kuning, tambahkan waktu ke lampu merah
if ((currentState == GREEN || currentState == YELLOW) && buttonState == LOW) {
setTrafficLight(RED, defaultRedTime + extraRedTime);
}
// Logika perpindahan lampu lalu lintas
switch (currentState) {
case GREEN:
if (checkTimer(defaultGreenTime)) {
setTrafficLight(YELLOW, defaultYellowTime);
}
break;
case YELLOW:
if (checkTimer(defaultYellowTime)) {
setTrafficLight(RED, defaultRedTime);
}
break;
case RED:
if (checkTimer(defaultRedTime)) {
setTrafficLight(GREEN, defaultGreenTime);
}
break;
}
}
// Fungsi untuk mengatur status lampu lalu lintas dan mengaktifkan timer
void setTrafficLight(TrafficLightState newState, int duration) {
currentState = newState;
activateTrafficLight(newState);
startTimer(duration);
}
// Fungsi untuk mengaktifkan lampu lalu lintas sesuai dengan status
void activateTrafficLight(TrafficLightState state) {
digitalWrite(greenLED, state == GREEN ? HIGH : LOW);
digitalWrite(yellowLED, state == YELLOW ? HIGH : LOW);
digitalWrite(redLED, state == RED ? HIGH : LOW);
Serial.println("Traffic Light State: " + String(state));
}
// Fungsi untuk memulai timer
unsigned long timerStart;
void startTimer(int duration) {
timerStart = millis();
Serial.println("Timer Started: " + String(duration) + " seconds");
}
// Fungsi untuk memeriksa apakah timer telah berakhir
bool checkTimer(int duration) {
return (millis() - timerStart) >= (duration * 1000);
}