2.4-Zoll LCD Display am Raspberry Pi: Einrichtung und Programmierung unter Python
Nachdem ich in einem meiner letzten Beiträge den Aufbau und die Programmierung eines 1,54 Zoll E-Paper Displays gezeigt habe, möchte ich nun die Ansteuerung eines 2,4 Zoll LCD Displays zeigen. Auch hier wird die SPI-Anschlusstechnik und Python zur Programmierung auf dem Raspberry Pi OS verwendet.
Bevor wir jedoch mit der Konfiguration und Programmierung beginnen, wollen wir kurz die Vor- und Nachteile eines LCD-Displays im Vergleich zu einem E-Paper Display beleuchten.
Meine Erfahrung mit LCD-Displays
Auf der Suche nach einem größeren Display als das hier im Blog bereits beschriebene OLED-Display habe ich zunächst mit einem 1,54-Zoll E-Paper-Display experimentiert. Dieses musste jedoch aufgrund der im Artikel “E-Paper-Display am Raspberry Pi: Einrichtung und Programmierung des 1,54-Zoll Moduls unter Python” beschriebenen langsamen Aktualisierungsgeschwindigkeit schnell wieder meinem aktuellen Projekt weichen. Auf der Suche nach einem Display, das schneller aktualisiert, als das E-Paper-Display darstellen kann, bin ich auf das hier beschriebene 2,4-Zoll-LCD-Display gestoßen. Trotz des höheren Stromverbrauchs im Vergleich zum E-Paper-Display bietet es den Vorteil einer schnelleren Aktualisierungsrate und ggf. auch Farbdarstellung, was es für verschiedene Projekte interessant macht.
Vorteile der LCD-Displays
- Schnelle Aktualisierung: LCD-Displays haben eine deutlich schnellere Aktualisierungsrate im Vergleich zu E-Paper-Displays.
- Farbdarstellung: Sie können Farben darstellen und eignen sich daher für Projekte, die eine Farbausgabe erfordern.
- Höhere Komplexität: Sie ermöglichen die Darstellung komplexerer Inhalte und Animationen.
Nachteile der LCD-Displays
- Höherer Energieverbrauch: LCD-Displays verbrauchen auch im Stand-by Energie, da sie ständig beleuchtet werden müssen.
- Lesbarkeit bei Sonneneinstrahlung: Bei direkter Sonneneinstrahlung kann die Lesbarkeit beeinträchtigt sein.
Voraussetzungen und notwendige Hardware
Für dieses Projekt benötigst du:
- Raspberry Pi (beliebige Version mit SPI-Port), in meinem Fall ein Raspberry Pi 4
- Netzteil für deinen Raspberry Pi, ab dem 4er-Model mit einem USB-C Stecker
- wenn du keinen Raspberry Pi 400 oder den Raspberry Pi nicht im Headless-Betrieb nutzen willst, brauchst du natürlich noch einen Monitor, eine Tastatur und eine Maus
- 2.4 Zoll LCD-Display Modul mit ILI9341 Treiber und SPI Unterstützung
- ein Breadboard und entsprechende Kabel zum Testen, falls du noch keins hast, solltest du dir gleich ein entsprechendes Set zulegen
- optional eine GPIO-Kabel-Erweiterungsplatine, da diese die Arbeit etwas erleichtert
Schritt-für-Schritt-Anleitung
Schritt 1: Hardware-Anschluss
Verbinde die Pins des 2,4-Zoll LCD Display Moduls mit den entsprechenden Anschlüssen deines Raspberry Pi.
Schritt 2: Aktivieren der SPI-Schnittstelle
In der Grundkonfiguration des Raspberry Pi mit dem Betriebssystem Raspberry Pi OS ist die SPI-Schnittstelle nicht aktiviert. Um sie zu aktivieren, öffnest du über das Terminal das Konfigurationstool (raspi-config) mit dem Befehl:
1 |
sudo raspi-config |
Im Konfigurationstool wählst du zuerst Punkt 3 (Interface Options), danach I4 (SPI) und bestätigst die Aktivierung mit <YES>.
Nach einem Neustart des Raspberry Pi, kannst du in der config.txt Datei überprüfen, ob die Aktivierung der SPI-Schnittstelle erfolgreich war. Öffne dazu über das Terminal die config.txt Datei mit:
1 |
sudo nano /boot/config.txt |
Bei dtparam=spi=on müsste nun die Kommentierung (#) entfernt sein und der entsprechende Block in der config.txt müsste bzw. könnte nun so aussehen:
1 2 3 4 |
# Uncomment some or all of these to enable the optional hardware interfaces dtparam=i2c_arm=on #dtparam=i2s=on dtparam=spi=on |
Natürlich hättest du die Aktivierung auch gleich in der Datei machen können. 😉
Eine Übersicht über wichtige und häufig verwendete Befehle stelle ich dir auf einem kleinen Spickzettel für Raspberry Pi OS Befehle zur Verfügung.
Schritt 3: Installieren der Bibliotheken
Anmerkung vom 18.10.2023
Wie in meinem Beitrag “Ein Blick auf das Raspberry Pi OS “Bookworm”” zur neuen Version des Raspberry Pi OS Bookworm (Stand 10.10.2023) angemerkt, funktioniert die Einbindung von Python-Bibliotheken nicht mehr wie gewohnt und führt zu einem Fehler. Daher schon jetzt der Hinweis: Solltest du eine neuere Version des Raspberry Pi OS als Bullseye (Stand 03.05.2023) verwenden, musst du die hier verwendeten Bibliotheken anders einbinden.
Für die Nutzung des Displays mit Python ist die Installation entsprechender Bibliotheken notwendig. Im Gegensatz zu meinem Beitrag “E-Paper-Display am Raspberry Pi: Einrichtung und Programmierung des 1,54-Zoll Moduls unter Python” verwende ich hier nicht die von Waveshare zur Verfügung gestellte Bibliothek, sondern greife auf die von Adafruit zur Verfügung gestellte Bibliothek zurück. Diese setzt wiederum auf andere Bibliotheken auf, die du höchstwahrscheinlich schon installiert hast. Der Vollständigkeit halber habe ich alle notwendigen Abhängigkeiten und Schritte in den folgenden Befehlen aufgelistet, die du im Terminal deines Raspberry Pi ausführen musst:
1 2 3 |
sudo apt-get update sudo apt-get install build-essential python-dev python-smbus python-pip python-imaging python-numpy git sudo pip install RPi.GPIO |
Als Nächstes lädst und installierst du dir die von Adafruit zur Verfügung gestellten Bibliothek auf deinen Raspberry Pi und installierst diese.
1 2 3 4 |
cd ~ Git- Klon https://github.com/adafruit/Adafruit_Python_ILI9341.git cd Adafruit_Python_ILI9341 sudo python setup.py installieren |
Schritt 4: Programmierung des Displays
Um nicht nur ein einfaches “Hello World” auszugeben und einen direkten Vergleich zum e-Paper-Display zu haben, ermittle ich in meinem kleinen Programmcode die IP-Adresse des Raspberry Pi im Netzwerk und gebe diese zusammen mit der aktuellen Uhrzeit und den gemessenen Sensordaten eines DHT22 Sensors aus. Den Aufbau bzw. die Einbindung des DHT-Sensors habe ich in dem bereits erwähnten Beitrag “OLED Display mit SSD1306 Controller in Verbindung mit einem DHT22 Sensor am Raspberry Pi mit Python verwenden” beschrieben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
#!/usr/bin/python # coding=utf-8 # lcd-display.py # Für 2.4 Zoll TFT Display mit ILI9341 Treiber #------------------------------------------------------------ import os, sys, time, socket, logging, traceback from PIL import Image,ImageDraw,ImageFont import Adafruit_ILI9341 as TFT import Adafruit_GPIO as GPIO import Adafruit_GPIO.SPI as SPI # Einbindung DHT22 Feuchtigkeits- und Temperatursensor import Adafruit_DHT # DHT22 Sensor einrichten dhtSensorTyp = 22 # Typ 22 (weiß) - Typ 11 (blau) dhtSensorGpio = 21 # an Pin 40 - GPIO 21 angeschlossen dhtSensor_aktiv = True # angeschlossenen Sensor für Display aktivieren dhtSensorTemperatur = "" # Temperaturwert dhtSensorLuftfeuchtigkeit = "" # Luftfeuchtigkeitwert # Raspberry Pi Konfiguration des Displays DC = 25 RST = 27 SPI_PORT = 0 SPI_DEVICE = 0 # Schriftart festlegen font = ImageFont.truetype("font/arial.ttf", 20) fontdht = ImageFont.truetype("font/arial.ttf", 40) #Debug Logging logging.basicConfig(level=logging.DEBUG) #Funktion zur Ermittlung der aktuellen Uhrzeit und des Datums def aktuelleZeit(werta, wertb): zeitpunktMessung = time.localtime() jahr, monat, tag = zeitpunktMessung[0:3] stunde, minute, sekunde = zeitpunktMessung[3:6] systemUhrzeit = str(stunde).zfill(2) + ":" + str(minute).zfill(2) + ":" + str(sekunde).zfill(2) systemDatum = str(tag).zfill(2) + "." + str(monat).zfill(2) + "." + str(jahr) if werta == "time" and wertb == "date": ermittelteZeit = systemUhrzeit + " " + systemDatum elif werta == "date" and wertb == "time": ermittelteZeit = systemDatum + " " + systemUhrzeit elif werta == "time" and wertb == "": ermittelteZeit = systemUhrzeit elif werta == "date" and wertb == "": ermittelteZeit = systemDatum else: ermittelteZeit = zeitpunktMessung return ermittelteZeit # Funktion um gedrehten Text auszugeben def draw_rotated_text(image, text, position, angle, font, fill=(255,255,255)): textimage = Image.new('RGBA', (disp.width, disp.height), (0,0,0,0)) textdraw = ImageDraw.Draw(textimage) textdraw.text((0,0), text, font=font, fill=fill) rotated = textimage.rotate(angle, expand=1) image.paste(rotated, position, rotated) try: #Ermittlung der IP des Raspberry Pi s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) print("ermittelte IP:", s.getsockname()[0]) # Erstellen Sie eine TFT-LCD-Anzeigeklasse disp = TFT.ILI9341(DC, rst=RST, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=64000000)) # Anzeige initialisieren disp.begin() # PIL-Draw-Objekt, um mit dem Zeichnen im Anzeigepuffer zu beginnen draw = disp.draw() print ("Beginne mit einer Dauerschleife") while True: # Display löschen disp.clear() draw_rotated_text(disp.buffer, "Meine IP-Adresse:" , (8, 80), 90, font, fill=(255,255,255)) draw_rotated_text(disp.buffer, s.getsockname()[0] , (8, -90), 90, font, fill=(255,255,255)) draw.line((35, 0, 35 , 320), fill=(255,255,255)) luftfeuchtigkeit, temperatur = Adafruit_DHT.read_retry(dhtSensorTyp, dhtSensorGpio) dhtSensorLuftfeuchtigkeit = '%6.2f' % luftfeuchtigkeit #Sensorwert auf 2 Dezimalstellen formatiert dhtSensorTemperatur = '%6.2f' % temperatur #Sensorwert auf 2 Dezimalstellen formatiert draw_rotated_text(disp.buffer, "DHT-Sensor:" , (45, -20), 90, font, fill=(255,255,255)) draw_rotated_text(disp.buffer, "rF = " + dhtSensorLuftfeuchtigkeit + "%", (70, 35), 90, fontdht, fill=(0,255,255)) draw_rotated_text(disp.buffer, "T = " + dhtSensorTemperatur + " °C" , (130, 40), 90, fontdht, fill=(0,255,255)) draw.line((205, 0, 205 , 320), fill=(255,255,255)) draw_rotated_text(disp.buffer, "Systemzeit: " , (215, 75), 90, font, fill=(255,255,255)) draw_rotated_text(disp.buffer, aktuelleZeit("time", "date") , (215, -40), 90, font, fill=(255,255,255)) #Ausgabe auf dem Display disp.display() #Pause von einer Sekunde time.sleep(1) except IOError as e: logging.info(e) except KeyboardInterrupt: logging.info("ctrl + c:") exit() |
Im Programm binde ich mit “font/arial.ttf” eine eigene Schriftart für das Display ein. Adafruit empfiehlt für weitere Schriftarten die Seite http://www.dafont.com/bitmap.php.
Fazit
Die Ansteuerung eines 2,4-Zoll-LCD-Displays mit einem Raspberry Pi ist zwar etwas energieintensiver als ein E-Paper-Display, ermöglicht aber eine farbige und dynamische Ausgabe und ist daher für viele Projekte die ideale Lösung.
Ich hoffe, diese Anleitung hilft dir bei deinem nächsten Projekt. Wenn du Fragen oder Anregungen hast, lass es mich in den Kommentaren wissen!
Bereitgestellte Dateien und Links
Die fritzing Projektdatei steht auch auf meiner fritzing Projektseite auf diesem Blog zum Download zur Verfügung.
Die Datei arial.ttf habe ich hier als arial.zip auf meinen Blog hochgeladen. In meinem Code liegt es im Ordner font im gleichen Verzeichnis wie die Programmdatei.
Wenn du dir das Abtippen oder Kopieren des Codes sparen möchtest, steht dir der Code als Textdatei zum Download bereit.
Gib im Terminal folgenden Befehl ein, dieser lädt die Textdatei herunter und speichert diese als Python-Datei ab.
1 |
wget -O lcd-display.py https://webnist.de/downloads/lcd-display.txt |
Kleiner Hinweis, alle Kommentare werden moderiert.
Dies bedeutet, der Kommentar wird vor der Veröffentlichung durchgelesen und von mir geprüft. Auch behalte ich mir vor, jeden Kommentar zu löschen, der nicht direkt auf das Thema abzielt oder nur den Zweck hat, Leser oder Autoren herabzuwürdigen.