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

Raspberry Pi Pico mit LCD 1602 Display mit I2C-Modul

  1. Verbinde zuerst den Raspberry Pi Pico mit dem USB vom Host-Computer.
  2. Verbinde dann das Display mit VCC (Pin 40) und GND (z. B. (Pin 38) vom Raspberry Pi Pico.
  3. Wenn das Display mit VCC und GND verbunden ist, sollte es angehen. Angezeigt wird aber noch nichts.
  4. 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:

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