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.
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. 😊