Je kunt een Raspberry Pi voorzien van verschillende LCD schermen, dit kan handig zijn voor systeemmeldingen of voor het uitvoeren van acties. Je kunt je Raspberry Pi ook voorzien van een OLED display, deze heeft een zeer hoge contrast ratio en kan per pixel worden aangestuurd.
In dit stappenplan gaan we een mini OLED display (128×32 pixels) aansluiten de Raspberry Pi, waarbij we gebruik maken van enkele speciale Python libraries om het display aan te kunnen sturen via de I2C interface.
Gebruikte componenten
• 0.92-inch OLED I2C module display 128X32 pixels (3€)
• 8x Dupont verbindingskabel (female/female)
Raspberry Pi Zero, Raspberry Pi 2, Raspberry Pi 3
Raspbian Jessie (2016-11-25 kernel 4.4)
Aansluitschema OLED display
Je kunt de OLED display aansluiten op de Raspberry Pi volgens onderstaand schema. De pinnen op de OLED module kunnen verschillende labels hebben, bijvoorbeeld VDD of 3v3 in plaats van VIN. Let op dat de pin volgorde ook per gebruikte OLED module kan verschillen.
Raspberry Pi | I2C OLED Module |
---|---|
3.3V (PIN #1) | VCC |
SDA (PIN #3) | SDA |
SCL (PIN #5) | SCL |
GND (PIN #6) | GND |
I2C Activeren
Om tekst op het LCD scherm te krijgen gebruiken we een speciaal Python script dat de I2C interface aanstuurt. Om toegang te krijgen tot de interface dient deze in de Raspberry Pi geactiveerd te zijn. Je kunt deze activeren met behulp van raspi-config.
sudo raspi-config
Selecteer de optie ‘Advanced Options’ ▸ ‘I2C’ en kies ‘YES’ om de I2C interface te activeren.
Controleren werking I2C
Nadat de module is aangesloten op de I2C bus kun je controleren of deze ook daadwerkelijk wordt gedetecteerd. Dit kun je doen met de I2C tools, heb je deze niet geïnstalleerd dan kun je dit doen met behulp van:
sudo apt-get install i2c-tools
Controleer hierna of de module zichtbaar is:
sudo i2cdetect -y 1
De OLED module heeft als ID #03C. Mocht de module niet zichtbaar zijn controleer dan of de kabels goed zijn aangesloten.
Wordt er een andere waarde dan #03C weergeven, wijzig dan in het script de parameter I2C_ADDR
in de waarde die verschijnt in de i2cdetect tool.
Benodigde Python libraries installeren
Om te kunnen communiceren met de OLED module maken we gebruik van een speciale SSD1306 library geschreven door Adafruit.
Python GPIO library:
sudo apt-get install build-essential python-dev python-pip sudo pip install RPi.GPIO
Python Imaging library:
sudo apt-get install python-imaging python-smbus
Adafruit SSD1306 Python library:
sudo apt-get install git git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git cd Adafruit_Python_SSD1306; sudo python setup.py install
Werking testen
Nadat alles is aangesloten, geconfigureerd en geïnstalleerd kunnen we gaan testen of de OLED module werkt. Dit doen met het onderstaande test script.
import Adafruit_GPIO.SPI as SPI | |
import Adafruit_SSD1306 | |
from PIL import Image | |
from PIL import ImageDraw | |
from PIL import ImageFont | |
disp = Adafruit_SSD1306.SSD1306_128_32(rst=24) | |
disp.begin() | |
disp.clear() | |
disp.display() | |
image = Image.new('1', (disp.width, disp.height)) | |
draw = ImageDraw.Draw(image) | |
draw.rectangle((0,0,disp.width-1,disp.height-1), outline=1, fill=0) | |
font = ImageFont.load_default() | |
draw.text((16, 8),'RASPBERRYTIPS.NL', font=font, fill=255) | |
disp.image(image) | |
disp.display() |
Je kunt dit script downloaden met behulp van:
wget https://raspberrytips.nl/oledi2c128x32.py
Voer hierna het script uit:
python oled128x64test.py
Op scherm verschijnt nu een rechthoek met daarin de url van deze website, mocht dit niet verschijnen controleer dan de bekabeling, installatie van de benodigde libraries en of de I2C interface is geactiveerd.
Systeem informatie weergeven
Systeem informatie weergeven kan een toepassing zijn van het OLED scherm. Hiervoor hebben we het onderstaande script gemaakt, dit script toont op het scherm de CPU belasting en de temperatuur van de CPU. Omdat het standaard lettertype van de Python Imaging library niet super duidelijk is maken we gebruik van een schaalbaar TTF font.
import time | |
import sys | |
import subprocess | |
import Adafruit_GPIO.SPI as SPI | |
import Adafruit_SSD1306 | |
from PIL import Image | |
from PIL import ImageDraw | |
from PIL import ImageFont | |
from time import sleep | |
# commandline instructies om de gegevens op te vragen | |
GET_LOADAVG_CMD = "grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }'" | |
GET_TEMP_CMD = "/opt/vc/bin/vcgencmd measure_temp" | |
def run_cmd(cmd): | |
return subprocess.check_output(cmd, shell=True).decode('utf-8') | |
def write_load(): | |
load = float ( run_cmd(GET_LOADAVG_CMD)[:-1] ) | |
cpu = "CPU {:.2f}% \n".format(load) | |
draw.text((8, 7), cpu, font=font, fill=255) | |
def write_temp_mem(): | |
cputemp = "TEMP {} C".format( run_cmd(GET_TEMP_CMD)[5:9] ) | |
draw.text((8, 19), cputemp, font=font, fill=255) | |
disp = Adafruit_SSD1306.SSD1306_128_32(rst=24) | |
disp.begin() | |
disp.clear() | |
disp.display() | |
# Lege afbeelding voorbereiden | |
width = disp.width | |
height = disp.height | |
image = Image.new('1', (width, height)) | |
draw = ImageDraw.Draw(image) | |
# Apple 2 font moet in dezelfde map staan als het script | |
font = ImageFont.truetype('Apple2.ttf', 8) | |
# loop voor het weergeven van de informatie | |
while True: | |
draw.rectangle((0,0,width-1,height-1), outline=1, fill=0) | |
write_load() | |
write_temp_mem() | |
disp.image(image) | |
disp.display() | |
sleep(3) |
Je kunt het script en het lettertype downloaden met behulp van:
wget https://raspberrytips.nl/files/Apple2.ttf wget https://raspberrytips.nl/oledsystemdemo.py
Voer hierna het script uit:
python oledsystemdemo.py