Abbiamo dedicato un repository su GitHub ad una serie di esempi per l’utilizzo della Multimedia Board (mmb) con una delle librerie per display più conosciute ed apprezzate, TFT_eSPI .

Maggiori informazioni sulla connessione della mmb con i display le trovi qui

Ovviamente tutti gli esempi possono essere riprodotti e/o modificati anche su una classica breadboard in mancanza di una mmb.

Per iniziare ad utilizzare gli esempi, è necessario clonare in locale il repository . Informazioni dettagliate su come clonare un repository remoto le trovi nell’apposito articolo.

Plaform.IO Envs

Quelli presenti in questo repository, sono esempi concreti di configurazione multi-environments che ci permette Platform.IO.

Per questo motivo, andiamo ad analizzare il file di configurazione platformio.ini che è praticamente uguale per ogni esempio:

Common env

Andiamo innanzi tutto a definire la sezione comune a tutti i display [env]: le prime 6 coppie di chiave/valore sono il minimo sindacale che solitamente inserisco per ogni progetto. Con lib_deps specifichiamo le librerie esterne dalle quali dipende il nostro progetto, in questo caso TFT_eSPI: in questo modo Platform.IO andrà a scaricare per noi la libreria da GitHub e la collocherà nella directory delle librerie del progetto (.pio/libdeps). Con build_flags andiamo poi a definire i parametri specifici della libreria appena inclusa, come i pin utilizzati dal display, la luminosità, i font da compilare con il progetto.

; common env
[env]
platform      = espressif32
board         = esp32dev
framework     = arduino
monitor_speed = 115200
upload_speed  = 921600
monitor_filters = esp32_exception_decoder
lib_deps      = TFT_eSPI
build_flags   =
  -D USER_SETUP_LOADED=1
  -D TFT_MISO=33
  -D TFT_MOSI=15
  -D TFT_SCLK=13
  -D TFT_DC=2
  -D TFT_CS=14
  -D TFT_BL=5
  -D TFT_BRIGHTNESS=255
  -D LOAD_GLCD=1
  -D LOAD_FONT2=1
  -D LOAD_FONT4=1
  -D LOAD_FONT6=1
  -D LOAD_FONT7=1
  -D LOAD_FONT8=1
  -D LOAD_GFXFF=1
  -D SMOOTH_FONT=1

Custom envs

Quello che abbiamo visto su è dunque la configurazione comune a tutti i 4 display. Ora è necessario creare 4 sezioni, ognuna con le configurazioni specifiche di ogni modello. Ognuno di essi infatti utilizza un driver differente ed altre eventuali configurazioni custom. Potremmo ad esempio voler settare una rotazione specifica per quel particolare modello.

E’ importante notare che se inseriamo una variabile in un custom env che è già presente nel common env, quest’ultima viene sovrascritta. In questo esempio non vogliamo che i valori di build_flag di default vengano sovrascritti, ma vogliamo aggiungerne altri. Per fare ciò utilizziamo la variabile ${env.build_flags}, che non fa altro che ripetere, all’interno del custom env, i valori che abbiamo definito nel common.

[env:ILI9341]
build_flags =
  ${env.build_flags}
  -D ILI9341_DRIVER=1
  -D MMB_ROTATION=3
  -D TFT_RST=-1
  -D SPI_FREQUENCY=40000000

[env:ILI9488]
build_flags =
  ${env.build_flags}
  -D ILI9488_DRIVER=1
  -D MMB_ROTATION=3
  -D TFT_RST=-1
  -D SPI_FREQUENCY=40000000

[env:ST7789]
build_flags =
  ${env.build_flags}
  -D ST7789_DRIVER=1
  -D MMB_ROTATION=1
  -D TFT_RST=4
  -D SPI_FREQUENCY=40000000
  -D TFT_WIDTH=240
  -D TFT_HEIGHT=240

[env:ST7735]
build_flags =
  ${env.build_flags}
  -D ST7735_DRIVER=1
  -D MMB_ROTATION=1
  -D TFT_RST=4
  -D ST7735_GREENTAB=1
  -D SPI_FREQUENCY=27000000
  -D TFT_WIDTH=128
  -D TFT_HEIGHT=160

A questo punto il progetto è configurato per 4 differenti display.

Come compilare il codice per i diversi display lo abbiamo già visto sull’articolo dedicato all’introduzione degli environments.

Spendiamo ora due parole per i singoli esempi, che sono comunque ben commentati sul codice.

Altri esempi possono essere presi e facilmente riadattati dal repository ufficiale della libreria.

Hello world

Compatibile con: ILI9341 - ILI9488 - ST7789 - ST7735

Il codice di esempio su src/main.cpp è largamente commentato e dimostra l’utilizzo di diversi font, colori e dimensioni del testo.

Quello che mi preme far notare qui è l’utilizzo di alcune variabili definite in platformio.ini all’interno della funzione di setup: MMB_ROTATION, TFT_BL, TFT_BRIGHTNESS.

void setup(void) {
  tft.init();
  tft.setRotation(MMB_ROTATION);
  ledcAttachPin(TFT_BL, 1);      // assign TFT_BL pin to channel 1
  ledcSetup(1, 12000, 8);        // 12 kHz PWM, 8-bit resolution
  ledcWrite(1, TFT_BRIGHTNESS);  // brightness 0 - 255
}

PROGMEM image

Compatibile con: ILI9341 - ILI9488 - ST7789 - ST7735

L’esempio dimostra la possibilità di compilare immagini nella memoria flash in formato binario. La nostra immagine è sul file src/logo.h che viene incluso nel programma.

NB: Un tool online che trovo utilissimo per convertire le immagini in codice cpp pronto è image2cpp.

SPIFFS Jpeg images

Compatibile con: ILI9341 - ILI9488 - ST7789 - ST7735

In questo esempio utilizziamo un’altra libreria esterna sempre dello stesso autore di TFT_eSPI: JPEGDecoder per il rendering di immagini jpeg. Per rendere l’esempio un po’ interattivo, facciamo uso anche di due pulsanti per scorrere le immagini grazie ad una una classe molto semplice che si occupa del debounce dei pulsanti.

abbiamo quindi un platformio.ini simile a quello dei due esempi precedenti, ma con altre dipendenze:

lib_deps =  TFT_eSPI
	    JPEGDecoder
	    https://github.com/ZioTester/Simple-Classes

Da notare che se la libreria non è riconosciuta da Platform.IO dal suo nome, può essere comunque inclusa fornendo l’url completo del repository, come in questo caso con la nostra libreria Simple Classes che contiene la classe Button.

I due pulsanti utilizzati sono UP (35) e DOWN (39), le immagini da caricare su spiffs sono nella directory data.

Sull’utilizzo dei pulsanti ti rimando all’articolo specifico.

PS: Affinchè l’esempio funzioni correttamente, è necessario fare l’upload delle immagini nella partizione SPIFFS dell’ESP32. Trovi tutte le informazioni nell’articolo dedicato a SPIFFS.

Web installer

Per questo progetto sono disponibili anche alcuni web installers nell’area dedicata. E’ possibile installare il firmware direttamente dalla pagina web.