ESP32 (25) – Display oled con U8G2

luca 30/10/2017 11

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

u8g2-00a u8g2-00b

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:

u8g2-01

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:

u8g2-02

All’interno della cartella u8g2 creiamo il file component.mk con il seguente contenuto:

u8g2-03

Dobbiamo ora scaricare i files u8g2_esp32_hal.cu8g2_esp32_hal.h dal repository di nkolban:

u8g2-04

Possiamo copiare i due files nella cartella main del nostro progetto:

u8g2-05

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:

u8g2-06

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);

framebuffer

full framebuffer indica che tutti i dati da visualizzare sul display sono conservati nella memoria RAM del microcontrollore. Questo rende più veloce la visualizzazione, a discapito di un maggiore consumo di RAM. La libreria u8g2 supporta anche modalità di page buffer per ridurre il consumo di RAM. Un confronto tra le modalità, con pregi e difetti di ognuna, è presente sulla wiki della libreria.

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()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);

u8g2-00c

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:

11 Comments »

  1. Jabes Cândido da Silva 28/03/2018 at 16:53 - Reply

    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?

    • luca 03/05/2018 at 13:35 - Reply

      Hi, ESP changed something in the framework… you should use the updated version of the u8g2 hal

  2. Claudio Ferronetti 21/05/2018 at 19:25 - Reply

    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)

    • luca 17/06/2018 at 14:13 - Reply

      ciao, ho aggiornato l’articolo con la nuova versione del HAL, compatibile con il framework v3

  3. Mauro 26/07/2018 at 16:47 - Reply

    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

    • Aniket R Udare 02/12/2018 at 05:07 - Reply

      Did you get any solution to this?

  4. Brent Brown 20/09/2018 at 12:26 - Reply

    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~!

  5. davide 16/11/2018 at 17:39 - Reply

    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.

    • luca 17/11/2018 at 17:01 - Reply

      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.

  6. Aniket R Udare 02/12/2018 at 05:06 - Reply

    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

    • luca 07/12/2018 at 15:49 - Reply

      Hi! Did you update the hal library?

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi