Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

ESP32-C3 Mini: Die perfekte Basis für eine moderne Timerschaltung

Posted on 7. März 20257. März 2025 by Stefan Draeger

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.

ESP32-C3 Mini: Die perfekte Basis für eine moderne Timerschaltung
Dieses Video auf YouTube ansehen.

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
    • Pinout des ESP32-C3 Mini
    • Unterschiedliche – 4fach 7Segmentanzeigen
    • Ausbau einer LED
  • 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.

ESP32-C3 Super Mini
ESP32-C3 Super Mini

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.

ESP32-C3 Mini - Countdown Schaltung
ESP32-C3 Mini – Countdown Schaltung
Bauteil / PinESP32-C3 Mini
4fach 7 SegmentanzeigeCLK > 3 (GPIO3)
SDA > 4 (GPIO4)
GND > GND
VCC > 5V
Taster – Start / Stopp5 (GPIO5)
Taster – Plus6 (GPIO6)
Taster – Minus7 (GPIO7)
Taster – Select8 (GPIO8)
LED 120 (GPIO20)
LED 221 (GPIO21)
Status LED9 (GPIO9)
Piezo Buzzer – links10 (GPIO10)
Piezo Buzzer – rechts2 (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.

ESP32-C3 Pinout
ESP32-C3 Pinout

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.

Aufbau einer LED
Aufbau einer 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.

Programm: Timerschaltung am ESP32-C3 Mini in der Arduino IDEHerunterladen
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.

2 thoughts on “ESP32-C3 Mini: Die perfekte Basis für eine moderne Timerschaltung”

  1. Pingback: Workshop im JFZ Schöningen: Timerschaltung mit dem ESP32-C3 für Jung und Alt - Technik Blog
  2. Pingback: ESP32 Tutorial: Taster-Interrupt mit Entprellung - Technik Blog

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen
Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

link zu Fabook
link zu LinkedIn
link zu YouTube
link zu TikTok
link zu Pinterest
link zu Instagram
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}