Skip to content

U8g2lib – podrobný Markdown dokument s komentáři ​

Popis ​

U8g2lib je grafická knihovna pro mikrokontrolery, která slouží k ovládání různých displejů, například:

  • OLED
  • LCD
  • e-paper
  • další malé grafické displeje

Používá se hlavně v embedded projektech pro:

  • výpis textu
  • kreslení jednoduché grafiky
  • tvorbu menu
  • zobrazení hodnot ze senzorů
  • stavové obrazovky zařízení

Knihovna podporuje různé komunikační sběrnice, nejčastěji:

  • I2C
  • SPI

Velká výhoda U8g2 je, že obsahuje:

  • hodně fontů
  • funkce pro kreslení textu i grafiky
  • podporu mnoha typů displejů
  • jednoduché použití v Arduino projektech

Princip fungování ​

U8g2 ve variantě F pracuje s framebufferem.

To znamená:

  1. nejdřív kreslíš do paměti RAM
  2. změny ještě nejsou vidět na displeji
  3. až funkcí sendBuffer() se celý obsah odešle na displej

Typický postup:

cpp
u8g2.clearBuffer();
u8g2.drawStr(0, 12, "Ahoj");
u8g2.sendBuffer();

Význam ​

  • clearBuffer() → smaže interní obraz v RAM
  • draw...() → kreslí objekty do RAM
  • sendBuffer() → přenese obraz na displej

Bez sendBuffer() se nic nezobrazí.


Instalace a include ​

Nejčastější include:

cpp
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

Význam jednotlivých knihoven ​

  • Arduino.h → základní Arduino funkce
  • Wire.h → I2C komunikace
  • U8g2lib.h → samotná knihovna U8g2

Vytvoření objektu displeje ​

Příklad pro SH1106 128×64 přes hardwarové I2C:

cpp
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

Rozbor názvu ​

  • U8G2 → knihovna
  • SH1106 → použitý řadič displeje
  • 128X64 → rozlišení
  • NONAME → typ modulu
  • _F_ → full framebuffer
  • HW_I2C → hardwarové I2C
  • U8G2_R0 → žádné otočení displeje

Rotace displeje ​

Možnosti otočení:

cpp
U8G2_R0
U8G2_R1
U8G2_R2
U8G2_R3

Význam ​

  • U8G2_R0 → normální orientace
  • U8G2_R1 → otočení o 90°
  • U8G2_R2 → otočení o 180°
  • U8G2_R3 → otočení o 270°

Příklad:

cpp
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2);

Základní inicializace ​

cpp
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
    u8g2.begin();
}

void loop() {
}

Komentář ​

  • u8g2.begin(); spustí komunikaci s displejem a připraví knihovnu k použití
  • po begin() už lze kreslit text i grafiku

Souřadnicový systém ​

U8g2 používá běžný grafický souřadnicový systém:

  • (0,0) = levý horní roh
  • osa x roste doprava
  • osa y roste dolů

U displeje 128×64 platí:

  • šířka: 0 až 127
  • výška: 0 až 63

Příklad:

  • (0,0) → levý horní roh
  • (64,32) → přibližný střed displeje

Základní funkce ​

1. Vymazání bufferu ​

cpp
u8g2.clearBuffer();

Komentář ​

Vymaže interní framebuffer v RAM.
Používá se před novým vykreslením obrazovky, aby se starý obsah nesmíchal s novým.

Typické použití ​

cpp
u8g2.clearBuffer();

2. Odeslání bufferu na displej ​

cpp
u8g2.sendBuffer();

Komentář ​

Pošle celý framebuffer na displej.
Bez této funkce se nově nakreslený obsah nezobrazí.

Typické použití ​

cpp
u8g2.sendBuffer();

3. Nastavení fontu ​

cpp
u8g2.setFont(u8g2_font_ncenB08_tr);

Komentář ​

Nastaví font, kterým se bude vykreslovat text.

Důležité ​

V U8g2 se velikost textu obvykle nemění číslem jako u Adafruit GFX, ale výběrem jiného fontu.

Příklady fontů ​

cpp
u8g2.setFont(u8g2_font_ncenB08_tr);     // menší font
u8g2.setFont(u8g2_font_ncenB14_tr);     // větší font
u8g2.setFont(u8g2_font_logisoso32_tr);  // velmi velký font

4. Výpis textu ​

cpp
u8g2.drawStr(x, y, "Text");

Komentář ​

Vykreslí text na zadanou pozici.

Parametry ​

  • x → horizontální pozice
  • y → vertikální pozice
  • "Text" → řetězec, který se zobrazí

Poznámka ​

U textu je y souřadnice baseline, tedy základní linky textu, ne horního okraje písmen.

Příklad ​

cpp
u8g2.drawStr(0, 12, "Ahoj");

5. Pixel ​

cpp
u8g2.drawPixel(x, y);

Komentář ​

Vykreslí jeden bod na souřadnicích (x, y).

Příklad ​

cpp
u8g2.drawPixel(10, 10);

6. Čára ​

cpp
u8g2.drawLine(x1, y1, x2, y2);

Komentář ​

Vykreslí čáru mezi dvěma body.

Parametry ​

  • (x1, y1) → počáteční bod
  • (x2, y2) → koncový bod

Příklad ​

cpp
u8g2.drawLine(0, 0, 127, 63);

Poznámka ​

Čára je standardně 1 pixel tlustá.


7. Obdélník – obrys ​

cpp
u8g2.drawFrame(x, y, w, h);

Komentář ​

Vykreslí obdélník pouze jako obrys.

Parametry ​

  • x, y → levý horní roh
  • w → šířka
  • h → výška

Příklad ​

cpp
u8g2.drawFrame(0, 0, 128, 64);

8. Obdélník – výplň ​

cpp
u8g2.drawBox(x, y, w, h);

Komentář ​

Vykreslí vyplněný obdélník.

Příklad ​

cpp
u8g2.drawBox(10, 20, 50, 10);

Typické použití ​

  • progress bar
  • podbarvení
  • simulace tlusté čáry

9. Kružnice ​

cpp
u8g2.drawCircle(x, y, r);

Komentář ​

Vykreslí kružnici.

Parametry ​

  • x, y → střed kružnice
  • r → poloměr

Příklad ​

cpp
u8g2.drawCircle(64, 32, 10);

10. Vyplněná kružnice ​

cpp
u8g2.drawDisc(x, y, r);

Komentář ​

Vykreslí vyplněný kruh.

Příklad ​

cpp
u8g2.drawDisc(64, 32, 8);

11. Bitmapa ​

cpp
u8g2.drawXBMP(x, y, w, h, bitmap);

Komentář ​

Vykreslí bitmapový obrázek.

Parametry ​

  • x, y → pozice obrázku
  • w, h → rozměry obrázku
  • bitmap → pole dat obsahující bitmapu

Poznámka ​

Bitmapa bývá často uložená v PROGMEM.


Kompletní ukázka základních funkcí s komentáři ​

cpp
// Vymaže interní framebuffer (RAM), do kterého se kreslí
u8g2.clearBuffer();

// Nastaví font pro vykreslování textu
u8g2.setFont(u8g2_font_ncenB08_tr);

// Vykreslí text na pozici (x, y)
// POZOR: y je baseline textu
u8g2.drawStr(x, y, "Text");

// Vykreslí čáru mezi dvěma body
u8g2.drawLine(x1, y1, x2, y2);

// Vykreslí prázdný obdélník (jen obrys)
u8g2.drawFrame(x, y, w, h);

// Vykreslí vyplněný obdélník
u8g2.drawBox(x, y, w, h);

// Vykreslí kružnici se středem (x, y) a poloměrem r
u8g2.drawCircle(x, y, r);

// Vykreslí bitmapu
u8g2.drawXBMP(x, y, w, h, bitmap);

// Odešle obsah framebufferu na displej
u8g2.sendBuffer();

Změna velikosti textu ​

U8g2 nemá běžně funkci typu setTextSize().
Velikost textu se mění výběrem jiného fontu.

Příklad ​

cpp
u8g2.setFont(u8g2_font_ncenB08_tr);   // menší text
u8g2.setFont(u8g2_font_ncenB14_tr);   // větší text

Shrnutí ​

  • text se zvětšuje změnou fontu
  • ne číslem, ale volbou jiného fontu

Tloušťka čáry ​

U8g2 neumí standardní tloušťku čáry měnit přímo parametrem.
Běžná čára má tloušťku 1 pixel.

Jak udělat tlustší čáru ​

Varianta 1 – více čar pod sebou ​

cpp
u8g2.drawLine(0, 10, 50, 10);
u8g2.drawLine(0, 11, 50, 11);
u8g2.drawLine(0, 12, 50, 12);

Varianta 2 – použít obdélník ​

cpp
u8g2.drawBox(0, 10, 50, 3);

Komentář ​

Použití drawBox() je nejjednodušší způsob, jak vytvořit tlustou horizontální nebo vertikální čáru.


Příklady ​

1. Jednoduchý text ​

cpp
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
    u8g2.begin();
}

void loop() {
    u8g2.clearBuffer();                    // smaže starý obsah
    u8g2.setFont(u8g2_font_ncenB08_tr);   // nastaví font
    u8g2.drawStr(0, 12, "Ahoj");          // vykreslí text
    u8g2.sendBuffer();                    // odešle na displej
    delay(1000);
}

2. Text + rámeček + kružnice ​

cpp
void loop() {
    u8g2.clearBuffer();

    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.drawStr(5, 12, "SH1106 demo");

    u8g2.drawFrame(0, 0, 128, 64);     // rámeček přes celý displej
    u8g2.drawCircle(64, 32, 10);       // kružnice uprostřed

    u8g2.sendBuffer();
    delay(500);
}

Co to dělá ​

  • vypíše text
  • vykreslí obrys celé obrazovky
  • přidá kružnici do středu

3. Progress bar ​

cpp
void loop() {
    int progress = 70;

    u8g2.clearBuffer();

    u8g2.drawFrame(10, 25, 100, 10);   // obrys progress baru
    u8g2.drawBox(12, 27, progress, 6); // vyplněná část

    u8g2.sendBuffer();
    delay(500);
}

Komentář ​

  • drawFrame() kreslí okraj
  • drawBox() vyplní část podle hodnoty progress

4. Animace bodu ​

cpp
void loop() {
    for(int x = 0; x < 128; x++) {
        u8g2.clearBuffer();      // smaže předchozí snímek
        u8g2.drawPixel(x, 32);   // vykreslí bod uprostřed displeje
        u8g2.sendBuffer();       // zobrazí snímek
        delay(10);               // zpomalí animaci
    }
}

Co to dělá ​

Bod se pohybuje zleva doprava po středu displeje.

Důležité ​

Kdyby tam nebylo clearBuffer(), zůstávaly by staré body a vznikla by čára.


5. Tlustá čára pomocí drawBox ​

cpp
void loop() {
    u8g2.clearBuffer();

    u8g2.drawBox(10, 20, 80, 4);   // tlustá horizontální čára

    u8g2.sendBuffer();
    delay(500);
}

6. Více textů na obrazovce ​

cpp
void loop() {
    u8g2.clearBuffer();

    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(0, 12, "Teplota: 24 C");
    u8g2.drawStr(0, 26, "Vlhkost: 50 %");
    u8g2.drawStr(0, 40, "Stav: OK");

    u8g2.sendBuffer();
    delay(500);
}

Výhody U8g2 ​

  • velké množství fontů
  • jednoduché kreslení grafiky
  • podpora mnoha displejů
  • vhodné pro OLED a malé displeje
  • stabilní a rozšířená knihovna

Nevýhody U8g2 ​

  • varianta s framebufferem má vyšší nároky na RAM
  • u malých mikrokontrolerů může být RAM limitující
  • text se nemění funkcí setTextSize(), ale přes fonty

Typické použití ​

  • měřicí zařízení
  • menu v embedded systému
  • IoT displeje
  • výpis teploty, tlaku, napětí
  • stavové obrazovky
  • jednoduché uživatelské rozhraní

Časté chyby ​

1. Zapomenuté sendBuffer() ​

Obsah se nakreslí do RAM, ale na displej se neodešle.

2. Zapomenuté clearBuffer() ​

Nový obraz se může překreslovat přes starý.

3. Špatný typ displeje ​

Například záměna SH1106 a SSD1306.

4. Špatná I2C adresa ​

Nejčastější bývá:

  • 0x3C
  • někdy 0x3D

5. Špatně zvolený font ​

Text může být příliš velký nebo se nevejde na displej.


Mini tahák ​

  • u8g2.begin() → inicializace displeje
  • u8g2.clearBuffer() → smazání RAM bufferu
  • u8g2.setFont(...) → nastavení fontu
  • u8g2.drawStr(...) → text
  • u8g2.drawPixel(...) → bod
  • u8g2.drawLine(...) → čára
  • u8g2.drawFrame(...) → obrys obdélníku
  • u8g2.drawBox(...) → vyplněný obdélník
  • u8g2.drawCircle(...) → kružnice
  • u8g2.drawXBMP(...) → bitmapa
  • u8g2.sendBuffer() → zobrazení na displeji

Krátký vzorový program ​

cpp
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
    u8g2.begin();
}

void loop() {
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.drawStr(10, 20, "Ahoj svete");
    u8g2.drawFrame(0, 0, 128, 64);
    u8g2.sendBuffer();
    delay(1000);
}

Co dělá ​

  • inicializuje displej
  • smaže buffer
  • nastaví font
  • zobrazí text
  • vykreslí rámeček
  • pošle obraz na displej