Raspberry Pi Pico W: Anzeige eines LCD1602-Displays über WLAN ändern
Ein zweizeiliges LCD1602-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 beiden 16-stelligen Zeilen des Displays geändert werden können.
Als Anzeige verwenden wir ein LCD-1602-Display mit I2C-Modul. Dreh- und Angelpunkt der softwareseitigen Ansteuerung des Displays mit der I2C-Schnittstelle sind zwei Python-Bibliotheken. Eine für den I2C und das andere für das Display selber.
Wenn Du noch keine Erfahrung mit der I2C-Schnittstelle und einem LCD-1602-Display gemacht hast, dann empfiehlt es sich, das Display zuerst zu testen und auszuprobieren.
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
- Verbinde zuerst den Raspberry Pi Pico mit dem USB vom Host-Computer.
- Verbinde dann das Display mit VCC (Pin 40) und GND (z. B. (Pin 38) vom Raspberry Pi Pico.
- Wenn das Display mit VCC und GND verbunden ist, sollte es angehen. Angezeigt wird aber noch nichts.
- Wenn das Display mit Strom versorgt ist, dann verbinde das Display mit I2C0 SDA (GPIO20, Pin 26) und I2C0 SDL (GPIO21, Pin 27) vom Raspberry Pi Pico.
Hinweis: Warum wählen wir gerade Pin 26 und 27? Diese Pins haben nur den I2C als Doppelbelegung. Man kommt nicht mit SPI, ADC oder UART in Konflikt.
Schnell und einfach alle Bauteile zusammen bestellen
MicroPython-Bibliotheken für I2C und das Display
Um das Display über die I2C-Schnittstelle softwareseitig ansteuern zu können, sind zwei MicroPython-Bibliotheken erforderlich.
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 LCD1602-Display wird nach der Inbetriebnahme des Aufbaus auch gleich sinnvoll verwendet. So zeigt es nach dem WLAN-Verbindungsaufbau und der Initialisierung des Webservers die IPv4-Adresse an. 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 zwei Eingabezeilen für jeweils eine 16 Stellen lange Zeichenfolge, die auf dem Display angezeigt werden. Da sich das Display vielleicht zu weit weg und nicht sichtbar ist, zeigen die Eingabezeilen 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 rp2 import time from machine_i2c_lcd import I2cLcd # Initialisierung I2C i2c = machine.I2C(0, sda=machine.Pin(20), scl=machine.Pin(21), freq=100000) # Initialisierung LCD über I2C lcd = I2cLcd(i2c, 0x27, 2, 16) zeile_oben = 'Zeile 1' zeile_unten = 'Zeile 2' lcd.putstr(zeile_oben + "\n" + zeile_unten) # WLAN-Konfiguration wlanSSID = 'WLANNAME' wlanPW = 'WLANPASSWORT' # 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"><label for="col1">Zeile 1</label><input id="col1" type="text" size="16" maxlength="16" name="col1" value="COL1"></p><p align="center"><label for="col2">Zeile 2</label><input id="col2" type="text" size="16" maxlength="16" name="col2" value="COL2"></p><p align="center"><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() return netConfig[0] else: print('Keine WLAN-Verbindung') print('WLAN-Status:', wlan.status()) print() 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) lcd.clear() lcd.putstr('Server gestartet' + "\n" + ipv4) print('Server hört auf', addr) print() print('Beenden mit STRG + C') print() else: lcd.clear() lcd.putstr('Kein WLAN') 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('+', ' ') # POST-Variablen auswerten zeile_oben = POST['col1'] zeile_unten = POST['col2'] # Display-Zeilen ausgeben lcd.clear() lcd.putstr(zeile_oben + "\n" + zeile_unten) # HTTP-Response erzeugen und senden response = html response = response.replace('COL1', zeile_oben) response = response.replace('COL2', zeile_unten) 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')
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, wenn der Raspberry Pi Pico Inbetrieb geht.
Weitere verwandte Themen:
- Raspberry Pi Pico: LCD-1602-Display mit I2C-Modul programmieren
- Raspberry Pi Pico: Digitales Thermometer mit Display (LCD1602 mit I2C)
- Raspberry Pi Pico: 4-fach 7-Segment-Anzeige programmieren (TM1637)
- Raspberry Pi Pico W als Webserver
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)