In einem früheren Beitrag habe ich mit der Arduino-gestützten Eieruhr bereits eine flexible Countdown-Anzeige mit akustischem Alarm vorgestellt. Die ursprüngliche Version, die ich auf meinem Blog unter diesem Link veröffentlicht habe, basierte auf einem klassischen Arduino. Doch nun wird es Zeit für ein Upgrade: Der ESP32-C3 Mini bietet nicht nur mehr Leistung mit seinen 160 MHz, sondern bringt auch WiFi- und Bluetooth-Konnektivität mit – und das in einem äußerst kompakten Format.
Die Portierung der bestehenden Arduino-Schaltung auf den ESP32-C3 Mini war erstaunlich einfach, da dieser ebenfalls in der Arduino IDE programmiert werden kann. Der eigentliche Fokus lag jedoch darauf, die Schaltung auf eine eigene Platine (PCB) zu bringen, um sie für ein bevorstehendes Event im JFZ Schöningen einsatzbereit zu machen.



In diesem Beitrag zeige ich, wie die Timerschaltung mit dem ESP32-C3 Mini realisiert wurde, welche Anpassungen notwendig waren und wie die finale Version als fertige Platine umgesetzt wurde.
Inhaltsverzeichnis
- Warum der ESP32-C3 Mini besser als ein Arduino ist
- Benötigte Bauteile für die Timerschaltung
- Timerschaltung am Schaltung am ESP32-C3 Mini im Detail
- Programmieren in der Arduino IDE
- Aufbau der Schaltung mit EasyEDA
- Ausblick
Warum der ESP32-C3 Mini besser als ein Arduino ist
Zunächst einpaar Gründe warum der ESP32-C3 Mini besser als ein Arduino ist:
✔ WiFi & Bluetooth integriert – Kein extra Modul nötig, ideal für IoT.
✔ Mehr Leistung & Speicher – 160 MHz, 384 KB RAM vs. 16 MHz, 2 KB RAM beim Arduino.
✔ Energieeffizient – Sleep-Modi für geringen Stromverbrauch.
✔ Vielseitigere GPIOs – Mehr analoge Eingänge, PWM, SPI, I2C, UART gleichzeitig nutzbar.
✔ Moderne Programmierung – Neben der Arduino IDE auch MicroPython & ESP-IDF unterstützt.
Benötigte Bauteile für die Timerschaltung
Für den Aufbau der Schaltung werden folgende Komponenten benötigt. Diese ermöglichen eine einfache Umsetzung und sind flexibel auf einem 800-Pin-Breadboard testbar.
- 1x ESP32-C3 Mini – Der Mikrocontroller als Steuerzentrale
- 4x Taster mit Köpfen – Zur Steuerung der Timer-Funktionen
- 1x 3mm LED mit 220-Ohm-Vorwiderstand – Statusanzeige
- 2x 5mm LED mit 220-Ohm-Vorwiderstand – Visuelles Feedback beim Alarm
- 2x Piezo-Buzzer – Akustischer Signalgeber
- diverse Breadboardkabel – Zur Verbindung der Komponenten
- 1x 800-Pin-Breadboard – Für eine flexible Verdrahtung
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!
Timerschaltung am Schaltung am ESP32-C3 Mini im Detail
Nachfolgend die Timerschaltung am ESP32-C3 auf einem Breadboard.
Bauteil / Pin | ESP32-C3 Mini |
---|---|
4fach 7 Segmentanzeige | CLK > 3 (GPIO3) SDA > 4 (GPIO4) GND > GND VCC > 5V |
Taster – Start / Stopp | 5 (GPIO5) |
Taster – Plus | 6 (GPIO6) |
Taster – Minus | 7 (GPIO7) |
Taster – Select | 8 (GPIO8) |
LED 1 | 20 (GPIO20) |
LED 2 | 21 (GPIO21) |
Status LED | 9 (GPIO9) |
Piezo Buzzer – links | 10 (GPIO10) |
Piezo Buzzer – rechts | 2 (GPIO2) |
Pinout des ESP32-C3 Mini
Nachfolgend findest du den Aufbau des ESP32-C3 Mini, der dir hilft, die richtigen Pins für deine Schaltung schneller und einfacher zu identifizieren. Eine klare Übersicht der GPIO-Belegung erleichtert die Verdrahtung und reduziert Fehler beim Anschluss der Komponenten.
Falls du spezielle Funktionen wie PWM, I2C, SPI oder UART nutzen möchtest, lohnt sich ein Blick auf die multiplen Belegungsmöglichkeiten der Pins.
Unterschiedliche – 4fach 7Segmentanzeigen
Es gibt verschiedene Arten von 7-Segment-Anzeigen auf dem Markt. Einerseits gibt es kompakte, einfache Modelle, andererseits größere Varianten mit farbigen Segmenten. Für dieses Projekt entscheide ich mich für die größere Version, da sie nicht nur besser lesbar ist, sondern durch die unterschiedlichen Farben auch optisch ansprechender wirkt und das Projekt aufwertet.
Ausbau einer LED
In der Schaltung kommen drei LEDs zum Einsatz, die sich durch ihre hohe Leuchtkraft und lange Lebensdauer auszeichnen. Sie dienen nicht nur als Statusanzeige, sondern ermöglichen auch eine visuelle Rückmeldung über den aktuellen Betriebszustand der Timerschaltung.
Die LEDs werden über einen GPIO-Pin des ESP32-C3 Mini angesteuert und mit einem 220-Ohm-Vorwiderstand in Reihe geschaltet, um den Stromfluss zu begrenzen und die Lebensdauer der LEDs zu erhöhen. Durch diese Beschaltung ist sichergestellt, dass die LEDs effizient betrieben werden, ohne den Mikrocontroller zu überlasten.
Beim Einbau einer LED ist darauf zu achten, dass sie richtig gepolt angeschlossen wird. Die Kathode (Minuspol) wird mit dem Vorwiderstand verbunden, der anschließend an GND führt. Die Anode (Pluspol) hingegen wird direkt mit dem entsprechenden GPIO-Pin des ESP32-C3 Mini verbunden.
Eselsbrücke: Die Kathode erkennt man am kürzeren Bein der LED.
Falls du mehr über die Funktionsweise und den Anschluss von LEDs erfahren möchtest, findest du eine detaillierte Erklärung auf der Seite „Bauteile: Leuchtdiode (LED)„, wo ich dieses Bauteil ausführlich vorstelle.
Programmieren in der Arduino IDE
Wie bereits erwähnt, habe ich dieses kleine Projekt zuvor für den Arduino entwickelt und programmiert. Dadurch war die Portierung auf den ESP32-C3 Mini relativ unkompliziert – es mussten lediglich die Pinbelegungen angepasst werden.
Eine zusätzliche Optimierung bestand darin, die Start- und Stopp-Funktion auf einen einzigen Taster zu legen, anstatt zwei separate Taster zu verwenden. Dadurch spart man nicht nur einen GPIO-Pin, sondern macht die Bedienung auch kompakter und effizienter. Dies ist besonders vorteilhaft, da der ESP32-C3 Mini im Vergleich zu einem klassischen Arduino weniger verfügbare GPIOs hat.
fertiges Programm für eine Timerschaltung am ESP32-C3 Mini
/* * Autor: Stefan Draeger * Webseite: https://draeger-it.blog * Beitrag: https://draeger-it.blog/esp32-c3-mini-die-perfekte-basis-fuer-eine-moderne-timerschaltung/ * * Beschreibung: * Diese Firmware steuert eine Timerschaltung mit einer 7-Segment-Anzeige (TM1637), * Tastern zur Zeiteinstellung, LEDs zur Statusanzeige und einem akustischen Alarm über einen Buzzer. * Die Zeit kann in Sekunden oder Minuten eingestellt und per Start/Stopp-Taste gesteuert werden. * * Funktionen: * - Anzeige der verbleibenden Zeit auf einer TM1637 7-Segment-Anzeige * - Steuerung der Zeit über Taster (Erhöhung/Verringerung in Sekunden oder Minuten) * - Akustischer Alarm nach Ablauf des Timers mit abwechselnden LED-Signalen * - Speicherung und Aktualisierung des Timers in der Loop * - Start/Stopp-Funktion für den Timer */ #include <TM1637Display.h> // Bibliothek für 7-Segment-Anzeige TM1637 #include <Bounce2.h> // Bibliothek für die Taster-Entprellung // Definition der LED-Pins #define led1 20 #define led2 21 // Definition der Pins für die 7-Segment-Anzeige (TM1637) #define segmentanzeige_CLK 3 #define segmentanzeige_DIO 4 TM1637Display display(segmentanzeige_CLK, segmentanzeige_DIO); // Anzeige-Objekt erstellen // Definition der Taster-Pins #define tasterStartStopp 5 #define tasterPlus 6 #define tasterMinus 7 #define tasterSelect 8 // Taster-Objekte für die Entprellung Bounce bceTasterStartStopp = Bounce(); Bounce bceTasterPlus = Bounce(); Bounce bceTasterMinus = Bounce(); Bounce bceTasterSelect = Bounce(); // Definition der Pins für Buzzer und Status-LED #define buzzerLeft 10 #define buzzerRight 2 #define statusLed 9 // Variablen für die Timer-Logik unsigned int timeAuswahl = 0; // Auswahlmodus für Zeit (Sekunden/Minuten) unsigned int seconds = 0; // Aktuelle Zeit in Sekunden const unsigned int PAUSE = 1000; // Zeitintervall für Timer-Update (1 Sekunde) const unsigned int PAUSE_ALARM = 250; // Zeitintervall für Alarmton unsigned long lastAction = 1L; // Zeitstempel für letzte Aktion bool clockStarted = false; // Timer läuft oder nicht bool clockAlarm = false; // Alarmstatus bool lastStateLED = false; // Zustand der LEDs für Alarm void setup() { // Setzt die Pin-Modi für LEDs, Buzzer und Status-LED pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(buzzerLeft, OUTPUT); pinMode(buzzerRight, OUTPUT); pinMode(statusLed, OUTPUT); // Helligkeit der 7-Segment-Anzeige einstellen (0-7, hier maximale Helligkeit) display.setBrightness(7); // Anzeige mit allen Segmenten aktivieren (zum Test) uint8_t data[] = { 0xff, 0xff, 0xff, 0xff }; display.setSegments(data); // Taster mit Pullup-Widerständen initialisieren und Entprellzeit setzen bceTasterStartStopp.attach(tasterStartStopp, INPUT_PULLUP); bceTasterStartStopp.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); // LEDs und Status-LED ausschalten digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(statusLed, LOW); displayTime(); // Startanzeige aktualisieren } // Zeigt die aktuelle Zeit auf der 7-Segment-Anzeige an void displayTime() { int minutes = seconds / 60; // Maximale Anzeige auf 99 Minuten begrenzen if (minutes > 99) { minutes = 99; } // Anzeige im Format MM:SS int fourDigitValue = (minutes * 100) + (seconds % 60); display.showNumberDecEx(fourDigitValue, 0b01000000, true, 4, 4); } // Reduziert die verbleibende Zeit um eine Sekunde void incrementTime() { unsigned long currentMillis = millis(); if ((lastAction + PAUSE) < currentMillis) { lastAction = currentMillis; if (seconds > 0) { seconds--; // Eine Sekunde abziehen if (seconds == 0) { clockAlarm = true; // Timer abgelaufen, Alarm aktivieren } } } displayTime(); } // Spielt einen akustischen Alarm ab und wechselt die LEDs void playAlarm() { unsigned long currentMillis = millis(); if ((lastAction + PAUSE_ALARM) < currentMillis) { lastAction = currentMillis; // Wechselton für den Alarm (zwei verschiedene Frequenzen) if (lastStateLED) { noTone(buzzerRight); tone(buzzerLeft, 1400); } else { noTone(buzzerLeft); tone(buzzerRight, 700, 175); } // LED-Zustand ändern, um visuelles Signal zu erzeugen digitalWrite(led1, lastStateLED); digitalWrite(led2, !lastStateLED); lastStateLED = !lastStateLED; } } void loop() { // Taster-Status aktualisieren bceTasterPlus.update(); bceTasterMinus.update(); bceTasterSelect.update(); // Wenn der Timer nicht läuft, kann die Zeit eingestellt werden if (!clockStarted) { bool buttonPressed = false; // Umschalten zwischen Sekunden- und Minutenmodus if (bceTasterSelect.fell()) { timeAuswahl = (timeAuswahl == 0) ? 1 : 0; } // Zeit erhöhen if (bceTasterPlus.fell()) { buttonPressed = true; if (timeAuswahl == 0) { seconds++; } else { seconds += 60; } } // Zeit verringern, falls Sekunden > 0 sind if (bceTasterMinus.fell() && seconds > 0) { buttonPressed = true; if (timeAuswahl == 0) { seconds--; } else { seconds -= 60; } } // Anzeige aktualisieren, falls sich die Zeit geändert hat if (buttonPressed) { displayTime(); } } // Falls der Timer läuft und der Alarm noch nicht aktiv ist, Zeit herunterzählen else if (clockStarted && !clockAlarm) { incrementTime(); } if (clockStarted && clockAlarm) { playAlarm(); } // Start/Stopp-Taster auslesen bceTasterStartStopp.update(); // Timer starten oder stoppen if (bceTasterStartStopp.fell()) { clockStarted = !clockStarted; clockAlarm = false; digitalWrite(statusLed, clockStarted); // LEDs zurücksetzen digitalWrite(led1, LOW); digitalWrite(led2, LOW); noTone(buzzerRight); noTone(buzzerLeft); } }
Aufbau der Schaltung mit EasyEDA
Die Platine habe ich in der Online Version von EasyEDA entwickelt, durch die große Bibliothek welche vom Hersteller und der Community gepflegt wird ist diese meine erste Wahl.
Das Hintergrundbild also quasi den „Wecker“ habe ich mir recht günstig bei Etsy.com gekauft und somit sogar noch einen anderen Creator mit diesem Projekt unterstützt ;).
Ausblick
Als nächstes möchte ich dieses Projekt, wie bereits erwähnt, für das Jugendfreizeitzentrum Schöningen umsetzen. Besonders spannend daran ist, dass die Teilnehmer nicht nur das Löten auf einer Platine erlernen, sondern auch erste Erfahrungen im Programmieren sammeln können. Zudem lässt sich der Code erweitern, um beispielsweise die aktuelle Uhrzeit aus dem Internet über einen NTP-Server auf der Segmentanzeige darzustellen. Der ESP32-C3 Mini eröffnet dabei viele weitere Möglichkeiten für kreative Erweiterungen.