Raspberry Pi Pico W: WLAN-Stoppuhr mit Anzeige (TM1637)
Eine eigene Stoppuhr bauen? Wer braucht das schon? Aber, wie wäre es, wenn die Stoppuhr aus der Ferne über den Browser bedient wird. Das heißt, starten, stoppen und zurücksetzen der gezählten Zeit über WLAN. Einen Raspberry Pi Pico W könnte man mit einer Anzeige auf diese Weise aus der Ferne bedienen.
Folgende Probleme müssen wir lösen:
- Anzeige der Zeit mit Minuten und Sekunden.
- Bedienoberfläche zum Starten und Stoppen, sowie Zurückstellen auf „00:00“.
- Zähler-Funktion mit Echtzeit-Fähigkeit.
Zur Anzeige der laufenden Zeit verwenden wir eine 4-fach 7-Segment-Anzeige vom Typ TM1637, die per I2C mit dem Raspberry Pi Pico verbunden ist. Für die Software-seitige Ansteuerung ist eine externe Bibliothek notwendig.
Zum Starten, Stoppen und Zurückstellen der Zeitanzeige lassen wir auf dem Raspberry Pi Pico W einen Webserver laufen, der es ermöglicht, die Stoppuhr zu bedienen.
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 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 |
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.
Programmcode
Es gibt 2 Parameter, die individuell konfiguriert werden MÜSSEN:
- wlanSSID: Das ist der WLAN-Name, mit dem sich der Raspberry Pi Pico W verbinden soll.
- wlanPW: Das ist das WLAN-Passwort für die Authentifizierung an dem zu verbindenden WLAN.
Am Anfang des Programmcodes werden die Bibliotheken geladen und die Anzeige initialisiert. Danach folgen verschiedene Funktionen, die im Anschluss nacheinander aufgerufen werden.
Im Hauptteil des Programms wird zuerst die WLAN-Verbindung hergestellt. Danach wird der Webserver initialisiert und gestartet.
In dieser Lösung wird nur die Anzahl der Sekunden 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 jeweils 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 Timer, der jede Sekunde eine Funktion auslöst, in der der Zähler hochgezählt wird, die Anzeige ändert und zeitabhängige Funktionen ausführt.
# Bibliotheken laden from machine import Pin, Timer import network import socket import rp2 import utime as time import tm1637 # Konfiguration: WLAN-Zugang wlanSSID = 'WLANNAME' wlanPW = 'WLANPASSWORD' rp2.country('DE') # Display TM1637 initialisieren display = tm1637.TM1637(clk=Pin(21), dio=Pin(20)) # 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: WLAN-Verbindung def connectWLAN(): wlan = network.WLAN(network.STA_IF) if not wlan.isconnected(): print('WLAN-Verbindung herstellen') wlan.config(pm = 0xa11140) wlan.active(True) wlan.connect(wlanSSID, wlanPW) for i in range(10): if wlan.status() < 0 or wlan.status() >= 3: break print('.') time.sleep(1) # WLAN-Verbindung prüfen if wlan.isconnected(): print('WLAN-Verbindung hergestellt / WLAN-Status:', wlan.status()) ipconfig = wlan.ifconfig() #print('IPv4-Adresse:', ipconfig[0]) else: print('WLAN-Status:', wlan.status()) raise RuntimeError('Keine WLAN-Verbindung') print() # IP-Adresse zurückgeben return ipconfig[0] # Funktion: Webserver def openSocket(ip): print('Server starten') address = (ip, 80) server = socket.socket() server.bind(address) server.listen(1) print('Server hört auf', ip) print('Beenden mit STRG + C') print() return server # Funktion: HTML-Seite erzeugen def getHTML(counter, run): html = """<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="shortcut icon" href="data:"><title>Stoppuhr - Raspberry Pi Pico W</title></head><body><h1>Stoppuhr</h1>""" if run == 0: html += """<p><a href="/toggle"><button>STARTEN</button></a></p>""" if counter > 0: html += """<p><a href="/reset"><button>Zurücksetzen</button></a></p>""" else: html += """<p><a href="/toggle"><button>STOPPEN</button></a></p>""" html += """</body></html>""" return str(html) # Funktion: Webserver-Verbindungen def webserver(server): global counter global run while True: try: client, addr = server.accept() #print('HTTP-Request von Client', addr) request = client.recv(1024) #print('Request:', request) request = str(request) try: url = request.split()[1] except IndexError: url = '/' #print('URL:', url) if url == '/toggle': if run == 1: clock.deinit() run = 0 outputDisplay(counter, 1) print('Stop') else: clock.init(freq=1, mode=Timer.PERIODIC, callback=count) run = 1 print('Start') elif url == '/reset': counter = 0 outputDisplay(counter, 1) print('Reset') elif url == '/': print('Startseite') else: print('Unbekannte URL:', url) response = getHTML(counter, run) client.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n') client.send(response) client.close() #print('HTTP-Response gesendet') print() except OSError as e: break except (KeyboardInterrupt): break # Client-Verbindung und Server beenden try: client.close() except NameError: pass try: server.close() except NameError: pass print('Server beendet') # Hauptprogramm # Startwert der Stoppuhr counter = 0 # 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) try: ip = connectWLAN() server = openSocket(ip) webserver(server) except KeyboardInterrupt: machine.reset()
Stoppuhr testen und benutzen
Die Steuerung der Stoppuhr muss über den Browser erfolgen. Dazu kopiert man die IP-Adresse unter der der Webserver erreichbar ist aus der Kommandozeile in die Adresszeile des Webbrowsers eines PCs oder Smartphones, dass sich im selben WLAN befinden muss, wie der Raspberry Pi Pico W.
Auf der dargestellten Webseite wird ein Button angezeigt, der mit „STARTEN“ beschriftet ist, wenn die Stoppuhr nicht läuft. Wenn die Stoppuhr läuft, ist der Button mit „STOPPEN“ beschriftet. Mit dem Button „Zurücksetzen“ wird der interne Zähler auf 0 gesetzt und die Anzeige auf „00:00“ gestellt. Der Button „Zurücksetzen“ wird nur dann angezeigt, wenn die Stoppuhr nicht läuft und die Zeit nicht „00:00“ ist.
Erweiterung
Die Bedienung über den Browser ist eine interessante Lösung. Allerdings möchtest Du vielleicht lieber einen Taster zum Starten, Stoppen und zurücksetzen.
Weitere verwandte Themen:
- Raspberry Pi Pico: 4-fach 7-Segment-Anzeige programmieren (TM1637)
- Raspberry Pi Pico: Digitale Uhr mit Anzeige (TM1637)
- Raspberry Pi Pico: Countdown mit Zeitanzeige (TM1637)
Teilen:
Elektronik-Set Pico WLAN Edition
Hardware-nahes Programmieren mit dem Mikrocontroller Raspberry Pi Pico W und MicroPython.
- Raspberry Pi Pico W mit gelöteten Stiftleisten
- Spezielles Steckbrett mit GPIO-Beschriftung
- Einführung ins Hardware-nahe Programmieren
- Schwerpunkte: WLAN, MQTT und Internet
- Deutschsprachige Anleitung als PDF-Datei zum Download
In unseren Online-Workshops bieten wir intensiven Erfahrungsaustausch in kleinen Gruppen und Unterstützung bei individuellen Problemen.
Online-Workshop
Hardware-nahes 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)
Elektronik-Set Pico Edition
Raspberry Pi Pico: Hardware-nahes Programmieren mit MicroPython
Leichter Einstieg mit All-in-one-Set zum sofort Loslegen, um eigene Steuerungen programmieren.
Elektronik-Set Pico WLAN Edition
Raspberry Pi Pico W: IoT und Smart Home mit WLAN und MQTT
Betreibe Deinen Raspberry Pi Pico W als drahtloser Sensor in Deinem WLAN, versende E-Mails mit Daten und kommuniziere per MQTT im Internet of Things oder Smart Home.
Elektronik-Set Sensor Edition
Erweiterung zu den Elektronik-Sets Pico Edition und Pico WLAN Edition
Elektronik-Set mit den beliebtesten Sensoren zum Messen von Temperatur, Helligkeit, Bewegung, Lautstärke und Entfernung.