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:
[checklist]
- dimensioni: 0.96 pollici
- risoluzione: 128×64 pixels
- controller: SSD1306 con interfaccia I2C
- alimentazione: 3.3V – 6V
[/checklist]
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:
[checklist]
- 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
[/checklist]
Le costanti disponibili per la rotazione del display sono:
mentre le due funzioni implementate da Kolban sono:
- u8g2_esp32_i2c_byte_cb
- u8g2_esp32_gpio_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_i2c_byte_cb, u8g2_esp32_gpio_and_delay_cb); |
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:
Hi, congratulations on the explanations. I’m testing this example with a heltec module, and am having the following error at compile time:
C:/msys32/home/jabes/esp-idf/examples/lucca_exemplos/esp32-tutorial-master/18_u8g2/main/u8g2_esp32_hal.c:79:14: error: ‘spi_transaction_t {aka struct spi_transaction_t}’ has no member named ‘command’
trans_desc.command = 0;
^
make[1]: *** [/home/jabes/esp-idf/make/component_wrapper.mk:274: u8g2_esp32_hal.o] Error 1
make: *** [C:/msys32/home/jabes/esp-idf/make/project.mk:450: component-main-build] Error 2
What do you think it can be?
Hi, ESP changed something in the framework… you should use the updated version of the u8g2 hal
Ciao, più o meno stesso errore. Non ho trovato aggiornamenti di u8g2_hal. Ho un ESP32-DEVKITC ESP32 Core Board V2 e l’unica modifica al progetto è stato cambiare i PIN SDA e SCL (21-22)
ciao, ho aggiornato l’articolo con la nuova versione del HAL, compatibile con il framework v3
Ciao Luca blog stupendo, ho provato questo esempio su una scheda wemos con Oled integrato come quello che compare nel video. Ho cambiato l’indirizzo a 0x3c come indicato dal venditore ma quando va in esecuzione continua a fare dei reboot continui.
L’ultima riga prima di riavviarsi scrive: u8g2_esp32_hal.c”, line 158, function: u8g2_esp32_i2c_byte_cb
abort() was called at PC 0x400d247b on core 0
Ho aggiornato tutto all’ultima versione.
Grazie
Did you get any solution to this?
Hi,
Works after I make one change in your setup example from above…
u8g2_Setup_ssd1306_128x64_noname_f
Changed to:
u8g2_Setup_i2c_ssd1306_128x64_noname_f
Many thanks for the tutorial, from a first time OLED user~!
Ciao Luca,
sto seguendo questo tuo tutorial, molto ben fatto, per riuscire a utilizzare la mia wemos lolin32 con isplay integrato.
Purtoppo sia dall’ide di arduino che da visual studio 2017 mi viene restituito lo stesso errore.
u8g2.h no such file or directory.
Questo probabilmente perchè la libreria non è installata nella cartella di default delle librerie arduino. Tuttavia se la sposto lì mi restituisce il medesimo errore ma su u8g2_esp32_hal.h
Come posso ovviare al problema?
Grazie mille
D.
Ciao Davide, non usare Arduino ma il framework esp-idf “liscio”, vedrai che così funziona. Se invece vuoi usare Arduino, devi installare la libreria u8g2 dal Library Manager.
I am facing the same problem as Mauro. I am using ESP32 by WEMOS which has build in OLED Screen.
I am getting the following error:
assertion “0 && “i2c_master_cmd_begin(I2C_MASTER_NUM, handle_i2c, I2C_TIMEOUT_MS / portTICK_RATE_MS)”” failed: file “D:/msys32/home/udare/18_u8g2/main/u8g2_esp32_hal.c”, line 158, function: u8g2_esp32_i2c_byte_cb
abort() was called at PC 0x400d295b
Hi! Did you update the hal library?