Einstellbarer Countdown-Timer mit Arduino & 4-stelligem 7-Segment-Display
Komponenten und Zubehör
| Bauteil | Menge | Hinweise |
|---|---|---|
| Arduino Mega 2560 (oder beliebiger Arduino) | 1 | |
| 4-stelliges 7-Segment-Display (Common Anode) | 1 | 4 Digit-Pins, 7 Segment-Pins |
| Taster | 4 | Start/Stop, Reset, Hoch, Runter |
| Summer (Piezo) | 1 | Für Alarmton |
| Steckbrücken | ca. 21 | |
| Steckbrett (Full-Size) | 1 |
Projektbeschreibung
Ein Countdown-Timer ist das klassische Projekt für 4-stellige 7-Segment-Displays. Ich fand jedoch keine Version, die standalone per Taster einstellbar ist (ohne Code-Änderung). Also entwickelte ich diesen Timer mit komfortabler Bedienung.
Der Code enthält eine wiederverwendbare Funktion PrintNumber(int zahl, int zeit), die eine Zahl (0–9999) für eine gewisse Zeit anzeigt – nützlich für andere Projekte.
Bedienung
- Taster 1 (Pin 13): Startet Countdown / bestätigt Einstellung
- Taster 2 (Pin 12): Stoppt / bricht ab
- Taster 3 (Pin 16): Zeit verringern (gedrückt halten für Schnelllauf)
- Taster 4 (Pin 17): Zeit erhöhen (gedrückt halten für Schnelllauf)
Nach Ablauf ertönt Summer (1 kHz, 1 s). Danach zurück zum Einstellmodus.
Code (C/C++)
#include <math.h>
int digit_pin[] = {6, 9, 10, 11}; // Digit-Pins (PWM) links nach rechts
int speakerPin = 15;
#define DIGIT_ON LOW
#define DIGIT_OFF HIGH
// Segment-Pins (Common Anode: HIGH = an)
int segA = 2, segB = 3, segC = 4, segD = 5, segE = A0, segF = 7, segG = 8;
int button1 = 13, button2 = 12, button3 = 16, button4 = 17;
int countdown_time = 60; // Startwert in Sekunden
struct Digits { int d[4]; };
void setup() {
pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT);
for (int i = 0; i < 4; i++) pinMode(digit_pin[i], OUTPUT);
pinMode(speakerPin, OUTPUT);
pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP); pinMode(button4, INPUT_PULLUP);
}
void playTone(int tone, int duration) {
for (long k = 0; k < duration * 1000L; k += tone * 2) {
digitalWrite(speakerPin, HIGH); delayMicroseconds(tone);
digitalWrite(speakerPin, LOW); delayMicroseconds(tone);
}
}
void lightNumber(int num) {
#define SEG_ON HIGH
#define SEG_OFF LOW
switch (num) {
case 0: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_OFF); break;
case 1: digitalWrite(segA, SEG_OFF); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_OFF); break;
case 2: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_OFF); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_ON); break;
case 3: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_ON); break;
case 4: digitalWrite(segA, SEG_OFF); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
case 5: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_OFF); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
case 6: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_OFF); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
case 7: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_OFF); break;
case 8: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
case 9: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
case 10: digitalWrite(segA, SEG_OFF); digitalWrite(segB, SEG_OFF); digitalWrite(segC, SEG_OFF); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_OFF); break;
}
}
void switchDigit(int d) {
for (int i = 0; i < 4; i++) digitalWrite(digit_pin[i], (i == d) ? DIGIT_ON : DIGIT_OFF);
}
Digits intToDigits(int n) {
Digits dig; int zeros = 0, d;
for (int i = 0; i < 4; i++) {
d = n / pow(10, 3 - i);
zeros += d;
n -= d * pow(10, 3 - i);
dig.d[i] = (zeros != 0 || i == 3) ? d : 10; // 10 = führende Null ausblenden
}
return dig;
}
void printNumber(int n, int timeMs) {
Digits dig = intToDigits(n);
for (int i = 0; i <= timeMs / 20; i++) {
if (digitalRead(button2) == LOW) return; // Abbruch
for (int j = 0; j < 4; j++) { switchDigit(j); lightNumber(dig.d[j]); delay(5); }
}
}
bool countdown(int n, int tickMs) {
for (int q = n; q > 0; q--) {
printNumber(q, tickMs);
if (digitalRead(button2) == LOW) return false;
}
printNumber(0, 0);
playTone(1519, 1000); // Alarm
return true;
}
void resetMode() {
int pressed3 = 0, pressed4 = 0;
Digits dig = intToDigits(countdown_time);
while (digitalRead(button1) == HIGH) { // Warten auf Start
for (int j = 0; j < 4; j++) { switchDigit(j); lightNumber(dig.d[j]); delay(5); }
if (digitalRead(button3) == LOW) {
if (pressed3 == 0 || pressed3 > 30) { if (countdown_time > 0) countdown_time--; dig = intToDigits(countdown_time); }
pressed3++;
} else if (digitalRead(button4) == LOW) {
if (pressed4 == 0 || pressed4 > 30) { if (countdown_time < 9999) countdown_time++; dig = intToDigits(countdown_time); }
pressed4++;
}
if (digitalRead(button3) == HIGH) pressed3 = 0;
if (digitalRead(button4) == HIGH) pressed4 = 0;
}
}
void loop() {
resetMode();
while (!countdown(countdown_time, 962)) { resetMode(); }
while (digitalRead(button2) == HIGH) {} // Warten auf Reset-Taste
}
Schaltplan
Siehe Fritzing-Bild im Original: Segmente an Pins 2–5, 7, 8, A0; Digit-Pins an 6, 9, 10, 11 (PWM); Taster an 12, 13, 16, 17 (Pull-Up); Summer an Pin 15.
Herstellungsprozess
- Flüssigkristall-Display (LCD): Technologie, Fertigung und Zukunftsaussichten
- Methodenüberladung in C# meistern: Konzepte, Beispiele und Best Practices
- Primal Display: Raspberry Pi LCD-Temperaturmonitor mit DHT11 bauen
- Kuman 3,5″ TFT Display auf RetroPie installieren – Schritt-für-Schritt-Anleitung
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Klassisches Pong-Spiel auf Arduino UNO mit OLED-Display bauen – Schritt-für-Schritt-Tutorial
- Watchdog-Timer am Arduino verstehen & nutzen – Schutz vor Programmabstürzen
- ATmega328P Alien-Slot-Machine Kit – Selbstbau-Spielautomat
- Interaktives Nextion HMI Projekt mit Arduino Mega und Sensoren
- Einstellbare Stoßdämpfer: Fahrhöhe und Performance optimieren