Raspberry Pi Pico: Stoppuhr mit Anzeige (TM1637)

Eine eigene Stoppuhr bauen? Wer braucht das schon? Jedes Smartphone hat eine App dafür. Aber das ist nicht in jedem Fall die Lösung. Beispielsweise dann nicht, wenn die laufende Zeit öffentlich auf einem Display oder ähnlich angezeigt werden soll. Hier kann ein Raspberry Pi Pico mit einer externen Anzeige eine Lösung sein.

Folgende Probleme müssen wir lösen:

  1. Anzeigen der Zeit mit Minuten und Sekunden.
  2. Starten und Stoppen, sowie zurückstellen auf „00:00“.
  3. Zähler-Funktion mit Echtzeit-Fähigkeit.

Zum Anzeigen der laufenden Zeit verwenden wir eine 4-fach 7-Segment-Anzeige vom Typ TM1637. Die TM1637-Anzeige wird per I2C angesteuert. Für die Software-seitige Ansteuerung ist eine externe Bibliothek notwendig.

Zum Starten, Stoppen und Zurückstellen der Zeitanzeige verwenden wir einen Taster. Mit einem einfachen Druck starten und stoppen wir den Zähler. Ein langer Tasterdruck stellt die Zeit zurück. Zur Auswertung des Tasters verwenden wir als Hilfsmittel die externe MicroPython-Bibliothek „picozero“.

Für die Echtzeit-Fähigkeit bedienen wir uns der Timer-Funktion von MicroPython, die vom Raspberry Pi Pico unterstützt wird.

Aufbau und Bauteile

Raspberry Pi Pico: Stoppuhr mit Anzeige (TM1637)

Raspberry Pi Pico 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

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 „picozero“ zur Taster-Auswertung

Eine Taster-Betätigung auszuwerten ist nicht ganz so einfach. Unter anderem benötigt man eine Lösung gegen das Prellen des Tasters. Hierfür empfiehlt es sich externe Bibliotheken zu verwenden, um Probleme auszuschließen. MicroPython-Bibliothek „picozero“ macht die Taster-Auswertung einfacher und wird im folgenden Programmcode verwendet.
Hierzu ist die Bibliothek herunterzuladen und mit dem Dateinamen „picozero.py“ auf dem Raspberry Pi Pico zu speichern.

Programmcode

Am Anfang des Programmcodes werden die Bibliotheken geladen und die Anzeige und der Taster initialisiert. Danach wird noch der Startwert für den Zähler definiert (counter). Der Wert ist die Anzahl in Sekunden. Bei einer Stoppuhr ist der Startwert „0“.

In dieser Lösung wird nur die Anzahl der vergangenen Sekunden gezählt. Erst bei der Darstellung der Zeit, wird aus der Anzahl der Sekunden die Minuten und Sekunden berechnet. MicroPython hat dafür eine eigene Funktion.

Wie können wir die Echtzeit-Fähigkeit des Zählers gewährleisten? Echtzeit bedeutet, dass eine Sekunde auch wirklich eine Sekunde dauert oder vergeht. Wenn wir also Sekunden zählen wollen, dann bedarf es einer Zeitlösung, die auch wirklich sekundengenau ist. Die einzige zuverlässige Lösung ist ein Hardware-Timer oder eine Echtzeituhr, die jede Sekunde eine Funktion auslöst, den Zähler hochzählt, die Anzeige ändert und zeitabhängige Funktionen ausführt.

Dann brauchen wir noch eine Auswertung für den Taster. Damit wollen wir den Zähler starten, stoppen und auf 0 bzw. die Anzeige auf „00:00“ zurückstellen. Starten und Stoppen geht mit einem einfachen Tasterdruck. Durch einen längeren Tasterdruck wird nach dem loslassen der Zähler zurückgestellt.

# Bibliotheken laden
from machine import Pin, Timer
from picozero import Button
import utime as time
import tm1637

# Display TM1637 initialisieren
display = tm1637.TM1637(clk=Pin(21), dio=Pin(20))

# Taster initialisieren
button = Button(15)

# Startwert der Stoppuhr
counter = 0

# Funktion: Ausgabe auf dem Display
def outputDisplay(counter, points):
    # Zähler 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: Herunterzählen und zeitabhängige Bedingungen
def count(value):
    global counter
    global points
    global run
    # Blinkender Doppelpunkt im Wechsel
    if points == 0: points = 1
    else: points = 0
    # Zähler erhöhen
    counter += 1
    # höchster darstellbarer Wert erreicht
    if counter == 5940:
        clock.deinit()
        run = 0
        points = 1
        print('Ende')
    # Ausgabe auf dem Display
    outputDisplay(counter, points)

# Funktion: Start-Auswertung
def buttonPressed():
    global run
    global start
    if run == 0:
        start = time.ticks_ms()

# Funktion: Stop- und Rücksetz-Auswertung
def buttonReleased():
    global start
    global run
    global counter
    if run == 1:
        clock.deinit()
        run = 0
        outputDisplay(counter, 1)
        print('Stop')
    else:
        diff = time.ticks_ms() - start
        #print('Diff:', diff)
        if diff < 1000:
            clock.init(freq=1, mode=Timer.PERIODIC, callback=count)
            run = 1
            print('Start')
        else:
            counter = 0
            outputDisplay(counter, 1)
            print('Reset')

# Countdown läuft (1) / läuft nicht (0)
run = 0

# Doppelpunkt
points = 1

# Initialisierung Timer für Countdown
clock = Timer()

# Ausgabe auf dem Display
outputDisplay(counter, points)
print('Taster drücken zum Starten, Stoppen und Gedrückt halten zum Zurücksetzen')

# Taster-Steuerung
button.when_pressed = buttonPressed
button.when_released = buttonReleased

Darf es ein bisschen mehr sein?

Tolle Lösung, oder? Naja, das war jetzt nicht besonders spannend. Aber wie wäre es, wenn die Stoppuhr nicht lokal per Taster, sondern über das WLAN per Browser bedient wird?

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