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.

OLED I2C Displej 128x32

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.

Schéma zapojení OLED I2C Displeje 128x32

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:

Ukázka zapojení OLED I2C Displeje 128x32

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

http://dratek.cz/arduino/1480-iic-i2c-displej-oled-091-128x32-modry-33-v-5v-pro-iot-arduino-raspberry-1481056894.html

http://dratek.cz/arduino/1479-iic-i2c-displej-oled-091-128x32-bily-33-v-5v-pro-iot-arduino-raspbery-1481056113.html

FB tw

Další podobné články