ESP32 (25) – Display oled con U8G2

luca 30/10/2017 5

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:

5 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

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