/******************************************************
* 4-stelliges Common-Cathode-Display (z.B. 5641AS)
* - Digit 1-4 auf Pins 10, 11, 12, 13
* - Segmente a-g auf Pins 2-8
* - Sekunden werden hochgezählt,
* Digit 3 (der drittlinke Ziffer) zeigt die Zehnerstelle der Sekunde.
******************************************************/
// ---------- Pin-Zuordnungen ----------
int segmentPins[] = {2, 3, 4, 5, 6, 7, 8}; // a, b, c, d, e, f, g
int digitPins[] = {10, 11, 12, 13}; // D1, D2, D3, D4 (CC)
// Segmente für Zahlen 0-9
// Reihenfolge pro Array: a b c d e f g
// Beachte: Wir verwenden "1" = Segment an, "0" = Segment aus.
// Da wir Common Cathode haben, bedeutet am Pin:
// HIGH = Segment aus
// LOW = Segment an
// Daher wird in showDigit(...) die Logik invertiert.
//
// Beispiel: {1,1,1,1,1,1,0} = 0
// => a,b,c,d,e,f = an; g = aus
byte numbers[10][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,0,0,1,1} // 9
};
// Ein paar Hilfsvariablen
static unsigned long previousMillis = 0;
static int count = 0; // Zählt die Sekunden von 0..9999
void setup() {
// Segment-Pins auf OUTPUT
for(int i=0; i<7; i++){
pinMode(segmentPins[i], OUTPUT);
}
// Digit-Pins (D1-D4) auf OUTPUT
for(int i=0; i<4; i++){
pinMode(digitPins[i], OUTPUT);
}
}
void loop() {
// --- Sekundenzähler aktualisieren ---
if (millis() - previousMillis >= 1000) {
previousMillis = millis();
count++;
if(count > 9999) {
count = 0; // zurücksetzen
}
}
// --- aktuelle Zahl auf 4 Stellen verteilen ---
// D1 = Tausender, D2 = Hunderter, D3 = Zehner, D4 = Einer
int d1 = (count / 1000) % 10;
int d2 = (count / 100) % 10;
int d3 = (count / 10) % 10; // <-- ZEIGT DIE SEKUNDEN-ZEHNER
int d4 = (count / 1) % 10; // <-- SEKUNDEN-EINER
// --- Multiplexing: alle 4 Digits schnell durchschalten ---
showDigit(d1, 0);
delay(5);
showDigit(d2, 1);
delay(5);
showDigit(d3, 2);
delay(5);
showDigit(d4, 3);
delay(5);
}
// -------------------------------------------------
// Zeigt "num" (0..9) auf Digit "digitIndex" (0..3)
// -------------------------------------------------
void showDigit(int num, int digitIndex){
// 1) Alle Digit-Pins ausschalten = HIGH (Common Cathode)
for(int i=0; i<4; i++){
digitalWrite(digitPins[i], HIGH);
}
// 2) Segmente setzen
// "1" in numbers[][] bedeutet: Segment soll an,
// => Pin muss auf LOW
for(int i=0; i<7; i++){
if (numbers[num][i] == 1) {
digitalWrite(segmentPins[i], HIGH); // Segment an
} else {
digitalWrite(segmentPins[i], LOW); // Segment aus
}
}
// 3) Gewünschtes Digit aktivieren = LOW
digitalWrite(digitPins[digitIndex], LOW);
}