Skip to content

Technik Blog

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

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Workshop im JFZ Schöningen: Timerschaltung mit dem ESP32-C3 für Jung und Alt

Posted on 9. Mai 202511. Mai 2025 by Stefan Draeger

Es bereitet mir immer wieder große Freude, Workshops rund um Technik und Programmierung im Jugendfreizeitzentrum (JFZ) Schöningen anzubieten. Besonders die offenen Veranstaltungen, bei denen auch externe Teilnehmer mitmachen können, stoßen regelmäßig auf großes Interesse – so auch bei unserem letzten Workshop zur Timerschaltung mit dem ESP32-C3, der Teilnehmer im Alter von 12 bis über 60 Jahren begeisterte.

Die vorgestellte Schaltung blickt auf mehrere Entwicklungszyklen zurück: Angefangen hat alles mit einer einfachen, fliegenden Verdrahtung auf Basis eines Arduino. Heute basiert das Projekt auf dem leistungsfähigen ESP32-C3, der nicht nur über deutlich mehr Rechenleistung verfügt, sondern auch WLAN und Bluetooth mitbringt. Diese Schnittstellen eröffnen spannende Möglichkeiten, die Schaltung künftig auch drahtlos zu steuern oder externe Signale zu empfangen.

Tag 1: Löten lernen und erste Schritte mit der Schaltung

Am ersten Workshoptag stand das Löten der Timerschaltung auf dem Programm. Da die meisten Teilnehmer keinerlei Vorkenntnisse im Löten hatten, habe ich mir die Zeit genommen, die wichtigsten Grundlagen zu erklären – insbesondere worauf man bei bestimmten Bauteilen wie LEDs achten muss. Für diesen Teil des Workshops haben wir bewusst 2,5 Stunden eingeplant, was sich als genau richtig erwiesen hat: Alle kamen gut mit und wir waren pünktlich fertig.

Besonders beeindruckt hat mich der jüngste Teilnehmer, der trotz seines Alters hochkonzentriert bei der Sache war. Schon nach nur einem Mal Zeigen, wie man richtig lötet, hat er die Arbeit selbstständig und fehlerfrei fortgesetzt. Das war für mich nicht nur schön zu sehen, sondern auch eine tolle Bestätigung, dass meine Erklärungen gut ankommen. 😊

Tag 2: Schaltungen prüfen und Programmierung starten

Am Vormittag des 09.05. wurden alle gelöteten Schaltungen gründlich geprüft, damit der Einstieg in die Programmierung am Abend reibungslos gelingt. Dabei kamen einige kalte Lötstellen und kleinere Fehler zum Vorschein – typische Anfängerfehler, die aber bereits bei der Planung berücksichtigt wurden. Nach der Korrektur waren alle Schaltungen funktionstüchtig.

Da in einem einzigen Workshopabend – oder genauer gesagt in rund 2,5 Stunden – keine vollständigen Programmierer ausgebildet werden können, wurde der Code für die Timerschaltung in kleine, verständliche Abschnitte unterteilt. Jeder dieser Abschnitte demonstrierte eine bestimmte Funktion, die zunächst gemeinsam erläutert und anschließend von den Teilnehmern nach Belieben angepasst werden konnte.

Die Bandbreite reichte von einfachen LED-Blinkbeispielen über zeitgesteuerte Abläufe bis hin zur Tonausgabe mit dem Piezo-Buzzer. Besonders viel Spaß hatten die jüngeren Teilnehmer beim Erzeugen von Tönen – hier konnten sie mit den vier Tasten eigene kleine Lieder komponieren. Diese kreative und spielerische Herangehensweise kam bei allen sehr gut an und sorgte für viele Aha-Momente.

So konnte der Workshop pünktlich um 17:30 Uhr mit dem nächsten Programmpunkt starten: die Programmierung der Timerschaltung.

Beispiele für die Timerschaltung am ESP32-C3 MiniHerunterladen
Präsentation Timerschaltung ESP32-C3 MiniHerunterladen
Quellcode – fertige Timerschaltung mit 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 8
#define tasterMinus 6
#define tasterSelect 7

// 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);
  }
}

Fazit und Ausblick: Technik, die verbindet

Der Workshop war ein voller Erfolg – alle Teilnehmer hatten sichtlich Spaß, was auch das positive Feedback von Christian Nöhring, dem Leiter des JFZ Schöningen, bestätigte. Besonders schön war zu sehen, wie Menschen unterschiedlichsten Alters gemeinsam in die Welt der Technik eingetaucht sind und sich gegenseitig unterstützten.

Mit dem verwendeten ESP32-C3 steht uns eine leistungsfähige Plattform zur Verfügung, die noch viele weitere Möglichkeiten bietet – etwa die Steuerung über Bluetooth oder WLAN. Diese spannenden Funktionen werden wir in einem weiteren Workshop in den kommenden Wochen erkunden.

Natürlich werde ich auch darüber wieder berichten. 😊

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

  • 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}