
La U8g2 è una libreria pensata per i dispositivi embedded. Essa supporta i display monocromatici OLEDs e LCDs. Include molti comandi per il tracciamento di figure 2D primitive (linea, cerchio e rettangolo), supporta molti font per la scrittura del testo, senza alcuna limitazione sull'altezza delle lettere ma, ovviamente, necessita di molta memoria a microcontrollore per gestire tali operazioni. Vediamola in dettaglio.
Introduzione
Come detto prima, si tratta di una potente libreria grafica per differenti modelli monocromatici di display OLEDs e LCDs. Oltre a prevedere svariati comandi grafici, essa prevede centinaia di fonts, con cui scrivere testi sul display. Al momento essa supporta i seguenti controller di display: SSD1305, SSD1306, SSD1309, SSD1322, SSD1325, SSD1327, SSD1329, SSD1606, SSD1607, SH1106, T6963, RA8835, LC7981, PCD8544, PCF8812, UC1604, UC1608, UC1610, UC1611, UC1701, ST7565, ST7567, ST7588, NT7534, IST3020, ST7920, LD7032, KS0108, SED1520, SBN1661, MAX7219.
Connessione del display
Per la connessione fisica del display occorre conoscere, innanzitutto, la sua risoluzione e il modello di controller che esso monta a bordo. Le tipologie di display sprovvisti di controller, purtroppo, non sono gestiti dalla libreria. Gli esempi di cablaggio che seguono sono relativi al display dalle misure di 128x64 pixel che monta il controller ST7920. Per utilizzare correttamente un display occorre inizializzarlo attraverso un appropriato "constructor ", ad esempio la seguente funzione predispone un buffer di pagina dalla dimensione di 128 bytes:
U8G2_ST7920_128X64_1_SW_SPI(rotation, clock, data, cs [, reset])
nel caso specifico per il display in questione.
Cablaggio per il bus
L'invio delle informazioni al display avviene attraverso un bus di dati, formato da due o più collegamenti. Esse seguono un preciso protocollo di trasmissione attraverso una serie di specifici comandi. Il bus viene selezionato collegando alcuni specifici pin del display a massa (oV) oppure a Vcc (5V). Ad esempio, nel circuito stampato del modulo oLED SSD1306 vi sono alcune piazzole saldabili, etichettate con BS0, BS1 e BS2, come mostrato in figura 1.
Generalmente i bus configurabili sono i seguenti:
- 3SPI, 3-wire SPI con tre segnali, Clock, Data and Chip-Select;
- 4SPI, 4-Wire SPI con quattro segnali, Clock, Data, Chip-Select e una linea addizionale per i comandi e dati;
- I2C, IIC or TWI con due segnali: Clock (SCL) and Data (SDA);
- 8080, un bus a 8 bit che richiede ben 8 linee più i segnali per la selezione del chip e dello strobe;
- 6800: un altro protocollo a 8 bit.
E' consigliabile, comunque, consultare il datasheet del display, come abbiamo sempre ribadito in ogni nostra pubblicazione.
Collegamento del display
Un display può essere collegato a una scheda di sviluppo come, ad esempio, Arduino, ESPertino, Raspberry Pi e mille altre. Questo, ovviamente, per permettere il transito dei dati dalla scheda al display. Per questo motivo occorre utilizzare alcuni pin per il collegamento. Ad esempio, utilizzando la scheda Arduino, un buon schema di collegamento potrebbe essere il seguente:
Pin del Display | Pin di Arduino |
E, Clock | 13 |
RW, Data, MOSI | 11 |
RS, Chip Select | 10 |
RST, Reset | 8 |
Si ricorda, inoltre, di collegare entrambi i dispositivi alla massa in comune e alimentare il display con la corretta tensione di alimentazione.
Inizializzazione della libreria
Completata la parte hardware è possibile lavorare, adesso, sul software. Il primo passo da compiere è quello d'inizializzare la libreria U8g2. Essa necessita di conoscere, ovviamente, quali sono i pin di uscita della scheda di sviluppo che sono connessi al display. Questo serve per indirizzare chiaramente le porte di lavoro. Occorre specificare correttamente l'ordine dei parametri all'interno del costruttore, secondo il seguente modello:
U8G2_ST7920_128X64_1_SW_SPI(rotation, clock, data, cs [, reset])
I parametri sono, quindi, i seguenti, rispettando l'ordine:
- La rotazione;
- Il pin di clock;
- Il pin dei dati;
- Il pin CS;
- L'eventuale pin di reset.
Per esempio, un valido utilizzo del costruttore è il seguente:
U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 8);
Ecco alcuni esempi di costruttori, validi anche per altri display e tipologie di bus:
- U8G2_SSD1305_128X32_NONAME_1_4W_SW_SPI;
- U8G2_SSD1306_128X64_VCOMH0_1_4W_SW_SPI;
- U8G2_SH1106_128X64_VCOMH0_1_4W_SW_SPI;
- U8G2_SH1106_128X64_VCOMH0_1_SW_I2C;
- U8G2_SSD1306_128X32_UNIVISION_2_4W_HW_SPI;
- U8G2_SSD1306_64X48_ER_1_8080;
- U8G2_SSD1325_NHD_128X64_F_2ND_4W_HW_SPI;
- U8G2_SSD1327_SEEED_96X96_2_SW_I2C;
- U8G2_UC1608_ERC24064_1_4W_SW_SPI;
- e molti altri.
E' disponibile una lunga lista con tutti i costruttori possibili, circa un centinaio. Il seguente esempio mostra come scrivere un testo sul display, il classico "Hello World!", in modo molto semplice, come mostrato anche in figura 2.
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>
U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, 13, 11, 10, 8);
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0,24,"Hello World!");
} while ( u8g2.nextPage() );
}
Le varie costanti per la scelta dei font, della rotazione e degli altri parametri sono contenute nel file d'inclusione "U8g2lib.h".
Le modalità di visualizzazione
La libreria U8g2 sopporta tre tipologie di visualizzazione, differenti tra loro per modo grafico e risorse impiegate:
- Modalità a pieno schermo;
- Modalità pagina;
- Modalità a solo carattere (U8x8).
Modalità a pieno schermo
Questa modalità di funzionamento risulta essere molto veloce e prevede tutte le procedure e funzioni per il disegno (vedi figura 3) e la visualizzazione dei dati. L'unico neo è quello di richiedere un considerevole ammontare di memoria RAM. Occorre eseguire l'inizializzazione con il seguente costruttore:
U8G2_ST7920_128X64_ F _SW_SPI(rotation, clock, data, cs [, reset])
Modalità pagina
Tale modalità è lenta ma esige poca memoria RAM e prevede tutte le funzionalità grafiche. Il relativo costruttore è il seguente:
U8G2_ST7920_128X64_ 1 _SW_SPI(rotation, clock, data, cs [, reset])
Modalità a solo carattere (U8x8)
Infine, in modo testo, la gestione avviene in maniera estremamente veloce ma senza grafica. Non utilizza alcuna memoria RAM ma è disponibile solo per alcuni modelli di display. Un esempio di costruttore è il seguente:
U8X8_ST7565_EA_DOGM128_4W_SW_SPI(clock, data, cs, dc [, reset])
Conclusione
E' possibile approfondire l'argomento con la consultazione dei files d'inclusione e lo studio delle sintassi delle varie funzioni.

Bella questa libreria! E anche di facile implementazione.
Questo tipo di librerie toglie un sacco di lavoro…… quasu quasi non si programma piu’ :-)))
sarebbe interessante avere un esempio di utilizzo su Espertino…
Salve Ezio.
Si senz’altro…. lo preparo in questi giorni e lo pubblico qui.
Saluti
Grazie. Sarebbe possibile fare un esempio con un display che utilizzi il protocollo i2c (ad esempio quelli basati su SSD1306)? Sarebbe esattamente quello che sto cercando di fare.
Ciao Ezio.
Ti ho risposto anche nel tuo altro thread.
Codice di esempio:
#include “SSD1306.h”
#include
SSD1306 display(0x3c, 21, 22);
display.init();
display.drawString(0, 0, “Ciao a tutti”);
display.display();
Prova anche a inserire una pausa iniziale di 1 secondo prema dell’INIT.
Ciao
Credo che questa libreria sia un di quelle che deve essere compresa in quelle che non può mancare nella lista del proprio IDE.
Come ha scritto Giovanni nel precedente commento, è meglio inserire delle pause dopo le impostazioni, rallentano l’esecuzioni, ma se non inserite, il chip potrebbe non avere il tempo di elaborare il comando per cui, sembrerà che il modulo sia guasto.
Dico questo perché lo verificato di persona!
Ottima libreria, mi sto giusto cimentando in questi gironi con un display OLED 128×64 con driver SSD1309ZC e mi ha velocizzato non di poco il lavoro di test iniziale per la realizzazione per prototipo dimostrativo.
Il prossimo step sarà spingere sulla grafica e realizzare delle icone.
salve, questa libreria è adattabile anche a uno schermo a colori?
io ho uno schermo 2,4″ TFT LCD (mcufriend), ho provato varie volte a farmi uscire un disegnino (in particolare la vista dall’alto di un’auto (presente i disegni delle auto nei cruscotti delle vetture fino a 10 anni fa?), ma senza alcun successo…
riesco solo a riprodurre o a modificare parzialmente uno sketch di esempio che ho trovato in rete…
mi piacerebbe avere una “guida” su come programmare per far uscire il disegno o l’icona che voglio…
grazie dell’aiuto!
buona serata!
Salve vorrei mostrale sul display oled il peso della bilancia ma non sono un genio nella programmazione con U8g2 non riesco a far vedere il peso/variabile e non so come fare .
Poi se avete voglia come posso fare per non far azzerare il peso ogni volta che accendo .
Mi serve per misurare un peso di un liquido che evapora. Il peso calerà nel tempo e se il peso si azzera ogni volta diventa un problema calcolare la variazione nel tempo. grazie dell’aiuto che potrete darmi. ALessandro