// =====================
// PIN KENDARAAN
// =====================
#define CAR_RED 22
#define CAR_YELLOW 21
#define CAR_GREEN 19
// =====================
// PIN PEDESTRIAN
// =====================
#define PED_RED 12
#define PED_GREEN 13
// =====================
// TOMBOL
// =====================
#define BUTTON 33
// =====================
// 7 SEGMENT (COMMON CATHODE)
// =====================
#define segA 25
#define segB 23
#define segC 18
#define segD 5
#define segE 4
#define segF 2
#define segG 14
// =====================
bool pedestrianMode = false;
// =====================
void setup() {
pinMode(CAR_RED, OUTPUT);
pinMode(CAR_YELLOW, OUTPUT);
pinMode(CAR_GREEN, OUTPUT);
pinMode(PED_RED, OUTPUT);
pinMode(PED_GREEN, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
allLampOff();
setCarGreen();
}
// =====================
// LOOP UTAMA
// =====================
void loop() {
// ===== MODE NORMAL =====
setCarGreen();
if (countdown(5)) return;
setCarYellow();
countdownOnly(3);
setCarRedPedGreen();
countdownOnly(8);
setCarYellow();
countdownOnly(3);
}
// =====================
// COUNTDOWN + BUTTON
// =====================
bool countdown(int waktu) {
for (int i = waktu; i > 0; i--) {
tampilAngka(i);
for (int j = 0; j < 10; j++) {
if (digitalRead(BUTTON) == LOW && !pedestrianMode) {
pedestrianMode = true;
// LANGSUNG KE MERAH (TANPA KUNING)
pedestrianSequence();
pedestrianMode = false;
return true; // hentikan loop normal
}
delay(100);
}
}
return false;
}
void countdownOnly(int waktu) {
for (int i = waktu; i > 0; i--) {
tampilAngka(i);
delay(1000);
}
}
// =====================
// MODE PEDESTRIAN (LOCKED)
// =====================
void pedestrianSequence() {
// setCarYellow();
// countdownOnly(3);
setCarRedPedGreen();
countdownOnly(5);
setPedRedOnly();
setCarYellow();
countdownOnly(3);
setCarGreen();
}
// =====================
// KONTROL LAMPU (AMAN)
// =====================
void allLampOff() {
digitalWrite(CAR_RED, LOW);
digitalWrite(CAR_YELLOW, LOW);
digitalWrite(CAR_GREEN, LOW);
digitalWrite(PED_RED, LOW);
digitalWrite(PED_GREEN, LOW);
}
void setCarGreen() {
allLampOff();
digitalWrite(CAR_GREEN, HIGH);
digitalWrite(PED_RED, HIGH);
}
void setCarYellow() {
allLampOff();
digitalWrite(CAR_YELLOW, HIGH);
digitalWrite(PED_RED, HIGH);
}
void setCarRedPedGreen() {
allLampOff();
digitalWrite(CAR_RED, HIGH);
digitalWrite(PED_GREEN, HIGH);
}
void setPedRedOnly() {
allLampOff();
digitalWrite(PED_RED, HIGH);
}
// =====================
// 7 SEGMENT
// =====================
void tampilAngka(int a) {
switch (a) {
case 0: nyala(1,1,1,1,1,1,0); break;
case 1: nyala(0,1,1,0,0,0,0); break;
case 2: nyala(1,1,0,1,1,0,1); break;
case 3: nyala(1,1,1,1,0,0,1); break;
case 4: nyala(0,1,1,0,0,1,1); break;
case 5: nyala(1,0,1,1,0,1,1); break;
case 6: nyala(1,0,1,1,1,1,1); break;
case 7: nyala(1,1,1,0,0,0,0); break;
case 8: nyala(1,1,1,1,1,1,1); break;
case 9: nyala(1,1,1,1,0,1,1); break;
}
}
void nyala(int a,int b,int c,int d,int e,int f,int g){
digitalWrite(segA,a);
digitalWrite(segB,b);
digitalWrite(segC,c);
digitalWrite(segD,d);
digitalWrite(segE,e);
digitalWrite(segF,f);
digitalWrite(segG,g);
}