#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD dengan alamat I2C berbeda
LiquidCrystal_I2C lcd1(0x27, 16, 2);
LiquidCrystal_I2C lcd2(0x26, 16, 2);
LiquidCrystal_I2C lcd3(0x25, 16, 2);
LiquidCrystal_I2C lcd4(0x24, 16, 2);
// Pin LED
const int redPin = 12;
const int yellowPin = 27;
const int greenPin = 26;
void setup() {
// Inisialisasi LCD
lcd1.init();
lcd1.backlight();
lcd2.init();
lcd2.backlight();
lcd3.init();
lcd3.backlight();
lcd4.init();
lcd4.backlight();
// Inisialisasi pin LED
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
// Tampilkan pesan awal
lcd1.setCursor(0, 0);
lcd1.print("Traffic Light 1");
lcd2.setCursor(0, 0);
lcd2.print("Traffic Light 2");
lcd3.setCursor(0, 0);
lcd3.print("Traffic Light 3");
lcd4.setCursor(0, 0);
lcd4.print("Traffic Light 4");
delay(2000);
}
void loop() {
// Siklus lampu lalu lintas
updateTrafficLight(&lcd1, "Green");
delay(10000);
updateTrafficLight(&lcd1, "Yellow");
delay(3000);
updateTrafficLight(&lcd1, "Red");
updateTrafficLight(&lcd2, "Green");
delay(10000);
updateTrafficLight(&lcd2, "Yellow");
delay(3000);
updateTrafficLight(&lcd2, "Red");
updateTrafficLight(&lcd3, "Green");
delay(10000);
updateTrafficLight(&lcd3, "Yellow");
delay(3000);
updateTrafficLight(&lcd3, "Red");
updateTrafficLight(&lcd4, "Green");
delay(10000);
updateTrafficLight(&lcd4, "Yellow");
delay(3000);
updateTrafficLight(&lcd4, "Red");
}
// Fungsi untuk memperbarui status LCD dan LED
void updateTrafficLight(LiquidCrystal_I2C *lcd, String color) {
lcd->clear();
lcd->setCursor(0, 0);
lcd->print("Status: ");
lcd->setCursor(0, 1);
lcd->print(color);
// Update LED
if (color == "Green") {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
} else if (color == "Yellow") {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
} else if (color == "Red") {
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
}
}