ESP32 (25) – Display oled con U8G2

luca 30/10/2017 0

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_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

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:

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