/**
* PROGRAM COUNTER DOWN 1 SEVEN SEGMENT - ESP32
* Counter: 9 -> 8 -> 7 -> ... -> 0 -> 9 (berulang)
* Menggunakan 7 segment common anode
*/
// Deklarasi pin untuk setiap segment
#define SEG_A 19
#define SEG_B 18
#define SEG_C 5
#define SEG_D 17
#define SEG_E 16
#define SEG_F 4
#define SEG_G 2
#define SEG_DP 15 // Decimal Point (optional)
// Array semua pin segment untuk memudahkan akses
const int segmentPins[] = {SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G, SEG_DP};
// Pattern untuk angka 0-9 pada seven segment common anode
// Format: {A, B, C, D, E, F, G, DP}
// 0 = ON (LOW), 1 = OFF (HIGH) untuk common anode
const byte digitPatterns[10][8] = {
{0, 0, 0, 0, 0, 0, 1, 1}, // 0 - Semua segment nyala kecuali G
{1, 0, 0, 1, 1, 1, 1, 1}, // 1 - Hanya B dan C nyala
{0, 0, 1, 0, 0, 1, 0, 1}, // 2
{0, 0, 0, 0, 1, 1, 0, 1}, // 3
{1, 0, 0, 1, 1, 0, 0, 1}, // 4
{0, 1, 0, 0, 1, 0, 0, 1}, // 5
{0, 1, 0, 0, 0, 0, 0, 1}, // 6
{0, 0, 0, 1, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0, 1}, // 8 - Semua segment nyala
{0, 0, 0, 0, 1, 0, 0, 1} // 9
};
// Variabel counter
int counter = 9; // Mulai dari 9
unsigned long previousMillis = 0;
const long interval = 1000; // 1 detik
// Status untuk blink saat counter habis
bool blinkState = false;
int blinkCount = 0;
void setup() {
Serial.begin(115200);
Serial.println("=======================================");
Serial.println("ESP32 - COUNTER DOWN 7 SEGMENT");
Serial.println("Counter: 9 -> 8 -> 7 -> ... -> 0 -> 9");
Serial.println("=======================================");
// Inisialisasi semua pin segment sebagai OUTPUT
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], HIGH); // Matikan semua segment awal
}
// Tampilkan angka awal
displayDigit(counter);
// Tampilkan pesan awal di Serial Monitor
Serial.print("Counter dimulai dari: ");
Serial.println(counter);
}
void loop() {
unsigned long currentMillis = millis();
// Countdown setiap 1 detik
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Kurangi counter
counter--;
// Jika counter kurang dari 0, reset ke 9
if (counter < 0) {
counter = 9;
blinkCount = 0; // Reset blink counter
Serial.println("Counter direset ke 9!");
}
// Tampilkan digit
displayDigit(counter);
// Tampilkan di Serial Monitor
Serial.print("Counter: ");
Serial.println(counter);
// Jika counter 0, berikan efek blink 3 kali
if (counter == 0) {
blinkEffect();
}
}
}
/**
* Fungsi untuk menampilkan digit pada seven segment
* @param digit Angka 0-9 yang akan ditampilkan
*/
void displayDigit(int digit) {
// Pastikan digit dalam range 0-9
if (digit < 0 || digit > 9) {
digit = 0;
}
// Set setiap pin segment sesuai pattern
for (int i = 0; i < 8; i++) {
digitalWrite(segmentPins[i], digitPatterns[digit][i]);
}
}
/**
* Efek blink saat counter mencapai 0
* Seven segment akan blink 3 kali
*/
void blinkEffect() {
Serial.println("Counter mencapai 0! Blink effect...");
for (int i = 0; i < 3; i++) {
// Matikan semua segment
for (int j = 0; j < 8; j++) {
digitalWrite(segmentPins[j], HIGH);
}
delay(200);
// Tampilkan angka 0 lagi
displayDigit(0);
delay(200);
}
}
/**
* Fungsi untuk menampilkan custom pattern
* Berguna untuk debugging atau efek khusus
*/
void displayCustomPattern(byte pattern[]) {
for (int i = 0; i < 8; i++) {
digitalWrite(segmentPins[i], pattern[i]);
}
}
/**
* Fungsi untuk test semua segment satu per satu
* Panggil di setup() untuk testing hardware
*/
void testAllSegments() {
Serial.println("Testing semua segment...");
// Test setiap segment satu per satu
byte testPatterns[8][8] = {
{0, 1, 1, 1, 1, 1, 1, 1}, // A nyala
{1, 0, 1, 1, 1, 1, 1, 1}, // B nyala
{1, 1, 0, 1, 1, 1, 1, 1}, // C nyala
{1, 1, 1, 0, 1, 1, 1, 1}, // D nyala
{1, 1, 1, 1, 0, 1, 1, 1}, // E nyala
{1, 1, 1, 1, 1, 0, 1, 1}, // F nyala
{1, 1, 1, 1, 1, 1, 0, 1}, // G nyala
{1, 1, 1, 1, 1, 1, 1, 0} // DP nyala
};
for (int i = 0; i < 8; i++) {
Serial.print("Testing segment: ");
Serial.println(i);
displayCustomPattern(testPatterns[i]);
delay(500);
}
// Test angka 0-9
Serial.println("Testing angka 0-9...");
for (int num = 0; num < 10; num++) {
Serial.print("Angka: ");
Serial.println(num);
displayDigit(num);
delay(500);
}
// Kembali ke counter awal
displayDigit(counter);
}