Se avete letto il mio post ESP32, Wemos o non Wemos sapete che ho acquistato una scheda di sviluppo, clone della D-duino-32, con un modulo ESP-WROOM-32 e un display oled da 0.96″.
Questo display, disponibile anche standalone su diversi siti web (eccolo ad esempio su Banggood) ha le seguenti caratteristiche:
- dimensioni: 0.96 pollici
- risoluzione: 128×64 pixels
- controller: SSD1306 con interfaccia I2C
- alimentazione: 3.3V – 6V
Il suo utilizzo con il chip esp32 è molto semplice grazie al lavoro di olikraus e Neil Kolban. Il primo è l’autore della libreria u8g2, mentre il secondo ha sviluppato le funzioni specifiche del chip esp32 per l’hardware abstraction layer (HAL) della libreria u8g2.
u8g2, installazione
u8g2 è una fantastica libreria per display lcd monocromatici: supporta tantissimi modelli di display e controller, è facilmente portabile su nuove piattaforme e offre diversi metodi per disegnare forme geometriche, visualizzare immagini o testo con diversi fonts.
Vediamo come utilizzarla in un nostro progetto. Per prima cosa scarichiamo l’archivio contenente il repository Github della libreria:
Se non esiste, creiamo la cartella components all’interno della cartella principale del nostro progetto. Scompattiamo l’archivio in tale cartella, rinominando poi la sottocartella u8g2-master in u8g2:
All’interno della cartella u8g2 creiamo il file component.mk con il seguente contenuto:
Dobbiamo ora scaricare i files u8g2_esp32_hal.c e u8g2_esp32_hal.h dal repository di nkolban:
Possiamo copiare i due files nella cartella main del nostro progetto:
u8g2, configurazione
Per utilizzare la libreria u8g2 nei nostri programmi, per prima cosa includiamo il file header:
#include "u8g2_esp32_hal.h"
|
La configurazione di HAL avviene tramite la struct u8g2_esp32_hal_t:
typedef struct { gpio_num_t clk; gpio_num_t mosi; gpio_num_t sda; gpio_num_t scl; gpio_num_t cs; gpio_num_t reset; gpio_num_t dc; } u8g2_esp32_hal_t; |
La libreria supporta sia display I2C che display SPI: per questo nella struct troviamo l’indicazione dei segnali di entrambi i bus.
Possiamo definire e inizializzare la struct con i valori di default con:
u8g2_esp32_hal_t u8g2_esp32_hal = U8G2_ESP32_HAL_DEFAULT; |
Il display oled della scheda di sviluppo D-duino-32 ha interfaccia I2C ed è connesso ai pin 4 (SCL) e 5 (SDA) di esp32:
u8g2_esp32_hal.sda = 5; u8g2_esp32_hal.scl = 4; |
Una volta completata la definizione dei diversi parametri della struct, possiamo utilizzare il metodo u8g2_esp32_hal_init():
u8g2_esp32_hal_init(u8g2_esp32_hal); |
Passiamo ora alla configurazione della libreria u8g2. Definiamo una variabile di tipo u8g2_t:
u8g2_t u8g2;
|
In base al display scelto, dobbiamo utilizzare la relativa funzione di setup. A tale funzione dobbiamo passare come parametri:
- il puntatore alla variabile u8g2_t definita in precedenza
- una costante che indica la rotazione del display
- le due funzioni di HAL di invio dati sul bus e di delay
Le costanti disponibili per la rotazione del display sono:
mentre le due funzioni implementate da Kolban sono:
- u8g2_esp32_msg_i2c_cb
- u8g2_esp32_msg_i2c_and_delay_cb
Per il nostro display utilizziamo la funzione di setup per controller ssd1306 “noname” con prefisso _f che indica full framebuffer:
u8g2_Setup_ssd1306_128x64_noname_f( &u8g2, U8G2_R0, u8g2_esp32_msg_i2c_cb, u8g2_esp32_msg_i2c_and_delay_cb); |

framebuffer
Infine – se il display è I2C – dobbiamo indicare il suo indirizzo alla libreria:
u8x8_SetI2CAddress(&u8g2.u8x8,0x78); |
u8g2, utilizzo
Eseguiamo l’inizializzazione del display con:
u8g2_InitDisplay(&u8g2); |
Il display è inizialmente in modalità power save, per “accenderlo” dobbiamo disabilitare questa modalità con:
u8g2_SetPowerSave(&u8g2, 0); |
Ora possiamo utilizzare i diversi metodi che la libreria offre per visualizzare testo, immagini, forme geometriche. Stiamo utilizzando la modalità full framebuffer, quindi andremo prima a preparare il buffer in memoria e poi lo invieremo al display.
Prepariamo il buffer con il metodo ClearBuffer():
u8g2_ClearBuffer(&u8g2); |
Utilizziamo i metodi SetFont() e DrawStr() per scrivere del testo con il font scelto nel buffer:
u8g2_SetFont(&u8g2, u8g2_font_timR14_tf); u8g2_DrawStr(&u8g2, 2,17,"Hello World!"); |
Infine visualizziamo il contenuto del buffer sul display con:
u8g2_SendBuffer(&u8g2); |
Demo
Nel seguente video vi illustro brevemente come installare la libreria, come preparare una immagine per essere visualizzata sul display e infine l’esecuzione, sulla mia D-duino-32, del programma di esempio che trovate su Github.
Sono disponibili i sottotitoli in italiano: