Raspberry Pi Pico: Countdown mit Zeitanzeige (TM1637)
Ein Countdown mit Zeitanzeige ist eine Uhr, die von einem einstellbaren Startwert in Minuten und Sekunden bis auf 0 (00:00) herunterzählt. Die aktuelle Countdown-Zeit wird auf einem Display angezeigt. Außerdem kann die Startzeit eingestellt, der Countdown gestartet und gestoppt werden. Mögliche Anwendungen wären eine Eieruhr oder ein Vortragstimer.
Folgende Probleme müssen wir lösen:
- Anzeige der Zeit mit Minuten und Sekunden des ablaufenden Countdowns.
- Eingabe-Möglichkeit zum Einstellen der Startzeit in Minuten und Sekunden, sowie Starten und Stoppen des Countdowns.
- Countdown-Funktion mit Echtzeit-Fähigkeit.
Zur Anzeige der Zeit des Countdowns verwenden wir eine 4-fach 7-Segment-Anzeige vom Typ TM1637. In der Mitte der Anzeige befindet sich ein Doppelpunkt, mit dem die Zahlen als Zeitangabe verstanden werden kann. Für die Software-seitige Ansteuerung ist eine externe Bibliothek notwendig.
Dann brauchen wir noch eine Steuerung für den Drehschalter bzw. Rotary Encoder vom Typ KY-040. Mit der Drehfunktion wollen wir den Startwert des Countdowns hoch- und runterdrehen. Und mit der Tasterfunktion wollen wir den Countdown starten und stoppen. Für die Software-seitige Ansteuerung ist eine externe Bibliothek notwendig.
Für die Echtzeit-Fähigkeit bedienen wir uns der Timer-Funktion in MicroPython, die vom Raspberry Pi Pico unterstützt wird.
Aufbau und Bauteile
Raspberry Pi Pico W | TM1637 | |
---|---|---|
Pin 38 | GND | GND |
Pin 36 | VCC +3,3V | VCC |
Pin 27 | GPIO 21 | CLK |
Pin 26 | GPIO 20 | DIO |
Raspberry Pi Pico | KY-040 | |
---|---|---|
Pin 36 | VCC +3,3V | + |
Pin 25 | GPIO 19 | CLK |
Pin 24 | GPIO 18 | DT |
Pin 23 | GND | GND |
Pin 22 | GPIO 17 | SW |
Schnell und einfach alle Bauteile zusammen bestellen
MicroPython-Bibliothek für TM1637
Zur Ansteuerung der 7-Segment-Anzeige TM1637 ist eine externe Bibliothek erforderlich, die heruntergeladen und mit dem Dateinamen „tm1637.py“ auf dem Raspberry Pi Pico gespeichert werden muss.
MicroPython-Bibliothek für KY-040 Rotary Encoder
Zur Software-seitigen Ansteuerung bzw. Auswertung des Drehschalter bzw. Rotary Encoders ist eine externe Bibliothek erforderlich, weil keine direkte Unterstützung in MicroPython vorgesehen ist. Die Bibliothek macht die Auswertung des Drehschalters im Programmcode spielend einfach. Dazu muss die Bibliothek heruntergeladen und mit dem Dateinamen „rotary.py“ auf dem Raspberry Pi Pico gespeichert werden.
Programmcode
Am Anfang des Programmcodes werden die Bibliotheken geladen und die Anzeige und der Drehschalter initialisiert. Danach wird noch der Startwert für den Countdown definiert (counter). Der Wert ist die Anzahl in Sekunden. Der Wert definiert einen voreingestellten Startwert. Bei einer klassischen Eieruhr wäre ein Wert zwischen 180 und 600 sinnvoll. Bei einem Vortragstimer eher ein Wert zwischen 1800 und 3600. Teilt man die Werte durch 60 (Sekunden) erhält man den Wert in Minuten.
Viele Countdown-Lösungen sehen vor, Sekunden und Minuten separat zu zählen. Also mit zwei Werten zu arbeiten. Was auf den ersten Blick logisch erscheint, hat dem Nachteil, dass man eine Logik vorsehen muss, die beim Wechsel der Minuten auch die Sekunden auf 59 umstellt. Das kann man so machen, es geht aber viel einfacher.
In diesem Countdown ist die kleinste Zeiteinheit eine Sekunde. Deshalb wird in dieser Lösung nur die Anzahl der Sekunden heruntergezählt. Erst bei der Darstellung der Zeit, wird aus der Anzahl der Sekunden die Minuten und Sekunden berechnet. MicroPython hat dafür sogar eine eigene Funktion.
Wie können wir die Echtzeit-Fähigkeit des Countdowns gewährleisten? Echtzeit bedeutet, dass eine Sekunde auch wirklich jeweils eine Sekunde dauert oder vergeht. Wenn wir also den Countdown in Sekunden herunterzählen wollen, dann bedarf es einer Zeitlösung, die auch wirklich sekundengenau ist. Die einzige zuverlässige Lösung ist ein Timer, der jede Sekunde eine Funktion auslöst, in der der Countdown heruntergezählt wird, die Anzeige ändert und zeitabhängige Funktionen ausführt.
Dann brauchen wir noch eine Steuerung für den Drehschalter. Mit der Tasterfunktion wollen wir den Countdown starten und stoppen. Mit der Drehfunktion wollen wir den Countdown hoch- und runterdrehen.
Hierbei ist zu beachten, dass unterhalb von „1:00“ (eine Minute) die Zeit Sekunden-genau, darüber auf 10 Sekunden genau eingestellt und ab „10:00“ (10 Minuten) Minuten-genau eingestellt werden kann.
# Bibliotheken laden from machine import Pin, Timer import time from rotary import Rotary import tm1637 # Display TM1637 initialisieren display = tm1637.TM1637(clk=Pin(21), dio=Pin(20)) # KY-040 Rotary Encoder initialisieren rotary = Rotary(dt=18, clk=19, sw=17) # Startwert in Sekunden für den Countdown # 60 Sekunden = 1 Minute # 600 Sekunden = 10 Minuten # 3600 Sekunden = 60 Minuten # 5940 Sekunden = 99 Minuten (höchster Wert) counter = 120 # Funktion: Ausgabe auf dem Display def outputDisplay(counter, points): # Countdown in Minuten und Sekunden umrechnen und anzeigen timeValue = time.localtime(counter) secs = timeValue[5] if counter >= 3600: mins = int(counter/60) else: mins = timeValue[4] display.numbers(mins, secs, points) # Funktion: Countdown einstellen / starten / stoppen def rotaryChange(change): global counter global run # Drehung im Uhrzeigersinn if change == Rotary.ROT_CW: if counter >= 601: counter -= 60 elif counter >= 61: counter -= 10 elif counter >= 1: counter -= 1 # Mininmal 0 Sekunden print('Rechts (', counter, ')') # Drehung gegen Uhrzeigersinn elif change == Rotary.ROT_CCW: if counter <= 59: counter += 1 elif counter <= 599: counter += 10 elif counter <= 5939: counter += 60 # Maximal 99 Minuten print('Links (', counter, ')') # Taster gedrückt elif change == Rotary.SW_PRESS: if counter > 0: # Start und Stop nur wenn Countdown größer Null if run == 0: # Start oder Weiter clock.init(freq=1, mode=Timer.PERIODIC, callback=countdown) run = 1 print('Countdown: Start') else: # Stop clock.deinit() run = 0 print('Countdown: Stop') else: print('Zeit einstellen') # Ausgabe auf dem Display outputDisplay(counter, 1) # Funktion: Herunterzählen und zeitabhängige Bedingungen def countdown(value): global counter global points global run # Blinkender Doppelpunkt im Wechsel if points == 0: points = 1 else: points = 0 # Countdown reduzieren counter -= 1 # Countdown ist abgelaufen (0 = Ende) if counter == 0: clock.deinit() run = 0 points = 1 print('Countdown: Ende') elif counter == 10: print('Noch 10 Sekunden') elif counter == 60: # 1 Minute x 60 Sekunden = 60 Sekunden print('Noch 1 Minute') elif counter == 600: print('Noch 10 Minuten') # 10 Minuten x 60 Sekunden = 600 Sekunden # Ausgabe auf dem Display outputDisplay(counter, points) # Countdown läuft (1) / läuft nicht (0) run = 0 # Doppelpunkt points = 1 # Initialisierung Timer für Countdown clock = Timer() # Wenn der Encoder bedient wird rotary.add_handler(rotaryChange) # Ausgabe auf dem Display outputDisplay(counter, points) print('Drehschalter drehen zum Einstellen oder drücken zum Starten')
Ideen für Erweiterungen
Im Programmcode in der Funktion „countdown“ sind zeitabhängige Funktionen vorgesehen. Dort werden beispielhaft zu bestimmten Zeiten (Sekunden) die Dauer des Countdowns in der Kommandozeile ausgegeben. Denkbar wäre, dass zu bestimmten Zeiten benutzerdefiniert Aktionen ausgelöst werden. Beispielsweise eine Lampe, die an- oder ausgeht.
Desweiteren könnte man sich überlegen, ob man den Wertebereich der einstellbaren und ablaufenden Zeit über 99 Minuten (1 Stunde und 39 Minuten) erhöht. Man muss dann nur darauf achten, eine sinnvolle und verständliche Darstellung auf der Anzeige zu realisieren.
Darf es ein bisschen mehr sein?
Wenn man einen Raspberry Pi Pico mit einer 4-fach 7-Segment-Anzeige vom Typ TM1637 hat, dann wäre es denkbar eine Stoppuhr daraus zu bauen. Die Anzeige dient zur Darstellung der vergangenen Minuten und Sekunden.
Weitere verwandte Themen:
- Raspberry Pi Pico: 4-fach 7-Segment-Anzeige programmieren (TM1637)
- Raspberry Pi Pico: Digitale Uhr mit Anzeige (TM1637)
Teilen:
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.
- LED: Einschalten, ausschalten, blinken und Helligkeit steuern
- Taster: Entprellen und Zustände anzeigen
- LED mit Taster einschalten und ausschalten
- Ampel- und Lauflicht-Steuerung
- Elektronischer Würfel
- Eigene Steuerungen programmieren
Online-Workshop: Programmieren mit dem Raspberry Pi Pico
Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.
Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)