// Pin untuk Seven-Segment Display
int segmentPins[4][7] = {
{22, 23, 24, 25, 26, 27, 28}, // Jalur 1
{32, 33, 34, 35, 36, 37, 38}, // Jalur 2
{42, 43, 44, 45, 46, 47, 48}, // Jalur 3
{52, 53, 54, 55, 56, 57, 58} // Jalur 4
};
// Angka 0-9 dalam bentuk biner untuk seven-segment (0bABCDEFG)
byte numbers[] = {
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110 // 9
};
// Pin untuk lampu lalu lintas
int trafficLightPins[4][3] = {
{29, 30, 31}, // Jalur 1: Merah, Kuning, Hijau
{39, 40, 41}, // Jalur 2
{49, 50, 51}, // Jalur 3
{59, 60, 61} // Jalur 4
};
void setup() {
// Set pin seven-segment display sebagai output
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[j][i], OUTPUT);
}
}
// Set pin untuk lampu lalu lintas sebagai output
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 3; i++) {
pinMode(trafficLightPins[j][i], OUTPUT);
}
}
}
void loop() {
// Jalur 1
controlTraffic(0, 9, 3, 7); // Jalur 1 menyala hijau 9 detik, kuning 3 detik, merah 7 detik
// Jalur 2
controlTraffic(1, 9, 3, 7); // Jalur 2
// Jalur 3
controlTraffic(2, 9, 3, 7); // Jalur 3
// Jalur 4
controlTraffic(3, 9, 3, 7); // Jalur 4
}
// Fungsi untuk mengatur lalu lintas pada satu jalur dan menyinkronkan lampu merah di jalur lainnya
void controlTraffic(int activeLane, int greenTime, int yellowTime, int redTime) {
// Nyalakan lampu merah di jalur lain
for (int i = 0; i < 4; i++) {
if (i != activeLane) {
digitalWrite(trafficLightPins[i][0], HIGH); // Merah nyala di jalur lain
digitalWrite(trafficLightPins[i][1], LOW); // Matikan kuning di jalur lain
digitalWrite(trafficLightPins[i][2], LOW); // Matikan hijau di jalur lain
}
}
// Lampu Hijau menyala di jalur aktif
digitalWrite(trafficLightPins[activeLane][2], HIGH); // Hijau nyala di jalur aktif
countdown(activeLane, greenTime); // Countdown untuk lampu hijau
digitalWrite(trafficLightPins[activeLane][2], LOW); // Matikan lampu hijau
// Lampu Kuning menyala di jalur aktif
digitalWrite(trafficLightPins[activeLane][1], HIGH); // Kuning nyala di jalur aktif
countdown(activeLane, yellowTime); // Countdown untuk lampu kuning
digitalWrite(trafficLightPins[activeLane][1], LOW); // Matikan lampu kuning
// Lampu Merah menyala di jalur aktif (selama fase hijau jalur lain)
digitalWrite(trafficLightPins[activeLane][0], HIGH); // Merah nyala di jalur aktif
countdown(activeLane, redTime); // Countdown untuk lampu merah di jalur aktif
}
// Fungsi untuk menampilkan angka pada seven-segment display
void showNumber(int jalur, int num) {
byte number = numbers[num];
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[jalur][i], (number & (1 << (7 - i))) ? HIGH : LOW);
}
}
// Fungsi countdown
void countdown(int jalur, int startNum) {
for (int i = startNum; i >= 0; i--) {
showNumber(jalur, i); // Tampilkan angka pada seven-segment di jalur aktif
delay(1000); // Tunggu 1 detik
}
}