// ---------- Pin-Zuordnungen ----------
// Hier sagen wir dem Arduino, welche Pins mit welchen Teilen des Displays verbunden sind
// Das sind die 7 Segmente (a-g) eines einzelnen Ziffernanzeigers.
// Diese Pins steuern, welche Linien einer Zahl aufleuchten.
int segmentPins[] = {2, 3, 4, 5, 6, 7, 8}; // a, b, c, d, e, f, g
// Das sind die 4 Stellen (Ziffern) auf unserem Display.
// Jeder Pin aktiviert eine der 4 Stellen (Tausender, Hunderter, Zehner, Einer)
int digitPins[] = {10, 11, 12, 13}; // D1, D2, D3, D4
// ---------- Zahlen und ihre Segmente ----------
// Hier speichern wir, welche Segmente man für jede Zahl von 0 bis 9 braucht.
// Zum Beispiel: Um eine "0" zu zeigen, muss man alle Segmente außer „g“ einschalten.
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
};
// ---------- Hilfsvariablen ----------
// Diese Variablen helfen uns, die Zeit im Auge zu behalten.
static unsigned long previousMillis = 0; // Speichert, wann wir zuletzt gezählt haben.
static int count = 0; // Zählt die Sekunden von 0 bis 9999
// ---------- setup() ----------
// Diese Funktion wird nur einmal ganz am Anfang ausgeführt
void setup() {
// Wir sagen dem Arduino, dass die Pins für die Segmente Ausgänge sind
for(int i=0; i<7; i++){
pinMode(segmentPins[i], OUTPUT);
}
// Auch die Pins für die 4 Ziffern sollen Ausgänge sein
for(int i=0; i<4; i++){
pinMode(digitPins[i], OUTPUT);
}
}
// ---------- loop() ----------
// Diese Funktion läuft immer wieder und wieder – der „Motor“ unseres Programms
void loop() {
// --- Zeit zählen ---
// Wenn 1000 Millisekunden (1 Sekunde) vergangen sind...
if (millis() - previousMillis >= 1000) {
previousMillis = millis(); // Zeit merken
count++; // Zähler erhöhen
// Wenn wir bei 9999 sind, wieder von vorne anfangen
if(count > 9999) {
count = 0;
}
}
// --- Zahl in einzelne Stellen aufteilen ---
// Beispiel: Wenn count = 1234, dann wollen wir:
// d1 = 1, d2 = 2, d3 = 3, d4 = 4
int d1 = (count / 1000) % 10; // Tausenderstelle
int d2 = (count / 100) % 10; // Hunderterstelle
int d3 = (count / 10) % 10; // Zehnerstelle
int d4 = (count / 1) % 10; // Einerstelle
// --- Multiplexing ---
// Hier zeigen wir jede Ziffer nacheinander ganz kurz an.
// Das geht so schnell, dass unser Auge denkt, alles leuchtet gleichzeitig!
showDigit(d1, 0); // Zeige erste Stelle (Tausender)
delay(5); // ganz kurze Pause
showDigit(d2, 1); // Zeige zweite Stelle (Hunderter)
delay(5);
showDigit(d3, 2); // Zeige dritte Stelle (Zehner)
delay(5);
showDigit(d4, 3); // Zeige vierte Stelle (Einer)
delay(5);
}
// ---------- showDigit(...) ----------
// Diese Funktion zeigt eine Zahl (0 bis 9) an einer bestimmten Stelle auf dem Display an.
void showDigit(int num, int digitIndex){
// 1) Erstmal alle Stellen ausschalten (HIGH = aus bei Common Cathode)
for(int i=0; i<4; i++){
digitalWrite(digitPins[i], HIGH);
}
// 2) Jetzt die richtigen Segmente für die Zahl setzen
for(int i=0; i<7; i++){
if (numbers[num][i] == 1) {
digitalWrite(segmentPins[i], HIGH); // Segment AN (bei Common Cathode!)
} else {
digitalWrite(segmentPins[i], LOW); // Segment AUS
}
}
// 3) Jetzt die richtige Stelle einschalten (LOW = an bei Common Cathode)
digitalWrite(digitPins[digitIndex], LOW);
}