In diesem Artikel beschreibe ich, wie man das Display ansteuern kann und z.B. zur Anzeige von Datum, Uhrzeit und Temperatur (http://sebastianhemel.blogspot.de/2015/01/temperatursensor-ds18b20-raspberry-pi.html) verwenden kann.
Das 128 x 64 Pixel - 0,96 Zoll OLED I2C Display gibt es bei Amazon für ca. 7 EUR. Die Kabel vom Display zum Pi habe ich nicht gelötet, sondern nur gesteckt. Hierfür habe ich Jumperkabel verwendet und diese über Listerklemmen verbunden. Alternativ kann man dies auch über ein Laborsteckboard realisieren.
Folgender Aufbau ergibt sich inklusive Verwendung des Temperatursensor DS18B20, siehe auch folgende Grafik inkl. der korrekten Zuordnung für die Verkabelung:
Das Display wird zur Spannungsversorgung an 3,3 Volt (Pin 1) und Ground (ein GND z.B. Pin 6, 9, 14 usw.) und an die I2C Schnittstelle des Raspberry Pi angeschlossen. Für I2C muss man Pin 3 (SDA) und 5 (SCL) verwenden.
I2C Schnittstelle im Raspbian Betriebssystem einschalten:
Hinweis: Ich verwende den vi als Texteditor, man gerne auch z.B. den Nano verwenden.sudo vi /etc/modules
Und die folgenden 2 Zeilen hinzufügen (zusätzlich zu denen vom Temperatursensor):
w1-gpio
w1-therm
i2c-bcm2708
i2c-dev
Jetzt muss noch die Konfigurationsdatei angepasst werden:
sudo vi /boot/config.txt
dtparam=i2c_arm=on #entfernen
dtparam=i2s=on #entfernen
Jetzt muss noch ein reboot erfolgen, damit die Einstellungen übernommen werden:
sudo reboot
Damit man jetzt die Verbindung testen kann, sollte noch das folgemde Packet installiert werden:
sudo apt-get install i2c-tools
Mit dem folgenden Befehl kann überprüft werden, ob die Verbindung zum Display funktioniert bzw. verbunden ist:
i2cdetect -y 1
Hinweis: Mit dem Befehl i2cdect werden alle 256 Adressen abgefragt: Antwortet ein Chip, sieht man seine Adresse auf dem Raster.
Achtung: DEPRECATED LIBRARY!!!
Installation der SSD1306 Bibliothek für Python
Damit der SSD1306 Displaycontroller angesprochen werden kann, muss noch die folgende Bibliothek installiert werden.
https://github.com/adafruit/Adafruit_Python_SSD1306
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git
Noch kein Git installiert? Dann muss noch der folgende Befehl ausgeführt werden:
sudo apt-get install git-core
Update 18.07.2021: Es kommt bei der Ausführung mit Python 2 zu der folgenden Fehlermeldung:
File
"/tmp/easy_install-hLJK_s/Adafruit_PureIO-1.1.9/temp/easy_install-y2sFHG/setuptools_scm-6.0.1/src/setuptools_scm/utils.py",
line 41
print(*k)
^
SyntaxError: invalid syntax
Jetzt in das soeben angelegte Git Verzeichnis gehen und per setup.py installieren:
~/Adafruit_Python_SSD1306 $ sudo python3 setup.py install~/Adafruit_Python_SSD1306 $ sudo python setup.py install
Sollte es zu den folgenden Fehlermeldung kommen:
error: Setup script exited with error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
Muss noch der folgende Befehl ausgeführt werden:
sudo apt-get install python-dev
Sollte es zu den folgenden Fehlermeldung kommen:
ImportError: No module named setuptools
Muss noch der folgende Befehl ausgeführt werden:
sudo apt-get install python3-setuptoolssudo apt-get install python-setuptools
Sollte es zu den folgenden Fehlermeldung kommen:
ModuleNotFoundError: No module named 'ensurepip'
sudo apt-get install python3-pip
Anschließend muss noch das RPi.GPIO Package für python installiert werden:
sudo pip3 install RPi.GPIOoder
Manueller Download unter https://archive.raspberrypi.org/debian/pool/main/r/rpi.gpio/:
wget https://archive.raspberrypi.org/debian/pool/main/r/rpi.gpio/python-rpi.gpio_0.6.3~jessie-1_armhf.debdpkg -i python-rpi.gpio_0.3.1a-1_armhf.deb
Folgende (python) Module müssen noch installiert werden:
sudo apt-get install libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk
sudo pip3 install --upgrade pip
Sollte es zu den folgenden Fehlermeldung kommen:
ModuleNotFoundError: No module named 'PIL'
sudo pip3 install Pillow (PIL ist die Python Imaging Library)
sudo pip install Pillow
Sollte es zu den folgenden Fehlermeldung kommen:
ImportError: libopenjp2.so.7: cannot open shared object file: No such file or directory
sudo apt-get install libopenjp2-7-dev
Sollte es zu den folgenden Fehlermeldung kommen:
ImportError: libtiff.so.5: cannot open shared object file: No such file or directory
sudo apt-get install libtiff5
Jetzt kann es endlich losgehen, ich habe noch eine andere Schriftart verwendet. Weitere gibt es auch hier: https://www.dafont.com/bitmap.php
wget http://www.shemel.de/download/raspberry/arial.ttf
Mit der folgenden python Datei, kann das Display getestet werden:
wget http://www.shemel.de/download/raspberry/OLEDdisplayTemp.pychmod +x OLEDdisplayTemp.py
python3 OLEDdisplayTemp.py
(Quelle: https://learn.adafruit.com/ssd1306-oled-displays-with-raspberry-pi-and-beaglebone-black/usage)
Damit das Script direkt beim Starten des Pi ausgeführt wird, kann man jetzt noch einen Eintrag unter crontab -e hinzufügen:
@reboot python3 OLEDdisplayTemp.py
Quellcode:
#!/usr/bin/python3
# coding=utf-8
# Temperatur von Sensor auslesen auf OLED Display anzeigen
# (c) Sebastian Hemel, www.shemel.de
#-----------------------------------------------------------------------------------
import time
import datetime
import re
import os, sys, threading
# 0,96 Zoll OLED Display 128x64 Pixel
import Adafruit_SSD1306
from PIL import Image, ImageDraw, ImageFont
a=u"°" # damit Sonderzeichen korrekt dargestellt wird
#Quelle: http://www.schnatterente.net/code/raspberrypi/temperature.py
############################################################################################
# Temperatursensor Name ermitteln
SensorPfad = "/sys/bus/w1/devices/" # Pfad
SensorNames = open("/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves" ,"r")
Sensor = SensorNames.readline()
if Sensor:
SensorNames.close()
# Temperatur ermitteln und Wert value zurckgeben
def GetTemp():
a = open(SensorPfad+Sensor.strip()+'/w1_slave', 'r') # Ermittelten Sensor lesen
Temp = a.readline()
if re.match(r"([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES", Temp): # Erste Zeile auf "YES" am Ende uberprufen
Temp = a.readline()
m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", Temp) # Wert aus zweiter Zeile prufen
if m:
value = str(float(m.group(2)) / 1000.0) # Wert nach t= auslesen und umwandeln
a.close()
return value # Ruckgabewert "value" definieren
# Temperatur zurueckgeben
############################################################################################
# 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() #
# Alternatively load a TTF font. => https://www.dafont.com/bitmap.php
font12 = ImageFont.truetype("font/arial.ttf", 12) # Schriftart, Schriftgröße
font20 = ImageFont.truetype("font/arial.ttf", 20)
font15 = ImageFont.truetype("font/arial.ttf", 14)
# Write two lines of text.
draw.text((x, top+15), ' (c) Sebastian Hemel', font=font12, fill=255)
draw.text((x, top+30), ' www.shemel.de ', font=font12, fill=255)
# Display image.
disp.image(image)
disp.display()
time.sleep(5) # 5sec warten, damit Sensor ausgelesen werden kann
while True: # endlos Schleife
try: # Fehler abfangen?
now=datetime.datetime.now()
Zeit = now.strftime("%d.%m.%Y - %H:%M:%S") # Aktuelles Datum + Uhrzeit
Temp = GetTemp() # Temperatur messen....
draw.rectangle((0,0,width,height), outline=0, fill=0) #clear Display
draw.text((x, top), Zeit, font=font12, fill=255)
draw.text((x, top+15), '-------------------------------', font=font12, fill=255)
draw.text((x, top+30), Temp+' '+a+'C', font=font20, fill=255)
disp.image(image)
disp.display()
time.sleep(5) # 5sec warten, bis Sensor erneut abgefragt wird
except KeyboardInterrupt: # STR+C = Abbruch
draw.rectangle((0,0,width,height), outline=0, fill=0) #clear Display
disp.image(image)
disp.display()
Hallo,
AntwortenLöschenvielen Dank für den Blog-Beitrag auf
https://sebastianhemel.blogspot.com/2018/05/raspberry-pi-oled-display-ssd1306-i2c.html
, welcher mir geholfen hat mit meinem Raspi ein I2C-OLED-Display anzusteuern.
Cool fand ich auch die Info bzgl. Strg+C und des Abfangens des Fehlers mit try...except - kannte ich als Python-Anfänger noch nicht.
Aber genau dazu habe ich noch eine Anmerkung:
Bei mir funktionierte zwar das Abfangen der Exception, jedoch war ich sofort wieder in der Endlosschleife.
Abhilfe schaffte die Änderung von
while True:
try:
....
except KeyboardInterrupt:
....
zu
try:
while True:
....
except KeyboardInterrupt:
....
wodurch ich nach Strg+C auch aus der Endlosschleife draussen war.