#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// --- Variabel LCD ---
unsigned long prevMillisLCD = 0;
const long intervalLCD = 300;
String text = " ABIL LUCU ";
int pos = 0;
// --- Variabel Lampu ---
int hijau=13, kuning=12, merah=11;
int hijau2=10, kuning2=9, merah2=8;
int hijau3=7, kuning3=6, merah3=5;
int hijau4=4, kuning4=3, merah4=2;
// --- Variabel Kelap-Kelip ---
unsigned long previousMillis = 0;
const long intervalBlink = 200;
bool ledState = LOW;
// --- Variabel Timer Lampu ---
unsigned long prevMillisLampu = 0;
int stepLampu = 0;
void setup() {
lcd.begin(16, 2);
lcd.backlight();
pinMode(hijau, OUTPUT); pinMode(kuning, OUTPUT); pinMode(merah, OUTPUT);
pinMode(hijau2, OUTPUT); pinMode(kuning2, OUTPUT); pinMode(merah2, OUTPUT);
pinMode(hijau3, OUTPUT); pinMode(kuning3, OUTPUT); pinMode(merah3, OUTPUT);
pinMode(hijau4, OUTPUT); pinMode(kuning4, OUTPUT); pinMode(merah4, OUTPUT);
// Matikan semua lampu awal
digitalWrite(hijau, LOW); digitalWrite(kuning, LOW); digitalWrite(merah, LOW);
digitalWrite(hijau2, LOW); digitalWrite(kuning2, LOW); digitalWrite(merah2, LOW);
digitalWrite(hijau3, LOW); digitalWrite(kuning3, LOW); digitalWrite(merah3, LOW);
digitalWrite(hijau4, LOW); digitalWrite(kuning4, LOW); digitalWrite(merah4, LOW);
}
void loop() {
unsigned long currentMillis = millis();
// --- 1️⃣ Update Running Text di LCD ---
if (currentMillis - prevMillisLCD >= intervalLCD) {
prevMillisLCD = currentMillis;
lcd.setCursor(0, 1);
lcd.print(text.substring(pos, pos + 16) + " ");
pos = (pos + 1) % text.length();
}
// --- 2️⃣ Kelap-Kelip Lampu Kuning (Tanpa Ganggu Siklus) ---
if (currentMillis - previousMillis >= intervalBlink) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(kuning2, ledState);
digitalWrite(kuning4, ledState);
}
// --- 3️⃣ Siklus Lampu Lalu Lintas (Non-Blocking) ---
if (currentMillis - prevMillisLampu >= 6000) { // Ganti kondisi tiap 6 detik
prevMillisLampu = currentMillis;
switch (stepLampu) {
case 0: // 🚦 Hijau 3 Nyala, Merah 1 Nyala
digitalWrite(hijau3, HIGH);
digitalWrite(merah, HIGH);
digitalWrite(kuning3, LOW);
stepLampu = 1;
break;
case 1: // ⚠️ Kuning 3 Nyala, Hijau 3 Mati
digitalWrite(hijau3, LOW);
digitalWrite(kuning3, HIGH);
stepLampu = 2;
break;
case 2: // 🔴 Merah 3 Nyala, Hijau 1 Nyala
digitalWrite(kuning3, LOW);
digitalWrite(merah3, HIGH);
digitalWrite(hijau, HIGH);
digitalWrite(merah, LOW);
stepLampu = 3;
break;
case 3: // ⚠️ Kuning 1 Nyala, Hijau 1 Mati
digitalWrite(hijau, LOW);
digitalWrite(kuning, HIGH);
stepLampu = 4;
break;
case 4: // Siklus Ulang
digitalWrite(kuning, LOW);
digitalWrite(merah3, LOW);
stepLampu = 0;
break;
}
}
}