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. Die TM1637-Anzeige wird per I2C angesteuert. 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: 4-fach 7-Segment-Anzeige programmieren (TM1637)

Raspberry Pi Pico W TM1637
Pin 38 GND GND
Pin 36 VCC +3,3V VCC
Pin 27 GPIO 21 (I2C SCL) CLK
Pin 26 GPIO 20 (I2C SDA) 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

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 utime as 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:

Teilen:

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

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 Mehr Informationen Elektronik-Set jetzt bestellen

Programmieren mit dem Raspberry Pi Pico
Online-Workshop

Programmieren mit dem Raspberry Pi Pico

Online-Workshop mit einer Einführung ins Physical Computing mit Leuchtdioden, Taster und Temperatursensor.

  • Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython ohne Vorkenntnisse
  • Optimaler Einstieg, um eigene Ideen zu verwirklichen und Steuerungen zu programmieren
  • Inklusive Elektronik-Set mit einem Raspberry Pi Pico, Zubehör und elektronischen Bauteilen

Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)

Zum PicoTalk Mehr Informationen Am Online-Workshop teilnehmen

Elektronik-Set Pico Edition
Elektronik-Set Pico Edition

Hardware-nahes Programmieren mit dem Raspberry Pi Pico

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 Mehr Informationen Elektronik-Set jetzt bestellen