E-Paper-Display am Raspberry Pi: Einrichtung und Programmierung des 1,54-Zoll Moduls unter Python
E-Paper-Displays, auch bekannt als elektronisches Papier, bieten eine energieeffiziente Möglichkeit zur Anzeige von Informationen. In diesem Beitrag zeige ich den Aufbau und die Programmierung eines 1,54 Zoll (ca. 4 cm) E-Paper-Moduls am SPI-Port eines Raspberry Pi unter Verwendung von Python auf dem Raspberry Pi OS. Zuvor möchte ich auf meine persönlichen Erfahrungen eingehen, die mich dazu veranlasst haben, eine Übersicht über die Vor- und Nachteile dieser Technologie zu erstellen.
Meine Erfahrung mit E-Paper-Displays
Im Rahmen eines meiner Projekte habe ich mich auf die Suche nach einem etwas größeren Display als das in diesem Blog bereits beschriebene OLED Display gemacht. Dabei bin ich auf das 1,54 Zoll große E-Paper-Display gestoßen und habe es spontan bestellt, um es in mein aktuelles Projekt zu integrieren. Nachdem ich es installiert und für meine Zwecke konfiguriert hatte, wurde mir die langsame Aktualisierungsgeschwindigkeit bewusst – einer der Nachteile dieser Technologie.
Vorteile der E-Paper-Displays
- Energieeffizienz: E-Paper-Displays verbrauchen nur dann Energie, wenn sich der angezeigte Inhalt ändert, wodurch sie für batteriebetriebene Projekte geeignet sind.
- Hohe Lesbarkeit: Dank ihrer reflektiven Technologie sind E-Paper-Displays bei verschiedenen Lichtverhältnissen gut lesbar.
- Dünn und leicht: E-Paper-Displays sind dünn und leicht, was sie für tragbare Anwendungen attraktiv macht.
- Kein Ghosting: Im Gegensatz zu einigen anderen Displaytechnologien zeigen E-Paper-Displays, keine Restbilder von vorherigen Anzeigen an.
- Lange Lebensdauer: Durch das Fehlen einer Hintergrundbeleuchtung haben E-Paper-Displays eine längere Lebensdauer.
Nachteile der E-Paper-Displays
- Langsame Aktualisierung: E-Paper-Displays haben eine langsamere Aktualisierungsrate als andere Display-Typen.
- Monochrom oder begrenzte Farben: Viele E-Paper-Displays bieten nur eine monochrome oder eingeschränkte Farbdarstellung.
- Begrenzte Komplexität: Aufgrund der langsamen Aktualisierungsgeschwindigkeit eignen sich E-Paper-Displays weniger für schnelle Animationen oder komplexe Bildwechsel.
- Komplexere Ansteuerung: Die Ansteuerung von E-Paper-Displays erfordert oft mehr technisches Wissen und Implementierungsaufwand.
- Höhere Kosten: Qualitativ hochwertige E-Paper-Displays können teurer 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
- 1,54-Zoll E-Paper-Display Modul
- 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
Bevor du anfängst, verbindest du die verschiedenen Pins des 1,54 Zoll E-Paper Moduls mit den entsprechenden Anschlüssen deines Raspberry Pi. Die Pins dienen dazu, die Verbindung zwischen dem Display und dem Raspberry Pi herzustellen.
Die folgende Abbildung mit fritzing zeigt den Anschluss an einem Raspberry Pi 4+.
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.
Zur Ansteuerung des E-Paper-Displays wird eine spezielle Softwarebibliothek benötigt. Um die benötigte Bibliothek zu installieren, führe die folgenden Befehle auf dem Terminal aus:
1 2 3 4 |
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz tar zxvf bcm2835-1.71.tar.gz cd bcm2835-1.71/ sudo ./configure && sudo make && sudo make check && sudo make install |
Weitere Informationen zur verwendeten bcm2835 Bibliothek findest du hier.
Als Nächstes lädst und installierst du dir die von Waveshare zur Verfügung gestellten Beispiele auf deinen Raspberry Pi. Falls du noch kein Package (Programm) zum Packen und Entpacken von 7z-Archiven installiert hast, installiere zuerst ein entsprechendes Package mit dem Befehl:
1 |
sudo apt-get install p7zip-full |
Lade und installiere dann die Demo mit den folgenden Befehlen über das Terminal:
1 2 3 4 5 |
wget https://www.waveshare.com/w/upload/3/39/E-Paper_code.7z 7z x E-Paper_code.7z -O./e-Paper cd e-Paper/RaspberryPi_JetsonNano/c sudo make clean sudo make -j4 EPD=epd1in54V2 |
Die Demo startest du mit dem Befehl:
1 |
sudo ./epd |
Schritt 4: Programmierung des Displays
Folgende Python-Bibliotheken werden benötigt und können über folgende Befehle bei Bedarf installiert werden:
1 2 3 4 5 |
sudo apt-get install python3-pip sudo apt-get install python3-pil sudo apt-get install python3-numpy sudo pip3 install RPi.GPIO sudo pip3 install spidev |
In den Ordnung des Beispielprogramms kommst du über den Befehl:
1 |
cd e-Paper/RaspberryPi_JetsonNano/python/examples/ |
Die Demo kannst du mit folgenden Befehl aufrufen:
1 |
python3 epd_1in54_V2_test.py |
Eine Demo ist ja wunderschön, aber um zu testen ist ein eigener Code immer besser. 🙂
Um nicht nur ein einfaches “Hello World” als eigenen Testcode auszugeben, 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 |
#!/usr/bin/python # -*- coding:utf-8 -*- import os, sys, time, socket, logging, socket, traceback picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic') libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib') if os.path.exists(libdir): sys.path.append(libdir) from waveshare_epd import epd1in54_V2 from PIL import Image,ImageDraw,ImageFont # 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 #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) 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 try: logging.info("epd1in54_V2 Demo") epd = epd1in54_V2.EPD() #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]) logging.info("init and Clear") epd.init(0) epd.Clear(0xFF) time.sleep(1) # Drawing on the image logging.info("1.Drawing on the image...") image = Image.new('1', (epd.width, epd.height), 255) # 255: clear the frame draw = ImageDraw.Draw(image) font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 22) print ("Beginne mit einer Dauerschleife") while True: draw.rectangle((0, 0, 200, 200), outline=1, fill = 100) draw.text((5, 12), 'Meine IP-Adresse:', font = font, fill = 0) draw.text((5, 36), s.getsockname()[0], font = font, fill = 0) draw.line((0, 68, 200, 68), fill = 0) 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 print ("Werte DHT22 - Luftfeuchtigkeit = " + dhtSensorLuftfeuchtigkeit + " Temperatur = " + dhtSensorTemperatur) draw.text((5, 70), "Werte DHT-Sensor:", font = font, fill = 0) draw.text((5, 95), "rF = " + dhtSensorLuftfeuchtigkeit, font = font, fill = 0) draw.text((5, 120), "Temp. = " + dhtSensorTemperatur, font = font, fill = 0) draw.line((0, 148, 200, 148), fill = 0) draw.text((5, 150), "Systemzeit: " , font=font, fill=0) draw.text((5, 174), aktuelleZeit("time", "date") , font=font, fill=0) epd.display(epd.getbuffer(image.rotate(90))) time.sleep(10) logging.info("Clear...") epd.init(0) epd.Clear(0xFF) logging.info("Goto Sleep...") epd.sleep() except IOError as e: logging.info(e) except KeyboardInterrupt: logging.info("ctrl + c:") logging.info("Clear...") epd.init(0) epd.Clear(0xFF) logging.info("Goto Sleep...") epd.sleep() epd1in54_V2.epdconfig.module_exit() exit() |
Nach dem Abarbeiten des Programmcodes fällt auf, dass das Display immer wieder neu aufgebaut wird, was einige Zeit in Anspruch nimmt und zu einem Flackern führt. Hätte ich mich im Vorfeld etwas intensiver mit den Eigenschaften des Displays beschäftigt, hätte ich die Kosten für Anschaffung und Test reduzieren können.
Fazit
Bereitgestellte Dateien und Links
Die fritzing Projektdatei steht auch auf meiner fritzing Projektseite auf diesem Blog zum Download zur Verfügung.
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 e-paper.py https://webnist.de/downloads/e-paper.txt |
Das Handbuch zum hier beschriebenen 1,54-Zoll E-Paper-Display Modul findest du auf der entsprechenden Webseite von Waveshare.
Die Beschreibung der verwendeten PIL Bibliothek findest du hier.
Gut der Hinweis das das Ganze unter Bookworm nicht mehr funktioniert! Das betrifft auch andere Bausaetze (wie z.B den NAS-Kit von Sunfounder) oder Weather Display.
Man sollte das Ganze mal angehen mit Basis Bookworm
Hallo,
vielen Dank für den Hinweis. Da Bookworm derzeit nur für den Raspberry Pi 5 benötigt wird und für den Raspberry Pi 4 verfügbar ist, dürfte der Anteil der verwendeten Distribution Bullseye noch sehr hoch sein. Dies kann sich natürlich im Laufe der Zeit ändern, wenn der Raspberry Pi weitere Verbreitung findet. Man darf aber nicht vergessen, dass viele Nutzer nicht unbedingt das neueste Modell oder wie ich für mein RasPi Zero Hub Projekt sogar einen Zero verwenden.
Ich denke, dass die Umsetzung von Kits auf Bookworm-Basis von den Firmen angegangen werden wird, wenn die entsprechende Nachfrage groß genug ist, um sich zu rechnen.
Viele Grüße
Wolfgang
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.