OLED I2C Display SSD 1306
Treiber und Beispiel Program für Arduino
Treiber und Besipiel Program für Raspberry Pi
Aktivierung der I2C Schnittstelle
In der Grundkonfiguration des Raspberry Pi mi dem Raspbian 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
dtparam=i2c1=on
|
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.
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
|
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 2.7
# display.py
#————————————————————
# Einbindung der notwendigen Grundbibliotheken
import os, sys, time, threading
# Einbindung 0,96 Zoll OLED Display 128×64 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 128×64 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.
Die fritzing Projektdatei habe ich auch auf der Fritzing Projektseite veröffentlicht und steht dort zum Download bereit.