// ===== PIN BUTTON =====
#define btnMerah 2
#define btnPutih 3
#define btnKuning 4
#define btnHijau 5
#define btnBiru 6
// ===== PIN LED =====
#define ledMerah 7
#define ledPutih 8
#define ledKuning 9
#define ledHijau 10
#define ledBiru 11
// ===== PIN BUZZER =====
#define buzzer 12
// Mode: 0=OFF, 1=ON, 2=BLINK, 3=RUNNING
int modeMerah = 0;
int modePutih = 0;
int modeKuning = 0;
int modeHijau = 0;
int modeBiru = 0;
bool lastMerah = HIGH;
bool lastPutih = HIGH;
bool lastKuning = HIGH;
bool lastHijau = HIGH;
bool lastBiru = HIGH;
// ===== RUNNING =====
int runIndex = 0;
int direction = 1;
unsigned long lastRunTime = 0;
void setup() {
pinMode(btnMerah, INPUT_PULLUP);
pinMode(btnPutih, INPUT_PULLUP);
pinMode(btnKuning, INPUT_PULLUP);
pinMode(btnHijau, INPUT_PULLUP);
pinMode(btnBiru, INPUT_PULLUP);
pinMode(ledMerah, OUTPUT);
pinMode(ledPutih, OUTPUT);
pinMode(ledKuning, OUTPUT);
pinMode(ledHijau, OUTPUT);
pinMode(ledBiru, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop() {
bool btn;
// MERAH
btn = digitalRead(btnMerah);
if (lastMerah == HIGH && btn == LOW) {
modeMerah++; if (modeMerah > 3) modeMerah = 0;
delay(200);
}
lastMerah = btn;
// PUTIH
btn = digitalRead(btnPutih);
if (lastPutih == HIGH && btn == LOW) {
modePutih++; if (modePutih > 3) modePutih = 0;
delay(200);
}
lastPutih = btn;
// KUNING
btn = digitalRead(btnKuning);
if (lastKuning == HIGH && btn == LOW) {
modeKuning++; if (modeKuning > 3) modeKuning = 0;
delay(200);
}
lastKuning = btn;
// HIJAU
btn = digitalRead(btnHijau);
if (lastHijau == HIGH && btn == LOW) {
modeHijau++; if (modeHijau > 3) modeHijau = 0;
delay(200);
}
lastHijau = btn;
// BIRU
btn = digitalRead(btnBiru);
if (lastBiru == HIGH && btn == LOW) {
modeBiru++; if (modeBiru > 3) modeBiru = 0;
delay(200);
}
lastBiru = btn;
// MODE PER LED
applyMode(modeMerah, ledMerah);
applyMode(modePutih, ledPutih);
applyMode(modeKuning, ledKuning);
applyMode(modeHijau, ledHijau);
applyMode(modeBiru, ledBiru);
// RUNNING
updateRunning();
}
// ===== APPLY MODE =====
void applyMode(int mode, int pin) {
if (mode == 0) digitalWrite(pin, LOW);
else if (mode == 1) digitalWrite(pin, HIGH);
else if (mode == 2) digitalWrite(pin, (millis() % 300 < 150));
else if (mode == 3) digitalWrite(pin, LOW);
}
// ===== RUNNING =====
void updateRunning() {
bool anyRun =
modeMerah == 3 ||
modePutih == 3 ||
modeKuning == 3 ||
modeHijau == 3 ||
modeBiru == 3;
if (!anyRun) {
digitalWrite(buzzer, LOW);
return;
}
if (millis() - lastRunTime >= 150) {
lastRunTime = millis();
runIndex += direction;
if (runIndex == 4) direction = -1;
if (runIndex == 0) direction = 1;
}
digitalWrite(ledMerah, runIndex == 0 && modeMerah == 3);
digitalWrite(ledPutih, runIndex == 1 && modePutih == 3);
digitalWrite(ledKuning, runIndex == 2 && modeKuning == 3);
digitalWrite(ledHijau, runIndex == 3 && modeHijau == 3);
digitalWrite(ledBiru, runIndex == 4 && modeBiru == 3);
if ((runIndex == 0 && modeMerah == 3) ||
(runIndex == 1 && modePutih == 3) ||
(runIndex == 2 && modeKuning == 3) ||
(runIndex == 3 && modeHijau == 3) ||
(runIndex == 4 && modeBiru == 3)) {
digitalWrite(buzzer, HIGH);
} else {
digitalWrite(buzzer, LOW);
}
}