V rámci série článků o Raspberry Pi si dnes vyzkoušíme ovládat displej. A jako svůj oblíbený displej jsem vybral OLED 0,96 palce, který má rozlišení 128x64 pixelů a pracuje s řadičem SSD1306. Tento displej používá ke komunikaci sběrnici I2C a umožňuje napájení jak 5V, tak i 3,3V, díky čemu ho můžeme s Raspberry propojit napřímo bez převodníku. Pokud se chcete o displeji dozvědět více, zde je starší Arduino návod.

 Raspberry Pi: I2C OLED displej SSD1306

Pro zapojení podobně jako v minulém návodu potřebujeme čtyři propojovací vodiče. Ty postupně zapojíme na piny podle obrázku níže, kdy zleva vidíme pin pro napájení 3,3 Voltu zapojený na pin 1, GND na pin 9, I2C pin SCL na pin 3 a SDA pin připojený na pin 5.

Raspberry Pi: I2C OLED displej SSD1306

Pokud jste ještě nepracovali s I2C moduly na Raspberry, podívejte se do minulého návodu, kde se dozvíte, jak zapnout podporu I2C. Pokud již tuto podporu máte zapnutou, můžete otevřít Terminál a otestovat pomocí příkazu „i2cdetect -y 1“, jestli je displej správně detekován. Pokud ano, uvidíte adresu 0x3c jako na obrázku níže.

Raspberry Pi: I2C OLED displej SSD1306

A nyní se můžeme přesunout na stažení a instalaci knihovny pro práci s OLED displeji s řadičem SSD1306. Otevřete Terminál a postupujte následovně.
Prvním příkazem zkontrolujeme, že máme k dispozici všechny potřebné programy, které se případně doinstalují.

sudo apt-get install -y python-imaging python-smbus i2c-tools

V dalším kroku si stáhneme z GIT repozitáře knihovnu SSD1306, která je od firmy Adafruit.

git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git

Po úspěšném stažení knihovny se prvním příkazem přesuneme do stažené složky s knihovnou. Druhý příkaz pak slouží ke spuštění skriptu, který provede instalaci knihovny a my pak budeme moci volat skripty z libovolného místa.

cd Adafruit_Python_SSD1306
sudo python setup.py install

Pokud jste předchozí kroky provedli bez problémů, měli byste mít vše potřebné nastaveno. Můžeme se tedy přesunout do složky s příklady a rovnou jeden z nich spustit. Pro začátek si můžete zkusit skript „shapes.py“, který na displeji vykreslí několik tvarů a text „Hello World“.

cd examples
python shapes.py

Po vykreslení si ale můžete všimnout, že text je lehce zdeformovaný. Všechny skripty s příklady jsou totiž nastaveny pro zobrazení na displej, který má rozlišení 128x32 pixelů. Pro změnu si můžete otevřít příklad pomocí příkazu „idle shapes.py“. Zde na řádku 46 zakomentujte pomocí znaku # příkaz obsahující text „128_32“ a odkomentujte řádek 49 s textem „128_64“.
Po úpravě pak můžete pomocí tlačítka F5 spustit upravený skript a pozorovat změnu na displeji.

Raspberry Pi: I2C OLED displej SSD1306

Pro lepší přehled, jak se pracuje s OLED displejem, jsem upravil program stats.py, který si můžete zkopírovat níže.
Jak si můžete všimnout, na začátku programu je uvedeno připojení knihoven a nastavení displeje s rozlišením 128x64 pixelů. Poté zahájíme komunikaci s displejem a vyčistíme obrazovku. Pro následné zjednodušení práce s displejem si pomocí uvedených příkazů připravíme „mazací“ objekt a načteme základní písmo, které bude použito pro výpisy. V komentáři je také uveden způsob, jak použít jiná písma.
Smyčka „while True“ obsahuje na začátku vykreslení černého obdélníka pro vymazání obsahu displeje, po kterém následují příkazy pro načtení dat. Pomocí Shell příkazů se tedy načtou postupně informace o IP adrese, zatížení CPU, operační paměti RAM a paměťovém uložišti. Tyto údaje jsou následně pomocí příkazu „draw.text()“ připraveny k vytištění, přičemž pro ukázku jsem přidal na další řádek také vlastní text. Pro samotný výpis na displej pak slouží příkazy v dalším bloku textu a na konci smyčky je už jen krátká pauza po dobu 100 milisekund.

# OLED Displej SSD1306

# pripojeni knihoven
import time
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import subprocess

# Nastaveni displeje 128x64 s hardware I2C sbernici
disp = Adafruit_SSD1306.SSD1306_128_64(rst=None)

# Zahajeni komunikace s displejem
disp.begin()

# Vycisteni displeje
disp.clear()
disp.display()

# Vytvoreni prazdneho obrazce pro vymazani displeje
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Vytvoreni objektu pro kresleni
draw = ImageDraw.Draw(image)

# Vykresleni cerneho obdelnika pro vymazani obsahu displeje
draw.rectangle((0,0,width,height), outline=0, fill=0)

# Konstanty pro jednoduche kresleni
padding = -2
top = padding
bottom = height-padding
x = 0

# Nacteni zakladniho pisma
font = ImageFont.load_default()

# Muzeme pouzit take jine fonty, napriklad z:
# http://www.dafont.com/bitmap.php
# Pote staci umistit font do stejne slozky a nastavit:
# font = ImageFont.truetype('RetroComputer.ttf', 8)

while True:

    # Vykresleni cerneho obdelnika pro vymazani obrazovky
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # Skripty pro nacteni informaci o systemu, zdroj:
    # https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
    cmd = "hostname -I | cut -d\' \' -f1"
    IP = subprocess.check_output(cmd, shell = True )
    cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
    CPU = subprocess.check_output(cmd, shell = True )
    cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
    MemUsage = subprocess.check_output(cmd, shell = True )
    cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
    Disk = subprocess.check_output(cmd, shell = True )

    # Vypsani nactenych udaju na souradnice x, top s danym fontem a barvou (fill)

    draw.text((x, top),       "IP: " + str(IP),  font=font, fill=255)
    draw.text((x, top+8),     str(CPU), font=font, fill=255)
    draw.text((x, top+16),    str(MemUsage),  font=font, fill=255)
    draw.text((x, top+25),    str(Disk),  font=font, fill=255)
    # Vypsani naseho textu
    draw.text((x, top+32),    str("Arduino navody"),  font=font, fill=127)

    # Zobrazeni na displej
    disp.image(image)
    disp.display()
    # Kratka pauza 100 ms
    time.sleep(.1)

Nyní můžeme přejít ke spuštění. To můžete udělat buď pomocí tlačítka F5 nebo zavoláním příkazu v nabídce „Run-Run Module“. Poté můžete vidět v konzoli Python Shell informaci o restartu skriptu, s kterou se začnou aktualizovat údaje na displeji. A pro přerušení práce skriptu stačí stisknout klávesovou zkratku Ctrl+C.

Raspberry Pi: I2C OLED displej SSD1306

Dnes jsme si ukázali, jak je jednoduché zapojit OLED I2C displej k Raspberry Pi a vykreslovat na něj různé údaje. V prvním příkladu jsme si zkusili vykreslit pár obrazců, přičemž v druhém příkladu už to byly údaje o běhu Raspberry Pi. Právě druhý příklad mi přijde velice zajímavý, kdy si můžeme vytvořit malý stavový displej, díky kterému můžeme následně pozorovat například teplotu a vlhkost v okolí Raspberry Pi, ale také jeho zatížení, volnou paměť a podobně.


Zmíněné Raspberry Pi desky na eshopu:

Raspberry Pi 3 B:
https://dratek.cz/arduino/1385-raspberry-pi-3-model-b-quad-core-1-2-ghz-64bit-cpu-1gb-ram-wifi-bluetooth-4-1-1473147122.html

Raspberry Pi 3 B+:
https://dratek.cz/arduino/3067-raspberry-pi-3-model-b-64-bit-1gb-ram.html

Raspberry Pi Zero:
https://dratek.cz/arduino/3106-raspberry-pi-zero-h.html

FB tw

Další podobné články