Appearance
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á:
- nejdřív kreslíš do paměti RAM
- změny ještě nejsou vidět na displeji
- 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 RAMdraw...()→ kreslí objekty do RAMsendBuffer()→ 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 funkceWire.h→ I2C komunikaceU8g2lib.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→ knihovnaSH1106→ použitý řadič displeje128X64→ rozlišeníNONAME→ typ modulu_F_→ full framebufferHW_I2C→ hardwarové I2CU8G2_R0→ žádné otočení displeje
Rotace displeje
Možnosti otočení:
cpp
U8G2_R0
U8G2_R1
U8G2_R2
U8G2_R3Význam
U8G2_R0→ normální orientaceU8G2_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ý font4. Výpis textu
cpp
u8g2.drawStr(x, y, "Text");Komentář
Vykreslí text na zadanou pozici.
Parametry
x→ horizontální pozicey→ 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í rohw→ šířkah→ 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žnicer→ 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ázkuw, h→ rozměry obrázkubitmap→ 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ší textShrnutí
- 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í okrajdrawBox()vyplní část podle hodnotyprogress
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 displejeu8g2.clearBuffer()→ smazání RAM bufferuu8g2.setFont(...)→ nastavení fontuu8g2.drawStr(...)→ textu8g2.drawPixel(...)→ bodu8g2.drawLine(...)→ čárau8g2.drawFrame(...)→ obrys obdélníkuu8g2.drawBox(...)→ vyplněný obdélníku8g2.drawCircle(...)→ kružniceu8g2.drawXBMP(...)→ bitmapau8g2.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