OLED Display mit SSD1306 Controller in Verbindung mit einem DHT22 Sensor am Raspberry Pi mit Python verwenden
In diesem Beitrag zeige ich dir die notwendigen Schritte, damit du ein I2C OLED Display mit SSD1306 Displaycontroller am Raspberry Pi mit Python verwenden kannst.
Für die Datenerfassung verwende ich einen DHT22 Sensor zur digitalen Messung der Temperatur und Luftfeuchtigkeit. Die Ausgabe der Messdaten erfolgt über ein 0,96 Zoll AZDelivery OLED Display mit 128×64 Pixel.
Aktualisierung am 06.08.2023
Dieser Beitrag wurde am 06.08.2023 von mir aktualisiert bzw. soweit notwendig, für das zum Zeitpunkt der Beitragsüberarbeitung aktuelle Raspberry Pi OS (Stand 03. Mai 2023) angepasst. Der Programmcode wurde für Python 3 aktualisiert.
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 Adafruit-Bibliotheken anders einbinden.
Anschluss des Display am Raspberry Pi
Das Display wird neben dem Anschluss zur Spannungsversorgung an 3,3 Volt (Pin 1) und Ground (ein GND z.B. Pin 6, 9, 14 usw.) an die I2C Schnittstelle des Raspberry Pi angeschlossen. Diese befindet sich an Pin 3 (GPIO02 – SDA1) und 5 (GPIO03 SCL1) der GPIO-Leiste des Raspberry Pi.
In den Kommentaren meldeten manche User von Problemen mit dem Display. Deshalb möchte ich den Hinweis von Steffen hier im Beitrag einbinden.
“ich hatte heute exakt dasselbe Problem. Schlussendlich bin ich auf einen Beitrag gestoßen, in dem eine Person anmerkte, Probleme mit langen Leitungswegen an diesem Display zu haben. Habe es dann mal testweise einfach mit vier Kabeln angeschlossen (vorher hatte ich es etwas umständlicher auf dem Breadboard verdrahtet). Das Display funktionierte damit auf Anhieb und wird nun auch von “i2cdetect -y 1” korrekt erkannt (was vorher nicht der Fall war)”.
Aktivierung der I2C Schnittstelle
In der Grundkonfiguration des Raspberry Pi mit dem Raspberry Pi Betriebssystem ist die I2C Schnittstelle nicht aktiviert. Für die Aktivierung sind folgende Schritte notwendig. Hierzu öffnest du das Terminal-Programm und rufst mit dem Texteditor die Datei /etc/modules auf.
1 |
sudo nano /etc/modules |
In diese fügst du folgende zwei Zeilen am Ende ein.
1 2 |
i2c-bcm2708 i2c-dev |
Danach speicherst du diese mit der Tastenkombination Strg+o und schließt den Editor mit Strg+x.
Danach rufst du die Konfigurationsdatei /boot/config.txt im Terminal auf
1 |
sudo nano /boot/config.txt |
und entfernst die Kommentierung (#) bei den folgenden beiden Zeilen.
1 2 |
dtparam=i2c_arm=on <del>dtparam=i2c1=on </del># nicht mehr vorhanden |
Danach speicherst du die Änderung mit Strg+o und schließt den Editor mit Strg+x.
Als Nächstes überprüfen und ggf. bearbeiten wir noch die Konfigurationsdatei /etc/modprobe.d/raspi-blacklist.conf. In dieser Datei sollten keine Eintragungen bezüglich der I2C Schnittstelle vorhanden sein. Du kannst diese löschen oder auskommentieren (#).
Danach führst du mit sudo reboot einen Neustart des Raspberry Pi durch.
Anmerkung: Über die Konfigurationsdatei (raspi-config) kannst du die I2C-Schnittstelle aktivieren. Allerdings fehlt dann die Angabe zum Low-Level-Treiber i2c-bcm2708.
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.
Einsatz der I2C-Tools
Für die Installation und das Betreiben des Displays sind die I2C-Tools nicht notwendig. Allerdings empfiehlt sich die Installation, da das kleine Tool das testen des I2C-Bus ermöglich.
1 |
sudo apt-get install i2c-tools |
Testen ob das Bauteil, in unserem Fall das Display am I2C-Bus ansprechbar ist, kannst du durch Eingabe folgenden Befehls:
1 |
i2cdetect -y 1 |
Die Ausgabe zeigt bei dem ersten Abruf das Bauteil (3c) auf der Adresse c30, beim zweiten Abruf habe ich das Display nicht angeschlossen und es wird kein Bauteil angezeigt.
Installation der notwendigen SSD1306 Python Bibliothek
Da das Display zur Darstellung einen SSD1306 Displaycontroller verwendet, können wir auf die auf GitHub zur Verfügung gestellte SSD1306 Python Bibliothek von Adafruit zurückgreifen. Hierzu öffnest du das Terminal Programm und lädst dir die Bibliothek mit folgendem Befehl von GitHub auf den RasPi.
1 |
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git |
Sollte es bei der Verwendung des Befehles zu einer Fehlermeldung kommen, musst du ggf. das entsprechende Paket mit sudo apt-get install git installieren.
Danach wechselst du in das Verzeichnis mit der heruntergeladenen Bibliothek und installierst, damit es für Python zur Verfügung steht.
1 2 |
cd Adafruit_Python_SSD1306 sudo python setup.py install |
Sollte bei die eine Fehlermeldung erscheinen mit folgender Angabe: ModuleNotFoundError: No module named ‘setuptools’, benötigst du noch die Python Setuptools. Um diese mit PIP zu installieren, benötigst du zuerst das Paketinstallationsprogramm PIP für Python. Mit folgenden Befehlen kannst du PIP und die Setuptools installieren.
1 2 |
sudo apt-get install python3-pip pip install setuptools |
Installation der Adafruit DHT Bibliothek
Die DHT Bibliothek von Adafruit bindest du mit folgenden Befehl in Python3 ein.
1 |
sudo pip3 install Adafruit_DHT |
Das Python-Programm
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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
#!/usr/bin/python # coding=utf-8 # Python Version 3.9 # display.py #------------------------------------------------------------ # Einbindung der notwendigen Grundbibliotheken import os, sys, time, threading # Einbindung 0,96 Zoll OLED Display 128x64 Pixel import Adafruit_SSD1306 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 # Global für Anzahl der Temperaturanzeigen auf Display displaySensorBezeichnung = "" displayTempWert = "" a=u"°" # damit Sonderzeichen korrekt dargestellt wird # Global für Aktivitätsstatus einzelner Threads/Programmteile Display_aktiv = True Thread_Sensoren_aktiv = True # Funktionen #----------------------------- 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 def sensorenAbfrage(): # Thread zum Auslesen der Sensoren global dhtSensor_aktiv, dhtSensorGpio, dhtSensorTyp, dhtSensorTemperatur, dhtSensorLuftfeuchtigkeit print ("Thread zur Sensorenabfrage gestartet.") while dhtSensor_aktiv: # Abfrage Luftfeuchtigkeit und Temperatur 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) displaySensorwertAusgabe() time.sleep(5) # notwendige Pause von mindestens 2 Sekunden - siehe Spezifikation des verwendeten Sensors def displaySensorwertAusgabe(): global displaySensorBezeichnung, displayTempWert, a, dhtSensorLuftfeuchtigkeit, dhtSensorTemperatur displaySensorBezeichnung = "DHT22 Sensor :" displayTempWert = dhtSensorLuftfeuchtigkeit + " % " + dhtSensorTemperatur + " " + a + "C" # Display einrichten # Raspberry Pi pin configuration: RST = 24 # Display 128x64 display with hardware I2C: disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) # Initialize library. disp.begin() # Clear display. disp.clear() disp.display() # Create blank image for drawing. # Make sure to create image with mode '1' for 1-bit color. width = disp.width height = disp.height image = Image.new('1', (width, height)) # Get drawing object to draw on image. draw = ImageDraw.Draw(image) # Draw a black filled box to clear the image. draw.rectangle((0,0,width,height), outline=0, fill=0) # First define some constants to allow easy resizing of shapes. padding = 2 shape_width = 20 top = padding bottom = height-padding # Move left to right keeping track of the current x position for drawing shapes. x = padding # Load default font. # font = ImageFont.load_default() # Wenn keine eigene Schrift vorhanden ist!!!! font = ImageFont.truetype("font/arial.ttf", 12) # Schriftart, Schriftgröße font_b = ImageFont.truetype("font/arial.ttf", 18) font_c = ImageFont.truetype("font/arial.ttf", 14) # Write one line of text. draw.text((x, top+25), 'Start', font=font_b, fill=255) # Display image. disp.image(image) disp.display() # Abfrage des DHT Sendor in eigenem Thread starten sensorenAbfrageThread = threading.Thread(target=sensorenAbfrage) #Sensorenabfrage sensorenAbfrageThread.start() time.sleep(5) #damit alle Sensorwerte zum Start eingelesen sind # Hauptroutine while Display_aktiv: draw.rectangle((0,0,width,height), outline=0, fill=0) #Display leeren displayTime = aktuelleZeit("time", "date") # bei Abfrage "date","time" ändert die Reihenfolge der Ausgabe draw.text((x, top), displaySensorBezeichnung , font=font, fill=255) draw.text((x, top+20), displayTempWert, font=font_c, fill=255) draw.line((x, top+45, x+width, top+45), fill=255) draw.text((x, top+50), displayTime, font=font, fill=255) disp.image(image) disp.display() |
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. Ein Blick in die Beispielprogramme von Adafruit und auf die Beschreibung des zur Ausgabe verwendete Image Modul zeigt noch viele weitere Möglichkeiten der Ausgabe.
Fehlermeldung: oserror errno 121 remote i/o error
Wenn du das Programm über ssh startest, kann es sein, dass du den Fehler oserror errno 121 remote i/o error bekommst. Aktiviere in diesem Fall über das Konfigurations-Tool (sudo raspi-config) unter 3 Interface Options den Punkt I8 Remote GPIO.
Bereitgestellte Dateien
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 display.py https://webnist.de/downloads/display.txt |
Hallo Wolfgang, habe da offensichtlich ein Problem mit den ttf-Fonts. Wo würden die, zb. font/arial.ttf, liegen?
Beim Ausführen des Programms bleibt das OLED schwarz und im Terminal kommen auch keine Werte des DHT11, und kommen unten stehende Fehlermeldungen.
Wenn ich die Zeilen 205-208 und die mit DRAW mit # “ausklammere”, bleibt das Display auch schwarz, aber ich bekomme die Werte vom DHT 11 im Terminal.
??
Danke und Gruß Fritz
Python 3.9.2 (/usr/bin/python3)
>>> %Run display.py
Traceback (most recent call last):
File “/home/raspberry/Adafruit_Python_SSD1306/examples/display.py”, line 206, in
font = ImageFont.truetype(“font/arial.ttf”, 12) # Schriftart, Schriftgröße
File “/usr/lib/python3/dist-packages/PIL/ImageFont.py”, line 852, in truetype
return freetype(font)
File “/usr/lib/python3/dist-packages/PIL/ImageFont.py”, line 849, in freetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File “/usr/lib/python3/dist-packages/PIL/ImageFont.py”, line 209, in __init__
self.font = core.getfont(
OSError: cannot open resource
Hallo Fritz, die arial.ttf liegt laut Beispiel im Ordner fonts. Schaue Dir bitte einmal den Kommentar vom 20. Juni 2017 bzw. meine Antwort darauf an. Es dürfte sich um die gleiche Problematik handeln.
Viele Grüße
Wolfgang
Den DHT 22 Muss ich ja ganz anderst angehen
Verkabelung GPIO21 Pin
Dann muss ich erst mal ein Script anlegen wo der Sensor hinterlegt wird
Dann die Befehle zum Sensordaten Auslesen ?
Dann der P=ython Script Schreiben.?
Das sind die installierten Dateien derzeit auf dem Py
pi@raspberrypi:~ $ ls
adafruit lol_dht22 sevensegment_demo.py.1
Adafruit_Python_DHT messprogramm.py sevensegment_demo.py.2
Adafruit_Python_SSD1306 Music Templates
Desktop Pictures Videos
dht22.c Public wiringPi
Documents python_games
Downloads sevensegment_demo.py
Hierzu Fehlt mir der Zusammenhang wie ich anfangen muss um den Sensor Zu Configurieren einzurichten.
Es ist anderst alleine schon von der GPIO Pin Angabe wie heist der befehl zum dht 22 anzusprechen?
Gruß Michael
Hallo Michael,
ich kann gut verstehen, dass dir als Anfänger der Zusammenhang fehlt. Als erstes musst du den Sensor am Raspberry Pi anschließen. Damit du ihn über Python auslesen kannst, benötigst du die Python-Bibliothek. Dann kannst du dein Skript schreiben, oder du verwendest / erweiterst eines der Installierten Dateien von Adafruit.
In meinem obigen Programm findest du die Einbindung der Bibliothek unter dem entsprechenden Kommentar. Die Einrichtung des Sensors unter dem entsprechenden Kommentar. Die Messwerterfassung erfolgt unter sensorenAbfrage().
# Abfrage Luftfeuchtigkeit und Temperatur
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
Die Wertausgabe erfolgt mit: print “Werte DHT22 – Luftfeuchtigkeit = “, dhtSensorLuftfeuchtigkeit, ” Temperatur = “, dhtSensorTemperatur
Viele Grüße
Wolfgang
Es gibt dinge von dnen mann meint es wären einfach.
Leider habe ich es nicht gesachaft den dht 22 zum laufen zubekommen.
Ivh habe ihn am gpio21 angeschlossen es ist ja kein Onowire bus der DHT22 nicht wie beim DS18 Temperaturfühler. Gruß Michael
Geplant war mit dem übrigen Raspberry Pi Eine Wetterstation zubauen da meine alte TFA Station kaput ging. Darum dachte ich mir den PI Haste und kaufst dir von codingworld den bausatz wetterstation. Abber so als anfänger ist das schon ne Ziehmliche Herausforderung.
Ist den bei dem Bausatz keine Beschreibung dabei?
Danke für deinen link den du mir zukommen liest.
leider bekomme ich folgenden fehler ausgegeben.
Traceback (most recent call last):
File “/home/pi/Desktop/DHT22.Python3.py”, line 62, in
while Display_aktiv:
NameError: name ‘Display_aktiv’ is not defined
das Script habe ich etwas abgeändert
wie folgt #!/usr/bin/python
# coding=utf-8
# Python Version 2.7
# display.py
#————————————————————
# Einbindung der notwendigen Grundbibliotheken
import os, sys, time, threading
# Einbindung DHT22 Feuchtigkeits- und Temperatursensor
import Adafruit_DHT
# DHT22 Sensor einrichten
dhtSensorTyp = 22 # Typ 22 (weiß) – Typ 11 (blau)
dhtSensorGpio = 13 # an Pin 33 – GPIO 13 angeschlossen
dhtSensor_aktiv = True # angeschlossenen Sensor für Display aktivieren
dhtSensorTemperatur = “” # Temperaturwert
dhtSensorLuftfeuchtigkeit = “” # Luftfeuchtigkeitwert
# Funktionen
#—————————–
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
def sensorenAbfrage():
# Thread zum Auslesen der Sensoren
global dhtSensor_aktiv, dhtSensorGpio, dhtSensorTyp, dhtSensorTemperatur, dhtSensorLuftfeuchtigkeit
print “Thread zur Sensorenabfrage gestartet.”
while dhtSensor_aktiv:
# Abfrage Luftfeuchtigkeit und Temperatur
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
displaySensorwertAusgabe()
time.sleep(5) # notwendige Pause von mindestens 2 Sekunden – siehe Spezifikation des verwendeten Sensors
# Abfrage des DHT Sendor in eigenem Thread starten
sensorenAbfrageThread = threading.Thread(target=sensorenAbfrage) #Sensorenabfrage
sensorenAbfrageThread.start()
time.sleep(5) #damit alle Sensorwerte zum Start eingelesen sind
# Hauptroutine
while Display_aktiv:
draw.rectangle((0,0,width,height), outline=0, fill=0) #Display leeren
displayTime = aktuelleZeit(“time”, “date”) # bei Abfrage “date”,”time” ändert die Reihenfolge der Ausgabe
draw.text((x, top), displaySensorBezeichnung , font=font, fill=255)
draw.text((x, top+20), displayTempWert, font=font_c, fill=255)
draw.line((x, top+45, x+width, top+45), fill=255)
draw.text((x, top+50), displayTime, font=font, fill=255)
disp.image(image)
disp.display()
Gruß Michael
Hallo Michael,
in deiner Abwandlung hast du “Display_aktiv” nicht definiert. In meinem Programmcode findest du es in Zeile 32.
Da du wahrscheinlich kein OLED-Display verwendest, solltest du die Hauptroutine entsprechend umschreiben oder die von dir gesuchten DHT Sensor abfragen in ein eigenständiges Skript schreiben.
Viele Grüße
Wolfgang
Hallo Wolfgang,
das Display ist da, nach den Änderungen auf Python 3 hat es sofort funktioniert.
Danke dafür !
Eine weitere Frage habe ich noch:
Ich möchte eine einfache Pixelgrafik (jpg) ausgeben, finde aber die Befehle zur Ausgabe auf dem Display nicht,
das holen der Grafik aus dem Speicher ist nicht das Thema.
Hast Du da vielleicht eine Lösung ?
Gruß
Peter
Hallo Peter,
vielen Dank für die positive Rückmeldung.
Eine direkte Lösung habe ich nicht. Allerdings ist unter den Beispielen von Adafruit auf github folgendes Demo Image-Ausgabe dabei. Laut dem Quellcode wird eine Umwandlung des jpg Formates notwendig sein.
Viele Grüße
Wolfgang
Mit
bild = Image.open(‘image/testbild.jpg’).resize((disp.width, disp.height), Image.ANTIALIAS).convert(‘1’)
wird automatisch umgewandelt in ein schwarz/weiß Bild, auch von jpg und png.
Pixelgrafiken sind natürlich vorzuziehen, da einfacher aufgebaut.
Danke für den Tipp
Gruß
Peter
Vielen Dank für Deinen Kommentar.
Viele Grüße
Wolfgang
Hallo und vielen Dank für diesen Beitrag.
Meine Anzeige ist noch auf dem langen Postweg…
Frage vorab, ist dein Programm und der Adafruittreiber auch unter Python 3.5 lauffähig ?
Gruß
Peter
Hallo Peter,
die Adafruit Bibliothek ist so weit mir bekannt auch mit Python 3.5 kompatibel. Mein Skript muss angepasst werden. So kommen beim print die notwendigen Klammern hinzu.
Sonst dürften keine Anpassungen notwendig sein und dem Aufbau steht somit nichts mehr im Wege 😉
Viele Grüße
Wolfgang
Hallo Wolfgang!
ich habe deine Anleitung so gut es ging befolgt, leider bekomme ich immer diesen Fehler angezeigt.
Vielleicht kannst du mir sagen an was es liegen könnte.
pi@raspberrypi:~/Adafruit_Python_SSD1306/examples $ python shapes.py
Traceback (most recent call last):
File “shapes.py”, line 70, in
disp.begin()
File “build/bdist.linux-armv6l/egg/Adafruit_SSD1306/SSD1306.py”, line 148, in begin
File “build/bdist.linux-armv6l/egg/Adafruit_SSD1306/SSD1306.py”, line 292, in _initialize
File “build/bdist.linux-armv6l/egg/Adafruit_SSD1306/SSD1306.py”, line 129, in command
File “build/bdist.linux-armv6l/egg/Adafruit_GPIO/I2C.py”, line 115, in write8
File “build/bdist.linux-armv6l/egg/Adafruit_PureIO/smbus.py”, line 236, in write_byte_data
IOError: [Errno 121] Remote I/O error
Ich danke dir recht Herzlich!
LG Stefan
Hallo Stefan,
ich hatte heute exakt dasselbe Problem. Schlussendlich bin ich auf einen Beitrag gestoßen, in dem eine Person anmerkte, Probleme mit langen Leitungswegen an diesem Display zu haben. Habe es dann mal testweise einfach mit vier Kabeln angeschlossen (vorher hatte ich es etwas umständlicher auf dem Breadboard verdrahtet). Das Display funktionierte damit auf Anhieb und wird nun auch von “i2cdetect -y 1” korrekt erkannt (was vorher nicht der Fall war).
Viele Grüße
Steffen
Hallo Steffen,
vielen lieben Dank für Deinen hilfreichen Kommentar. Deinen Hinweis zu den langen Leitungswegen werde ich im Beitrag einbinden.
Viele Grüße
Wolfgang
Hallo Stefan,
vielen Dank für deinen Kommentar. Leider kann ich dir so aus der Ferne keine Hilfestellung bieten. Mein Ansatz wäre die Überprüfung, ob der I2C Bus über raspi-config aktiviert ist. Wenn er aktiviert ist, über i2cdetect aus dem i2c-tool nachsehen ob bzw. auf welcher Adresse das Display verbunden ist.
Viele Grüße
Wolfgang
Hey Ho!
Schicke Sache das!
Eines fehlt mir hier noch, also quasi als eine kleine Verbesserung des Ganzen!
Es wäre doch klasse wenn die Daten in einer CSV bzw SQL Datei gespeichert werden würden um sie so für eine Auswertung nutzen zu können!
Hattest du sowas schon mal in Erwägung gezogen?
Viele Grüße bear
Hallo bear,
vielen Dank für Deinen Kommentar. Wenn Dich die Speicherung der Daten in einer SQL Datei zur Erweiterung interessiert, könnten meine Beiträge “SQLite 3 Datenbank mit Python erstellen und auslesen” und SQLite 3 Datenbank mit PHP auslesen hilfreich sein.
Viele Grüße
Wolfgang
Hallo,
erstmal großes Lob an das übersichtliche Tutorial. Aber irgendetwas mache ich falsch:
Das Modul Adafruit_SSD1306 konnte ich so nicht einbinden. Erst nachdem ich es zu Adafruit_Python_SSD130 geändert habe, ging es. Das Selbe bei Adafruit_Python_DHT.
Allerdings meint er jetzt beim Kompilieren, dass das Modul gar kein entsprechendes Attribut habe.
disp = Adafruit_Python_SSD1306.SSD1306_128_64(rst=RST)
AttributeError: module ‘Adafruit_Python_SSD1306’ has no attribute ‘SSD1306_128_64’
Im installierten Modul ist es aber sehr wohl vorhanden. (SSD1306.py … class SSD1306_128_64(SSD1306Base))
Wo liegt da das Häufchen?
LG Alex
Hallo Alex,
eine direkte Lösung fällt mir nicht ein. Habe mir nochmal die Bibliothek auf GitHub angesehen und an dieser hat sich nichts verändert? Das Programm habe ich für Python 2.7 geschrieben, ist die Bibliothek auch für diese Version installiert?
Viele Grüße
Wolfgang
Hy Wolfgang,
Cooles project. Funktioniert auch soweit, nach ein paar Anfangsschwierigkeiten 🙂
Verwende den DHT11.
Das einzige Problem welches ich mit dem Code habe istz in der Senorenabfrage.
Da bekomme ich jedesmal bei de Formatierung aus Zeile 64 das raus:
“TypeError: loat argument required, not NoneType”
….
Hallo Mario,
eine Diagnose über die Ferne ist nicht einfach. 🙂 Hast du in der Zeile 18 (dhtSensorTyp = 22 # Typ 22 (weiß) – Typ 11 (blau) den Wert auf 11 gesetzt?
Viele Grüße
Wolfgang
Hallo Wolfgang,
vielen Dank für deine unzähligen Beiträge. Sie haben mir beim Einstieg in die Himbeerwelt enorm geholfen.
Bis jetzt haben deine Beispiele einwandfrei funktioniert und waren auf Anhieb reproduzierbar auf meinem System. Klasse!
In diesem Beispiel jedoch schaffe ich eine Hürde jedoch nicht:
./display_wolfgang.py
Traceback (most recent call last):
File “./display_wolfgang.py”, line 114, in
font = ImageFont.truetype(“font/arial.ttf”, 12) # Schriftart, Schriftgröße
File “/usr/lib/python2.7/dist-packages/PIL/ImageFont.py”, line 240, in truetype
return FreeTypeFont(font, size, index, encoding)
File “/usr/lib/python2.7/dist-packages/PIL/ImageFont.py”, line 137, in __init__
self.font = core.getfont(font, size, index, encoding)
IOError: cannot open resource
Woran könnte das liegen?
Liebe Grüße (auch) Wolfgang
Hallo Wolfgang,
vielen Dank für Deinen Kommentar. Anhand der Fehlermeldung würde ich auf die fehlende Einbindung der Schriftdarstellungsdatei “arial.ttf” tippen.
Die Datei arial.ttf habe ich hier als arial.zip hochgeladen. Diese musst Du laut Beispiel in einem Verzeichnis “font” entpacken. Ohne diesen Schritt kannst Du auch die Zeilen 114-116 auskommentieren und dafür in 113 die Kommentierung entfernen. Danach wäre noch die Ausgabe in der while-Schleife (Zeile 137 font=font_c in font=font) anzupassen.
Hoffe ich konnte Dir helfen.
Viele Grüße
Wolfgang
Klasse Anleitung, hat mir sehr geholfen!! Ich habe vieles davon auf meiner Robotik-Bastel-Website gezeigt/erwähnt: https://direcs.de
Hallo Markus,
vielen Dank für Deinen Kommentar und die Verlinkung auf Deinen Blog mit sehr interessanten Beiträgen.
Viele Grüße
Wolfgang
geht einfach nicht mehr… grrrr
Traceback (most recent call last):
File “cube.py”, line 16, in
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_bus=1)
File “build/bdist.linux-armv6l/egg/Adafruit_SSD1306/SSD1306.py”, line 240, in __init__
File “build/bdist.linux-armv6l/egg/Adafruit_SSD1306/SSD1306.py”, line 85, in __init__
File “build/bdist.linux-armv6l/egg/Adafruit_GPIO/GPIO.py”, line 426, in get_platform_gpio
RuntimeError: Could not determine platform.
Hallo Stevo,
die Aussage “geht einfach nicht mehr” lässt darauf schließen, es hat bei dir schon einmal funktioniert. Daher die Frage, welche Änderungen hast du in der Zwischenzeit vorgenommen?
Wenn es bei die noch nicht funktioniert hat, würde ich an deiner Stelle zuerst testen ob die Aktivierung der I2C Schnittstelle geklappt hat.
Viele Grüße
Wolfgang
Hallo Wolfgang,
entschuldige, dass ich mich nochmal melde – ich war 35 Jahre lang Lehrer (déformation professionnelle?!). In dem besagten Abschnitt sollte es
3 (SDA) und 5 (SCL)
heissen, ich denke nur an evtl. etwas unerfahrenere Leser deines sehr interessanten Beitrags, der mir sehr geholfen hat.
Viele Grüße
Werner
Hallo Werner,
vielen Dank für die Rückmeldung und den sachlichen Hinweis. Bei der ersten Korrektur hatte ich anscheinend nur halbherzig korrigiert, der Fehler dürfte jetzt behoben sein.
Viele Grüße
Wolfgang
Hallo,
ich denke, dass in dem Textabschnitt
“Das Display wird neben dem Anschluss zur Spannungsversorgung an 3,3 Volt (Pin 1) und Ground (ein GND z.B. Pin 6, 9, 14 usw.) an die I2C Schnittstelle des Raspberry Pi angeschlossen. Diese befindet sich an Pin 3 (SCL) und 5 (SDA) der GPIO-Leiste des RasPi.”
in der letzten Zeile SCL und SDA vertauscht wurden.
Viele Grüße
Werner
Hallo Werner,
vielen Dank für den richtigen Hinweis. Den Beitrag habe ich entsprechend abgeändert.
Viele Grüße
Wolfgang
/etc/config.txt sollte glaube ich /boot/config.txt heißen
Hallo Steven,
vielen Dank für die Rückmeldung. Die Konfigurationsdatei ist richtigerweise in /boot/config.txt zu finden, den Beitrag habe ich entsprechend korrigiert.
Viele Grüße
Wolfgang
Moin! Habe das mal probiert und bekomme folgenden Fehler:
File “test.py”, line 46
ermittelteZeit = systemUhrzeit + ” ” + systemDatum
^
IndentationError: expected an indented block
Hallo Sebastian,
vielen Dank für die Rückmeldung. Bei dem Einfügen des Programmcodes ist leider die notwendige Formatierung verschwunden. Ich habe den Programmcode in der if bzw. elif und else Abfrage durch einrücken ausgebessert.
Viele Grüße
Wolfgang
Der Anschluss des DHT22 geht bestimmt auch mit weniger Kabeln
Hallo,
wie auf dem Schaubild zu sehen benötigt man zum Anschluss des DHT Sensors 3 Kabel. Die Überfrachtung der auf dem Beitragsbild zu sehenden Steckplatinen gehören zu einem anderen Aufbau… 🙂
Du legst meiner Meinung nach zu viele Kabel für den DHT22
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.
Neuste Beiträge
Kleinen Spickzettel für Raspbian OS Befehle
Entdecke die Welt von Webnist.de
Erfahre mehr über die Hintergründe meines Blogs und wie ich dich bei deinen digitalen Projekten unterstützen kann.Kategorien
KATEGORIEN
Aktuelles Video auf YouTube
Beschreibung der Verwendung eines TTP223B Touch Sensors am GPIO Port des Raspberry Pi mit Python.
Die aktuell 6 derzeit meistbesuchten Beiträge
Beiträge mit den meisten Kommentaren
Funktional Immer aktiv
Vorlieben
Statistiken
Marketing