// Pin untuk seven-segment display (tanpa shift register atau multiplexer)
const int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // A, B, C, D, E, F, G, DP
const int digitPins[] = {10, 11, 12, 13}; // D1, D2, D3, D4
// Pin LED lalu lintas
#define RED_LED A0
#define YELLOW_LED A1
#define GREEN_LED A2
// Pin Buzzer
#define BUZZER A3
// Tabel angka 0-9 untuk seven-segment (tanpa DP)
const byte numbers[10] = {
0b0111111, // 0
0b0000110, // 1
0b1011011, // 2
0b1001111, // 3
0b1100110, // 4
0b1101101, // 5
0b1111101, // 6
0b0000111, // 7
0b1111111, // 8
0b1101111 // 9
};
// Tabel huruf untuk "GO"
const byte letterG = 0b0111101; // G
const byte letterO = 0b0111111; // O
void setup() {
// Atur semua pin sebagai output
for (int i = 0; i < 8; i++) pinMode(segmentPins[i], OUTPUT);
for (int i = 0; i < 4; i++) pinMode(digitPins[i], OUTPUT);
// Atur pin LED lalu lintas sebagai output
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
// Atur pin buzzer sebagai output
pinMode(BUZZER, OUTPUT);
}
// Fungsi untuk menampilkan angka pada seven-segment
void displayNumber(int number) {
int digits[4] = {
(number / 1000) % 10, // Ribuan
(number / 100) % 10, // Ratusan
(number / 10) % 10, // Puluhan
number % 10 // Satuan
};
for (int d = 0; d < 4; d++) {
digitalWrite(digitPins[d], LOW); // Aktifkan digit
for (int s = 0; s < 7; s++) {
digitalWrite(segmentPins[s], (numbers[digits[d]] >> s) & 1);
}
delay(5); // Multiplexing manual agar tampilan stabil
digitalWrite(digitPins[d], HIGH); // Matikan digit
}
}
// Fungsi untuk menampilkan "GO"
void displayGO() {
// Matikan semua digit sebelum menampilkan
for (int d = 0; d < 4; d++) {
digitalWrite(digitPins[d], HIGH);
}
// Digit kedua (G)
digitalWrite(digitPins[1], LOW);
for (int s = 0; s < 7; s++) {
digitalWrite(segmentPins[s], (letterG >> s) & 1);
}
delay(5);
digitalWrite(digitPins[1], HIGH);
// Digit ketiga (O)
digitalWrite(digitPins[2], LOW);
for (int s = 0; s < 7; s++) {
digitalWrite(segmentPins[s], (letterO >> s) & 1);
}
delay(5);
digitalWrite(digitPins[2], HIGH);
}
// Fungsi countdown untuk LED, seven-segment, dan buzzer
void countdown(int seconds, int ledPin, bool buzzerActive, int buzzerMode) {
digitalWrite(ledPin, HIGH);
for (int i = seconds; i >= 0; i--) {
for (int j = 0; j < 20; j++) { // Multiplexing agar tampilan stabil
displayNumber(i);
}
// **Buzzer Logic**
if (buzzerActive) {
if (buzzerMode == 1 && i <= 2) {
// Lampu merah: buzzer menyala 2 detik terakhir
tone(BUZZER, 1000);
delay(200);
noTone(BUZZER);
} else if (buzzerMode == 2) {
// Lampu kuning: buzzer menyala setiap detik
tone(BUZZER, 1000);
delay(200);
noTone(BUZZER);
}
}
}
digitalWrite(ledPin, LOW);
}
// Fungsi khusus untuk menampilkan "GO" saat lampu hijau menyala
void countdownGO(int seconds) {
digitalWrite(GREEN_LED, HIGH); // Nyalakan lampu hijau
unsigned long startTime = millis();
bool buzzerActive = true; // Buzzer hanya aktif di 3 detik pertama
while (millis() - startTime < seconds * 1000) {
for (int i = 0; i < 100; i++) { // Multiplexing agar tampilan stabil
displayGO();
}
// Buzzer nyala selama 3 detik pertama
if (millis() - startTime < 8000 && buzzerActive) {
tone(BUZZER, 1000);
} else {
noTone(BUZZER);
buzzerActive = false;
}
}
digitalWrite(GREEN_LED, LOW); // Matikan lampu hijau setelah 10 detik
}
void loop() {
countdown(15, RED_LED, true, 1); // Lampu merah 15 detik, buzzer di 2 detik terakhir
countdown(3, YELLOW_LED, true, 2); // Lampu kuning 3 detik, buzzer setiap detik
countdownGO(10); // Menampilkan "GO" selama 10 detik penuh
}