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.
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.
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.
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.
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.
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