OLED displej je zobrazovací prvek, který umožňuje tisknout různé údaje z Arduina. Tento model má velikost 0,91 palce, která je ale dostačující pro menší množství informací. Rozlišení tohoto displeje je 128 x 32 pixelů a o řízení celého displeje se stará obvod SSD1306, který komunikuje po rozhraní I2C. Tento typ může mít bílé nebo modré podsvícení a pro jeho napájení lze použít napětí v rozsahu 3,3 až 5 Voltů. Co se týká proudového odběru, tak výhodou OLED displeje je to, že spotřeba se zvyšuje s počtem rozsvícených bodů, a maximální odběr se pohybuje okolo 20 až 30 mA při napájení 5 Volty. Rozměry tohoto modulu jsou 38 x 12 mm.
Pro úspěšné propojení OLED displeje s Arduinem stačí propojit celkem čtyři vodiče. Propojíme SDA s pinem A4, SCL s pinem A5, VCC s 3,3 nebo 5 V Arduina a GND se zemí Arduina. Jak již bylo zmíněno, komunikace mezi Arduinem a OLED displejem probíhá po sběrnici I2C, takže je nutné využít pro datové piny SCL a SDA odpovídající I2C piny na Arduino desce.
Pro správné přeložení a nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu U8Glib_OLED, návod jak na to je uveden zde. Ukázkový kód obsahuje na začátku připojení potřebné knihovny a inicializaci displeje z této knihovny. Poté je vytvořena proměnná pro uchování času poslední obnovy displeje a dvě pomocné proměnné pro výpis zprávy na displej. V podprogramu setup se nachází v komentáři pouze volitelná funkce pro otočení displeje o 180 stupňů. V nekonečné smyčce loop si jako první vytvoříme proměnnou typu String, do které uložíme celou zprávu. V tomto případě obsahuje zpráva odkaz na tento web a také měnící se informaci ve formě času od spuštění Arduina. Následuje kontrolní podmínka, která ovládá přepis celého displeje. Přepis tedy nastává vždy, když čas posledního přepsání je větší jak 100 ms od aktuálního času. Pokud bychom chtěli přepisovat obsah na displeji rychleji nebo naopak pomaleji, stačí změnit tuto hodnotu. V případě, že je podmínka splněna, je zavolán podprogram vykresliText, který obsahuje veškeré tisknutí na displej. Tento podprogram také obsahuje dva vstupní parametry – pozice a zpráva. Pozice se mění po každém výpisu na displej a její výpočet také souvisí se směrem. Na začátku máme směr vlevo, kdy s každým výpisem zvětšíme pozici o jedničku. Toto zvětšování se děje do té doby, kdy jsme na pozici 15 znaků před koncem zprávy, přičemž 15 znaků jsem určil podle velikosti zvoleného písma. Chtěl jsem totiž dosáhnout toho efektu, že celá zpráva se posunuje neustále zleva doprava a nazpět a je tedy poměrně dobře čitelná v celé své délce. Poté co narazíme na konec, otočíme směr a pozici naopak s každým výtiskem zmenšujeme, až se dostaneme na pozici nula, kde změní směr a celý pohyb se opakuje. Po této hlavní if podmínce je naznačeno v programu místo na umístění dalších příkazů a na konci je pouze volitelná pauza 10 ms. Podprogram vykresliText obsahuje nastavení písma s odkazem na všechny podporovaná písma a následně nastavení počáteční pozice tisku v souřadnicích X,Y. Poté si vytvoříme pomocnou proměnnou typu String a uložíme do ní 15 znaků od zadané pozice. Opět připomínám, že 15 znaků je zvoleno pro tento typ písma, pro menší písmo by bylo potřeba uložit znaků více a naopak. Na konci podprogramu se nachází už pouze příkaz print, který provede tisk zadaného textu na displej.
// OLED displej přes I2C 128x32 znaků // řadič SSD1306 // připojení knihovny U8glib #include "U8glib.h" // inicializace OLED displeje z knihovny U8glib U8GLIB_SSD1306_128X32 mujOled(U8G_I2C_OPT_NONE); // proměnná pro uchování času poslední obnovy displeje long int prepis = 0; // proměnná pro uložení aktuální pozice a směru výpisu zprávy int pozice = 0; bool smer = 1; void setup(void) { // pro otočení displeje o 180 stupňů // stačí odkomentovat řádek níže // mujOled.setRot180(); } void loop(void) { // vytvoření proměnné s celou zprávou, která se bude vypisovat String zprava = " Navody.dratek.cz"; zprava += ", cas od spusteni "; zprava += millis()/1000; zprava += " vterin. "; // porovnání uloženého a aktuálního času // při rozdílu větším než 100 ms se provede // přepis displeje, zde je to rychlost posunu zprávy if (millis()-prepis > 100) { // následující skupina příkazů // obnoví obsah OLED displeje mujOled.firstPage(); do { // vykreslení zadané zprávy od zadané pozice vykresliText(pozice, zprava); } while( mujOled.nextPage() ); // uložení posledního času obnovení prepis = millis(); // řízení směru výpisu - jako první je směr vlevo if (smer) { // s každou iterací přičteme jedničku pozice += 1; // pokud jsme na pozici posledního znaku zprávy // mínus 15 znaků (záleží na písmu), tak // změníme směr výpisu if (pozice>zprava.length()-15) { smer = 0; } } // zde je směr vpravo else { // s každou iterací odečteme jedničku pozice -= 1; // po dopočítání na pozici 0 otočíme směr if (pozice == 0) { smer = 1; } } } // zde je místo pro další příkazy pro Arduino // volitelná pauza 10 ms pro demonstraci // vykonání dalších příkazů delay(10); } // funkce vykresliText pro výpis textu na OLED od zadané pozice void vykresliText(int posun, String text) { // nastavení písma, další písma zde: // https://github.com/olikraus/u8glib/wiki/fontsize mujOled.setFont(u8g_font_fub14); // nastavení výpisu od souřadnic x=0, y=25; y záleží na velikosti písma mujOled.setPrintPos(0, 25); // uložení části zprávy - od znaku posun uložíme 15 znaků // např. na začátku uložíme znaky 0 až 15 String vypis; vypis = text.substring(posun, posun+15); // výpis uložené části zprávy na OLED displej mujOled.print(vypis); }
Po nahrání programu do Arduino desky s připojeným OLED displejem dostaneme například tento výsledek:
OLED displej je zajímavým výstupním modulem pro Arduino, který lze využít v nejrůznějších aplikacích. Lze ho například použít jako displej pro různá nastavení, zobrazení menu či třeba při tvorbě vlastního Arduino telefonu. Mezi výhody patří hlavně velmi nízká spotřeba, která závisí na počtu svítících pixelů či velmi dobrý kontrast i na přímém světle.
Seznam použitých komponent:
http://dratek.cz/arduino/1511-original-arduino-uno-rev3-1485165418.html