#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD dengan alamat I2C (sesuaikan dengan alamat LCD Anda)
LiquidCrystal_I2C lcd1(0x27, 16, 2);
LiquidCrystal_I2C lcd2(0x3F, 16, 2);
// Pin LED untuk 4 arah (setiap arah memiliki 3 LED: Merah, Kuning, Hijau)
const int redPins[] = {1, 4, 7, 10};
const int yellowPins[] = {2, 5, 8, 11};
const int greenPins[] = {3, 6, 9, 12};
// Durasi setiap lampu (dalam milidetik)
const unsigned long greenDuration = 5000;
const unsigned long yellowDuration = 2000;
const unsigned long redDuration = 7000;
void setup() {
// Inisialisasi pin LED sebagai output
for (int i = 0; i < 4; i++) {
pinMode(redPins[i], OUTPUT);
pinMode(yellowPins[i], OUTPUT);
pinMode(greenPins[i], OUTPUT);
}
// Inisialisasi LCD
lcd1.init();
lcd1.backlight();
lcd2.init();
lcd2.backlight();
}
void loop() {
// Nyalakan lampu hijau untuk arah 1 dan 3, merah untuk arah 2 dan 4
setTrafficLight(0, "Hijau", HIGH);
setTrafficLight(2, "Hijau", HIGH);
setTrafficLight(1, "Merah", HIGH);
setTrafficLight(3, "Merah", HIGH);
delay(greenDuration);
// Nyalakan lampu kuning untuk arah 1 dan 3, merah untuk arah 2 dan 4
setTrafficLight(0, "Hijau", LOW);
setTrafficLight(2, "Hijau", LOW);
setTrafficLight(0, "Kuning", HIGH);
setTrafficLight(2, "Kuning", HIGH);
delay(yellowDuration);
// Nyalakan lampu merah untuk arah 1 dan 3, hijau untuk arah 2 dan 4
setTrafficLight(0, "Kuning", LOW);
setTrafficLight(2, "Kuning", LOW);
setTrafficLight(0, "Merah", HIGH);
setTrafficLight(2, "Merah", HIGH);
setTrafficLight(1, "Merah", LOW);
setTrafficLight(3, "Merah", LOW);
setTrafficLight(1, "Hijau", HIGH);
setTrafficLight(3, "Hijau", HIGH);
delay(greenDuration);
// Nyalakan lampu kuning untuk arah 2 dan 4, merah untuk arah 1 dan 3
setTrafficLight(1, "Hijau", LOW);
setTrafficLight(3, "Hijau", LOW);
setTrafficLight(1, "Kuning", HIGH);
setTrafficLight(3, "Kuning", HIGH);
delay(yellowDuration);
// Nyalakan lampu merah untuk arah 2 dan 4, hijau untuk arah 1 dan 3
setTrafficLight(1, "Kuning", LOW);
setTrafficLight(3, "Kuning", LOW);
setTrafficLight(1, "Merah", HIGH);
setTrafficLight(3, "Merah", HIGH);
setTrafficLight(0, "Merah", LOW);
setTrafficLight(2, "Merah", LOW);
}
void setTrafficLight(int lane, const char* color, int state) {
if (strcmp(color, "Hijau") == 0) {
digitalWrite(greenPins[lane], state);
} else if (strcmp(color, "Kuning") == 0) {
digitalWrite(yellowPins[lane], state);
} else if (strcmp(color, "Merah") == 0) {
digitalWrite(redPins[lane], state);
} else {
digitalWrite(redPins[lane], LOW);
digitalWrite(yellowPins[lane], LOW);
digitalWrite(greenPins[lane], LOW);
}
if (lane == 0 || lane == 2) {
lcd1.setCursor(0, lane / 2);
lcd1.print("Lane ");
lcd1.print(lane / 2 + 1);
lcd1.print(": ");
lcd1.print(color);
} else {
lcd2.setCursor(0, (lane - 1) / 2);
lcd2.print("Lane ");
lcd2.print((lane - 1) / 2 + 1);
lcd2.print(": ");
lcd2.print(color);
}
}