Eine Eieruhr mit Arduino? Warum nicht! In diesem Projekt baue ich eine digitale Countdown-Uhr, die die verbleibende Zeit auf einer 4-stelligen 7-Segment-Anzeige darstellt und nach Ablauf ein akustisches Signal über einen Piezo-Buzzer ausgibt.
Ein besonderer Vorteil dieser Anzeige ist, dass sie einen Doppelpunkt besitzt. Dadurch kann die Zeitdarstellung automatisch angepasst werden:
- Bis 59 Sekunden wird der Countdown klassisch in Sekunden angezeigt.
- Ab 60 Sekunden wechselt die Anzeige in das MM:SS-Format (Minuten:Sekunden).
Dadurch ist eine maximale Countdown-Zeit von 99 Minuten und 59 Sekunden möglich – perfekt für das Frühstücksei, aber auch ideal für längere Koch- oder Backvorgänge.
Die Steuerung erfolgt über zwei Taster:
🔴 Roter Taster – Stoppt den Timer jederzeit.
🟢 Grüner Taster – Startet den Timer mit der voreingestellten Zeit.
Das Ganze läuft auf einem Arduino Nano V3, der genauso leistungsfähig wie ein Arduino UNO ist, aber deutlich kompakter.
Im folgenden Abschnitt zeige ich dir, wie du diese digitale Eieruhr mit flexibler Zeitdarstellung und akustischem Countdown-Signal ganz einfach selbst nachbauen kannst!
Hinweis: Idee aus der Community – Die Idee zu diesem Beitrag stammt von einem Leser meines Blogs, der sich zum Beitrag „Flexibler Timer für Arduino: Wie du die Zeit per Poti regulierst“ gemeldet hat. Dort habe ich gezeigt, wie man mit einem Drehpotentiometer die Timersteuerung am Arduino flexibel anpassen kann.


Zunächst habe ich versucht, die Zeitsteuerung mit einem Rotary Encoder zu realisieren. Allerdings führte das Aktualisieren der 4-stelligen 7-Segmentanzeige dazu, dass Impulse des Encoders nicht zuverlässig erkannt wurden. Deshalb bin ich auf eine einfache und robuste Lösung mit drei Tastern umgestiegen:
- „+“ erhöht den Timer-Wert.
- „-“ verringert den Timer-Wert.
- „Select“ wechselt zwischen Minuten- und Sekunden-Einstellung.
Diese Lösung ist nicht nur stabiler, sondern auch intuitiv in der Bedienung.
Ich freue mich immer über Input aus der Community und helfe gerne weiter, wenn es um spannende Projekte geht. Falls du also eigene Ideen oder Fragen hast, hinterlasse einfach einen Kommentar – vielleicht wird daraus ja der nächste Blogbeitrag! 😊
Inhaltsverzeichnis
- Aufbau der Schaltung – Eieruhr mit Segmentanzeige und Taster am Arduino Nano
- Alternativer Aufbau am Arduino UNO R3/R4 mit Prototyp-Board
- Programmieren der Arduino Eieruhr in der Arduino IDE
- fertiger Quellcode – Arduino Eieruhr mit flexiblem Timer
- Ausblick: Eieruhr mit ESP32-C3 und MicroPython
Aufbau der Schaltung – Eieruhr mit Segmentanzeige und Taster am Arduino Nano
Bevor wir die Schaltung auf eine Platine übertragen, bauen wir sie zunächst auf einem Breadboard auf. Dafür benötigen wir folgende Komponenten:
- Arduino Nano V3* (inkl. Datenkabel)
- Piezo-Buzzer* für das akustische Signal
- fünf Taster mit Tasterkappen* (Start/Stopp)
- 4-stellige 7-Segmentanzeige Typ TM1637*
- 830-Pin Breadboard* für den Hauptaufbau
- 170-Pin Breadboard* für die Segmentanzeige
- diverse Breadboardkabel* zur Verkabelung
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Falls du keinen Arduino Nano V3 zur Hand hast, kannst du alternativ auch ein Arduino UNO oder Arduino Mega verwenden. Ich habe mich für den Nano entschieden, da er genauso leistungsfähig wie der UNO ist, aber deutlich kompakter – was später für die endgültige Schaltung von Vorteil ist.
Wenn du es aber noch kompakter als den schon kleinen Arduino Nano V3 haben möchtest, dann kannst du den Super Mini Arduino Nano Clone verwenden welchen ich im Beitrag Arduino Nano Clone von Aliexpress: Günstig, aber oft mit Mängeln vorgestellt habe. Dieser bietet trotz seiner Größe genügend Pins & Power für dieses Projekt.


Alternativer Aufbau am Arduino UNO R3/R4 mit Prototyp-Board
Die Schaltung ist kompakt genug um auch auf einem Prototyp-Board für den Arduino UNO gebaut zu werden.



Da der neue Arduino UNO R4 das selbe Pinout hat wie der Vorgänger UBO R3 kannst du hier auch auf den neuen Mikrocontroller der Arduino Familie setzen.
Programmieren der Arduino Eieruhr in der Arduino IDE
Wie du einen Taster, Drehpotentiometer, Piezo Buzzer und auch die 4fach 7 Segmentanzeige am Arduino programmierst habe ich dir bereits in separaten Beiträgen gezeigt.
- Arduino Lektion 87: Taster entprellen
- Arduino UNO R3 – Gabellichtschranke& Piezo Buzzer
- Arduino Lektion 26: TM1637 – 4 Digit 7 Segment Display
Nachfolgend, die Schritt-für-Schritt-Anleitung zur erstellung des Sketches für die Eieruhr.
Schritt 1 – einbinden der benötigten Module
Für die Ansteuerung der 4fach 7 Segmentanzeige vom Typ TM1637 und zum entprellen der Taster benötigen wir jeweils eine Bibliothek. Diese können wir über den Bibliotheksverwalter installieren.
Sobald beide Bibliotheken installiert sind, können wir sie mit dem folgenden Befehl in unser Projekt einbinden.
#include <TM1637Display.h> // Bibliothek für die 7-Segment-Anzeige (TM1637) #include <Bounce2.h> // Bibliothek zur Tasten-Entprellung
Schritt 2 – definieren der verwendeten Pins & Objekte initialisieren
Im nächsten Schritt definieren wir die Pins für die verbauten Komponenten und initalisieren die entsprechenden Objekte.
// Pins für die 7-Segment-Anzeige #define segmentanzeige_CLK 6 #define segmentanzeige_DIO 5 TM1637Display display(segmentanzeige_CLK, segmentanzeige_DIO); // Anzeige-Objekt erstellen // Tasten-Pins definieren #define tasterStopp 3 #define tasterStart 4 #define tasterPlus 7 #define tasterMinus 8 #define tasterSelect 9 // Bounce-Objekte für die Tasten-Entprellung Bounce bceTasterStopp = Bounce(); Bounce bceTasterStart = Bounce(); Bounce bceTasterPlus = Bounce(); Bounce bceTasterMinus = Bounce(); Bounce bceTasterSelect = Bounce(); // Pin für den Piezo-Buzzer #define buzzer 10
Schritt 3 – Felder zum speichern der Zustände
Für unseren Code benötigen wir einpaar Felder in welche wir zbsp. speichern ob der Countdown gerade läuft und wie hoch der Countdown ist.
// Variable für den Countdown in Sekunden unsigned int seconds = 0; // Timer-Zustand (läuft oder gestoppt) bool clockStarted = false; // Auswahl der Zeiteinheit: // 0 = Sekunden, 1 = Minuten unsigned int timeAuswahl = 0; // Wartezeit zwischen Sekundenverringerungen const unsigned int PAUSE = 1000; unsigned long lastAction = 1L; // Alarmzustand (true = abgelaufen) bool alarm = false;
Schritt 4 – Funktion Setup
Die setup()-Funktion wird einmalig beim Start des Mikrocontrollers aufgerufen – sowie nach einem Neustart über den RESET-Taster. In dieser Funktion legen wir die Helligkeit der 7-Segment-Anzeige fest und verknüpfen die Taster-Pins mit den Bounce-Objekten, um eine zuverlässige Tastenentprellung zu gewährleisten.
void setup() { Serial.begin(9600); Serial.println("Initialized"); // Debug-Ausgabe // Helligkeit der 7-Segment-Anzeige setzen (maximale Helligkeit: 7) display.setBrightness(7); // Anzeige initial mit "--:--" belegen uint8_t data[] = { 0xff, 0xff, 0xff, 0xff }; display.setSegments(data); // Taster als Eingänge mit Pull-Up-Widerständen definieren und entprellen bceTasterStopp.attach(tasterStopp, INPUT_PULLUP); bceTasterStopp.interval(5); bceTasterStart.attach(tasterStart, INPUT_PULLUP); bceTasterStart.interval(5); bceTasterPlus.attach(tasterPlus, INPUT_PULLUP); bceTasterPlus.interval(5); bceTasterMinus.attach(tasterMinus, INPUT_PULLUP); bceTasterMinus.interval(5); bceTasterSelect.attach(tasterSelect, INPUT_PULLUP); bceTasterSelect.interval(5); pinMode(buzzer, OUTPUT); // Buzzer als Ausgang setzen displayTime(); // Anfangszeit auf dem Display aktualisieren }
Schritt 5 – Funktion loop
Die loop()-Funktion wird kontinuierlich ausgeführt und enthält den Code für die Steuerung der Eieruhr.
Bevor wir die Taster auswerten können, müssen wir sie mit der Funktion update() aktualisieren. Anschließend können wir mit fell() überprüfen, ob ein Taster losgelassen wurde, um entsprechende Aktionen auszuführen.
// Tasten aktualisieren (Entprellung) bceTasterStopp.update(); bceTasterStart.update(); // Taster "Stopp" beendet den Timer und setzt den Alarm zurück if (bceTasterStopp.fell()) { clockStarted = false; alarm = false; } // Taster "Start" beginnt den Countdown if (bceTasterStart.fell()) { clockStarted = true; alarm = false; }
Der Countdown wird durch das Drücken der Start-Taste aktiviert, wodurch die Variable clockStarted auf true
und alarm auf false
gesetzt wird. Dadurch beginnt der Timer zu laufen und zählt in der loop()-Funktion in Schritten von einer Sekunde herunter.
// Wenn der Timer läuft und noch nicht abgelaufen ist else if (clockStarted && !alarm) { unsigned long currentMillis = millis(); // Jede Sekunde die Zeit verringern if ((lastAction + PAUSE) < currentMillis) { lastAction = currentMillis; if (seconds > 0) { seconds--; // Eine Sekunde abziehen } else { alarm = true; // Timer abgelaufen } } displayTime();
Solange der Countdown nicht gestartet ist, also die Variable clockStarted auf false
steht, kann die Zeit eingestellt werden.
Über die Select-Taste lässt sich zwischen den beiden Einstellfeldern Minuten und Sekunden wechseln.
- In der Sekunden-Einstellung wird der Wert sekundengenau um eins erhöht oder verringert.
- Ist die Minuten-Einstellung aktiv, werden 60 Sekunden zur Variable seconds hinzugefügt oder abgezogen.
if (!clockStarted) { bool buttonPressed = false; // Taster "Select" wechselt zwischen Minuten- und Sekundenmodus if (bceTasterSelect.fell()) { timeAuswahl = (timeAuswahl == 0) ? 1 : 0; } // Taster "+" erhöht die Sekunden oder Minuten if (bceTasterPlus.fell()) { buttonPressed = true; if (timeAuswahl == 0) { seconds++; } else { seconds += 60; } } // Taster "-" verringert die Sekunden oder Minuten if (bceTasterMinus.fell() && seconds > 0) { buttonPressed = true; if (timeAuswahl == 0) { seconds--; } else { seconds -= 60; } } // Nach einer Änderung die neue Zeit anzeigen if (buttonPressed) { displayTime(); } }
fertiger Quellcode – Arduino Eieruhr mit flexiblem Timer
Nachfolgende der fertige Code mit Kommentaren etc.
/* Arduino-gestützte Eieruhr: Flexible Countdown-Anzeige mit akustischem Alarm Dieses Programm steuert eine digitale Eieruhr mit einem Arduino Nano V3. Der Countdown wird auf einer 4-stelligen TM1637 7-Segmentanzeige dargestellt. Die Bedienung erfolgt über drei Taster: - "+" und "-" zur Zeiteinstellung - "Select" zum Wechsel zwischen Minuten- und Sekundeneinstellung - "Start" und "Stopp" zur Steuerung des Timers Nach Ablauf der eingestellten Zeit gibt ein Piezo-Buzzer ein akustisches Signal aus. Weitere Informationen und die vollständige Anleitung findest du hier:Arduino-gestützte Eieruhr: Flexible Countdown-Anzeige mit akustischem AlarmAuthor: Stefan Draeger Webseite: https://draeger-it.blog Kontakt: info@draeger-it.blog */ #include <TM1637Display.h> // Bibliothek für die 7-Segment-Anzeige (TM1637) #include <Bounce2.h> // Bibliothek zur Tasten-Entprellung // Pins für die 7-Segment-Anzeige #define segmentanzeige_CLK 6 #define segmentanzeige_DIO 5 TM1637Display display(segmentanzeige_CLK, segmentanzeige_DIO); // Anzeige-Objekt erstellen // Tasten-Pins definieren #define tasterStopp 3 #define tasterStart 4 #define tasterPlus 7 #define tasterMinus 8 #define tasterSelect 9 // Bounce-Objekte für die Tasten-Entprellung Bounce bceTasterStopp = Bounce(); Bounce bceTasterStart = Bounce(); Bounce bceTasterPlus = Bounce(); Bounce bceTasterMinus = Bounce(); Bounce bceTasterSelect = Bounce(); // Pin für den Piezo-Buzzer #define buzzer 10 // Variable für den Countdown in Sekunden unsigned int seconds = 0; // Timer-Zustand (läuft oder gestoppt) bool clockStarted = false; // Auswahl der Zeiteinheit: // 0 = Sekunden, 1 = Minuten unsigned int timeAuswahl = 0; // Wartezeit zwischen Sekundenverringerungen const unsigned int PAUSE = 1000; unsigned long lastAction = 1L; // Alarmzustand (true = abgelaufen) bool alarm = false; void setup() { Serial.begin(9600); Serial.println("Initialized"); // Debug-Ausgabe // Helligkeit der 7-Segment-Anzeige setzen (maximale Helligkeit: 7) display.setBrightness(7); // Anzeige initial mit "--:--" belegen uint8_t data[] = { 0xff, 0xff, 0xff, 0xff }; display.setSegments(data); // Taster als Eingänge mit Pull-Up-Widerständen definieren und entprellen bceTasterStopp.attach(tasterStopp, INPUT_PULLUP); bceTasterStopp.interval(5); bceTasterStart.attach(tasterStart, INPUT_PULLUP); bceTasterStart.interval(5); bceTasterPlus.attach(tasterPlus, INPUT_PULLUP); bceTasterPlus.interval(5); bceTasterMinus.attach(tasterMinus, INPUT_PULLUP); bceTasterMinus.interval(5); bceTasterSelect.attach(tasterSelect, INPUT_PULLUP); bceTasterSelect.interval(5); pinMode(buzzer, OUTPUT); // Buzzer als Ausgang setzen displayTime(); // Anfangszeit auf dem Display aktualisieren } // Funktion zur Anzeige der aktuellen Zeit auf dem 7-Segment-Display void displayTime() { int minutes = seconds / 60; // Minuten berechnen // Begrenzung auf maximal 99 Minuten if (minutes > 99) { minutes = 99; } int fourDigitValue = (minutes * 100) + (seconds % 60); // Anzeigeformat MM:SS display.showNumberDecEx(fourDigitValue, 0b01000000, true, 4, 4); } void loop() { // Tasten aktualisieren (Entprellung) bceTasterStopp.update(); bceTasterStart.update(); bceTasterPlus.update(); bceTasterMinus.update(); bceTasterSelect.update(); // Wenn die Uhr nicht läuft, kann die Zeit eingestellt werden if (!clockStarted) { bool buttonPressed = false; // Taster "Select" wechselt zwischen Minuten- und Sekundenmodus if (bceTasterSelect.fell()) { timeAuswahl = (timeAuswahl == 0) ? 1 : 0; } // Taster "+" erhöht die Sekunden oder Minuten if (bceTasterPlus.fell()) { buttonPressed = true; if (timeAuswahl == 0) { seconds++; } else { seconds += 60; } } // Taster "-" verringert die Sekunden oder Minuten if (bceTasterMinus.fell() && seconds > 0) { buttonPressed = true; if (timeAuswahl == 0) { seconds--; } else { seconds -= 60; } } // Nach einer Änderung die neue Zeit anzeigen if (buttonPressed) { displayTime(); } } // Wenn der Timer läuft und noch nicht abgelaufen ist else if (clockStarted && !alarm) { unsigned long currentMillis = millis(); // Jede Sekunde die Zeit verringern if ((lastAction + PAUSE) < currentMillis) { lastAction = currentMillis; if (seconds > 0) { seconds--; // Eine Sekunde abziehen } else { alarm = true; // Timer abgelaufen } } displayTime(); } // Wenn die Zeit abgelaufen ist, Alarm auslösen else if (clockStarted && alarm) { tone(buzzer, 1400, 175); // Buzzer mit 1.4 kHz für 175ms aktivieren } // Taster "Stopp" beendet den Timer und setzt den Alarm zurück if (bceTasterStopp.fell()) { clockStarted = false; alarm = false; } // Taster "Start" beginnt den Countdown if (bceTasterStart.fell()) { clockStarted = true; alarm = false; } }
Ausblick: Eieruhr mit ESP32-C3 und MicroPython
Die aktuelle Umsetzung der Eieruhr mit dem Arduino Nano V3 funktioniert einwandfrei, doch es gibt noch Optimierungspotential. Eine spannende Alternative bietet der ESP32-C3, ein leistungsstarker und dennoch kompakter Mikrocontroller mit WiFi- und Bluetooth-Funktionalität.
In meinem nächsten Beitrag werde ich dir zeigen, wie du diese Schaltung auf einen ESP32-C3 portierst und in MicroPython programmierst. Dadurch wird das Projekt nicht nur kleiner und effizienter, sondern auch flexibler für zukünftige Erweiterungen – beispielsweise eine Steuerung über WLAN oder eine Integration in Home Assistant.
Bleib dran, es lohnt sich! 🚀😊
Du stellst immer gute Projekte vor. Danke dafür.
Hallo Stefan
Deine Eieruhr funktioniert wunderbar, eins könnte vieleicht optisch noch verbessert werden, bei kleineren Zeiten die unbenutzte Null unterdrücken! Ich hatte am Anfang Probleme, ich hatte nach neu aufsetzen von Windoof, vergessen für die China Clone, die Treiber neu einzuspielen!
Harald