const int btn = 1;
struct TrafficLight {
int Red;
int Yellow;
int Green;
};
TrafficLight trafficLights[4] = {
{2, 3, 4}, // arah 1
{5, 6, 7}, // arah 2
{8, 9, 10}, // arah 3
{11, 12, 13} // arah 4
};
bool isButtonPressed = false;
void setup() {
Serial.begin(9600);
pinMode(btn, INPUT);
for (int i = 0; i < 4; i++) {
pinMode(trafficLights[i].Red, OUTPUT);
pinMode(trafficLights[i].Yellow, OUTPUT);
pinMode(trafficLights[i].Green, OUTPUT);
}
fastYellow(); //nyalain kedip kuning dulu
}
void loop() {
if (digitalRead(btn) == LOW) { //button dipencet
if (!isButtonPressed) {
isButtonPressed = true;
yellowOnly();
}
} else { //button ga dipencet
if (isButtonPressed) {
isButtonPressed = false;
fastYellow();
} else {
runTrafficLights();
}
}
}
void runTrafficLights() {
for (int i = 0; i < 4; i++) {
digitalWrite(trafficLights[i].Red, LOW); //matiin merah 1 arah
delay(150);
for (int j = 0; j < 4; j++) {
if (i != j) {
digitalWrite(trafficLights[j].Red, HIGH); //merah arah lain nyala
}
}
digitalWrite(trafficLights[i].Green, HIGH); //hijau 1 arah nyala
delay(3000);
digitalWrite(trafficLights[i].Green, LOW);
digitalWrite(trafficLights[i].Yellow, HIGH);
delay(1500);
digitalWrite(trafficLights[i].Yellow, LOW);
digitalWrite(trafficLights[i].Red, HIGH);
delay(1000);
}
}
void yellowOnly() {
for (int i = 0; i < 4; i++) { //matiin semua lampu
digitalWrite(trafficLights[i].Red, LOW);
digitalWrite(trafficLights[i].Yellow, LOW);
digitalWrite(trafficLights[i].Green, LOW);
}
fastYellow();
while (digitalRead(btn) == LOW) { //lampu kuning kedip
for (int i = 0; i < 4; i++) {
digitalWrite(trafficLights[i].Yellow, HIGH);
}
delay(750); //kedipan pelan
for (int i = 0; i < 4; i++) {
digitalWrite(trafficLights[i].Yellow, LOW);
}
delay(750); //kedipan pelan
}
}
void fastYellow() {
for (int j = 0; j < 5; j++) { //kedip 5 kali
for (int i = 0; i < 4; i++) {
digitalWrite(trafficLights[i].Yellow, HIGH);
}
delay(200); //kedipan cepat
for (int i = 0; i < 4; i++) {
digitalWrite(trafficLights[i].Yellow, LOW);
}
delay(200); //kedipan cepat
}
}