#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi objek LCD dengan alamat I2C dan jumlah kolom dan baris
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin untuk lampu lalu lintas pada Jalur 1
const int redPin1 = 2;
const int yellowPin1 = 3;
const int greenPin1 = 4;
// Pin untuk lampu lalu lintas pada Jalur 2
const int redPin2 = 5;
const int yellowPin2 = 6;
const int greenPin2 = 7;
// Pin untuk lampu lalu lintas pada Jalur 3
const int redPin3 = 8;
const int yellowPin3 = 9;
const int greenPin3 = 10;
void setup() {
// Inisialisasi pin-pin sebagai OUTPUT untuk Jalur 1
pinMode(redPin1, OUTPUT);
pinMode(yellowPin1, OUTPUT);
pinMode(greenPin1, OUTPUT);
// Inisialisasi pin-pin sebagai OUTPUT untuk Jalur 2
pinMode(redPin2, OUTPUT);
pinMode(yellowPin2, OUTPUT);
pinMode(greenPin2, OUTPUT);
// Inisialisasi pin-pin sebagai OUTPUT untuk Jalur 3
pinMode(redPin3, OUTPUT);
pinMode(yellowPin3, OUTPUT);
pinMode(greenPin3, OUTPUT);
// Inisialisasi LCD
lcd.init();
lcd.backlight(); // Nyalakan backlight LCD
}
void loop() {
// Jalur 1 Hijau, Jalur 2 Merah, Jalur 3 Merah
setLights(LOW, LOW, HIGH, HIGH, LOW, LOW, HIGH, LOW, LOW);
displayMessage("Lampu Hijau", "Hati-hati di Jalan");
delay(5000);
// Jalur 1 Kuning, Jalur 2 Merah, Jalur 3 Merah
setLights(LOW, HIGH, LOW, HIGH, LOW, LOW, HIGH, LOW, LOW);
displayMessage("Lampu Kuning", "Bersiap Berhenti");
delay(2000);
// Jalur 1 Merah, Jalur 2 Merah, Jalur 3 Merah
setLights(HIGH, LOW, LOW, HIGH, LOW, LOW, HIGH, LOW, LOW);
displayMessage("Lampu Merah", "Tolong Berhenti");
delay(5000);
// Jalur 1 Merah, Jalur 2 Hijau, Jalur 3 Merah
setLights(HIGH, LOW, LOW, LOW, LOW, HIGH, HIGH, LOW, LOW);
delay(5000);
// Jalur 1 Merah, Jalur 2 Kuning, Jalur 3 Merah
setLights(HIGH, LOW, LOW, LOW, HIGH, LOW, HIGH, LOW, LOW);
delay(2000);
// Jalur 1 Merah, Jalur 2 Merah, Jalur 3 Hijau
setLights(HIGH, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, HIGH);
delay(5000);
// Jalur 1 Merah, Jalur 2 Merah, Jalur 3 Kuning
setLights(HIGH, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH, LOW);
delay(2000);
}
// Fungsi untuk menampilkan pesan bergerak pada LCD hanya untuk Jalur 1
void displayMessage(String line1, String line2) {
String combinedMessage = line1 + " - " + line2;
for (int pos = 0; pos < combinedMessage.length() - 15; ++pos) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(combinedMessage.substring(pos, pos + 16));
delay(300); // Mengatur kecepatan gerakan teks
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
delay(2000); // Tampilkan pesan penuh selama beberapa detik setelah bergerak
}
// Fungsi untuk mengatur status lampu
void setLights(int red1, int yellow1, int green1, int red2, int yellow2, int green2, int red3, int yellow3, int green3) {
digitalWrite(redPin1, red1);
digitalWrite(yellowPin1, yellow1);
digitalWrite(greenPin1, green1);
digitalWrite(redPin2, red2);
digitalWrite(yellowPin2, yellow2);
digitalWrite(greenPin2, green2);
digitalWrite(redPin3, red3);
digitalWrite(yellowPin3, yellow3);
digitalWrite(greenPin3, green3);
}