Raspberry Pi Pico W: Anzeige eines TM1637-Displays über WLAN ändern

Ein TM1637-Display soll als externe Anzeige verwendet und übers WLAN aus der Ferne gesteuert werden.
Auf einem Raspberry Pi Pico W läuft dazu ein Webserver, der eine Oberfläche für einen Webbrowser zur Verfügung stellt, in der die 4 Stellen des Displays geändert werden können.

Als Anzeige verwenden wir ein TM1637-Display. Dreh- und Angelpunkt der softwareseitigen Ansteuerung des Displays mit einer externen Python-Bibliothek.
Wenn Du noch keine Erfahrung mit einem TM1637-Display gemacht hast, dann empfiehlt es sich, das Display zuerst zu testen und auszuprobieren. Das ist deshalb wichtig, weil ein TM1637-Display nicht alle Zeichen darstellen kann. Zahlen funktionieren problemlos. Doch nicht alle Buchstaben lassen sich zweifelsfrei identifizieren.

Hinweis: Die folgende Webserver-Lösung ist kein vollständiger Webserver. Dafür ist der Programmcode nicht gemacht und auch nicht gedacht. Wer einen vollwertigen Webserver braucht, der sollte einen Mini-Computer, wie den Raspberry Pi mit Raspberry Pi OS, verwenden.

Aufbau und Bauteile

Raspberry Pi Pico W: WLAN-Stoppuhr mit Anzeige (TM1637)

Raspberry Pi Pico TM1637
Pin 38 GND GND
Pin 36 VCC +3,3V VCC
Pin 27 GPIO 21 CLK
Pin 26 GPIO 20 DIO

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.

Programmcode

Der Programmcode ist vergleichsweise umfangreich und dafür auch vollständig und sofort nutzbar. Es gibt nur 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.

Das verbundene TM1637-Display wird nach der Inbetriebnahme des Aufbaus auch gleich sinnvoll verwendet. Am Anfang zeigt es für ein paar Sekunden „8888“ an, damit man prüfen kann, ob alle Segmente in Ordnung sind. Danach erfolgt der WLAN-Verbindungsaufbau. Bei erfolgreicher WLAN-Verbindung wird auf dem Display jedes Oktett der IPv4-Adresse des Raspberry Pi Pico W nacheinander angezeigt. Diese Adresse muss in einem Webbrowser an einem PC im selben WLAN eingegeben werden. Damit lässt sich die Bedienoberfläche aufrufen. Die enthält ein Eingabefeld für eine 4 Stellen lange Zeichenfolge, die auf dem Display angezeigt wird. Da sich das Display vielleicht zu weit weg und nicht sichtbar ist, zeigt das Eingabefeld die aktuell dargestellte Zeichenfolge im Display an.

Hinweis: Die Verbindung zum Raspberry Pi Pico W muss ohne HTTPS bzw. TLS erfolgen. Deshalb muss man darauf achten, dass der Webbrowser in der Adresszeile kein „https://„, sondern nur ein „http://„, ohne kleines „s“ verwendet.

# Bibliotheken laden
import machine
import socket
import time
import tm1637

# WLAN-Konfiguration
wlanSSID = 'WLANNAME'
wlanPW = 'WLANPASSWORT'

# Display TM1637 initialisieren
display = tm1637.TM1637(clk=machine.Pin(21), dio=machine.Pin(20))
value = '8888'
display.show(value)
time.sleep(3)

# HTML-Datei
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>Raspberry Pi Pico W</title></head><body><h1 align="center">Hi, I'am your Raspberry Pi Pico W</h1><hr><form action="/" method="POST"><p align="center"><input type="text" size="4" maxlength="4" name="display" value="DISPLAY"> <input type="submit" value="Absenden"></p></form><hr><p align="center">DEMO von Elektronik-Kompendium.de</p></body></html>"""

# Funktion: WLAN-Verbindung
def wlanConnect():
    import network
    wlan = network.WLAN(network.STA_IF)
    network.hostname("PicoW")
    network.country('DE')
    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)
    if wlan.isconnected():
        print('WLAN-Verbindung hergestellt')
        netConfig = wlan.ifconfig()
        print('IPv4-Adresse:', netConfig[0])
        print()
        oktett = netConfig[0].split('.')
        for i in range (0, len(oktett)): display.number(int(oktett[i])); time.sleep(2); display.show('    '); time.sleep(1)
        return netConfig[0]
    else:
        print('Keine WLAN-Verbindung')
        print('WLAN-Status:', wlan.status())
        print()
        display.show('err1')
        return ''

# WLAN-Verbindung herstellen
ipv4 = wlanConnect()

# HTTP-Server starten
if ipv4 != '':
    print('Server starten')
    addr = socket.getaddrinfo(ipv4, 80)[0][-1]
    server = socket.socket()
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(addr)
    server.listen(1)
    print('Server hört auf', addr)
    print()
    print('Beenden mit STRG + C')
    print()
else:
    display.show('err2')
    raise IndexError("Keine WLAN-Verbingung. Programm beendet!")

# Auf eingehende Verbindungen hören
while True:
    try:
        conn, addr = server.accept()
        print('HTTP-Request von Client', addr, 'empfangen')
        raw_request = conn.recv(1024)
        request = raw_request.decode()
        # POST-Request auswerten
        try:
            header, body = request.split('\r\n\r\n', 1)
        except:
            header = request
            body = ''
        # Header auswerten
        header = header.split()
        # POST-Variablen auslesen
        if body != '':
            fields = body.split('&')
            POST={}
            for field in fields: 
                t = field.split('=')
                if len(t) > 1: k, v = field.split('='); POST[k] = v.replace('+', ' ')
            #print('Variablen:', POST)
            # POST-Variablen auswerten
            value = POST['display'].lower()
            value = value[0:4]
        # Display-Zeilen ausgeben
        display.show('    ')
        try:
            display.show(value)
        except ValueError:
            value = 'err '
            display.show(value)
        # HTTP-Response erzeugen und senden
        response = html
        response = response.replace('DISPLAY', value)
        conn.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        conn.send(response)
        conn.close()
        print('HTTP-Response gesendet')
        print()
    except OSError as e:
        break
    except (KeyboardInterrupt):
        break

try: conn.close()
except NameError: pass
try: server.close()
except NameError: pass
print('Server beendet')

Normalerweise sollte nach dem Ausführen des Programmcodes der Raspberry Pi Pico W verfügbar sein. Folgende zwei Fehler können auftreten:

  • Die Anzeige „Err1“ bedeutet, dass die WLAN-Verbindung nicht hergestellt werden konnte. Bitte WLAN-Name, Passwort und WLAN-Verfügbarkeit prüfen.
  • Die Anzeige „Err2“ bedeutet, dass die Server-Funktion nicht gestartet werden konnte. Dann empfiehlt sich ein Neustart des Picos.

Troubleshooting

Fehler: Trotz richtiger IPv4-Adresse schlägt die Verbindung zum Raspberry Pi Pico W fehlt. Das heißt, der Pico W wird nicht gefunden.
Dieses Problem tritt insbesondere dann auf, wenn man Änderungen am Programmcode vornimmt, speichert und den Programmcode neu startet. Es kann sinnvoll sein, auch wenn das aufwendig ist, den Raspberry Pi Pico W auszustecken und erst danach den neuen Programmcode zu starten. Es kann sein, dass im Speicher noch Fragmente in Verbindung mit dem WLAN-Chip die Funktionen des Webservers blockieren.

Darf es etwas mehr sein?

Eigentlich hat dieser Aufbau alles, was einen autarken Betrieb des Raspberry Pi Pico W ausmacht. Wenn der Programmcode fehlerfrei läuft, dann kannst Du ihn auch mit dem Dateinamen „main.py“ speichern. Die Datei wird dann automatisch gestartet. Die Datei wird dann automatisch gestartet, wenn der Raspberry Pi Pico Inbetrieb geht.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

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

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

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.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren