Skip to Content

Interfaccia Display TFT ST7735 con ESP32

Interfaccia Display TFT ST7735 con ESP32

In questo tutorial imparerai come interfacciare un modulo display TFT da 1,8″ 128×160 con driver ST7735 con un ESP32 (WEMOS Lolin32 lite).

Le istruzioni e il codice funzioneranno con alcune piccole modifiche anche per altri ESP32 e TFT, purché il display utilizzi il driver ST7735.

Componenti necessari

Ti serviranno un ESP32 e un display TFT da 1,8 pollici con risoluzione 128×160 pixel e un driver ST7735. Alcuni cavi e una breadboard potrebbero essere utili.

Display TFT ST7735 da 1,8″

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cavo dati USB

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Modulo Display TFT ST7735 da 1,8″

Il modulo display TFT da 1,8″ che useremo ha una risoluzione di 128×160 pixel con 65K colori RGB. L’immagine sotto mostra il fronte e il retro del modulo display:

Front and Back of 1.8" TFT ST7735 Display Module
Fronte e retro del modulo display TFT ST7735 da 1,8″ (source)

Il modulo utilizza il chip driver ST7735S ed è controllato tramite un’interfaccia SPI a 4 fili. La tensione di funzionamento è 3,3V e il display assorbe circa 30mA al massimo.

Nota che esistono molte versioni diverse di questo tipo di display TFT. Alcuni hanno un SD card aggiuntivo o un touch display.

Soprattutto, alcuni di essi hanno un convertitore logic level che permette di collegare il modulo display a un Arduino che funziona a 5V. Questo qui non ce l’ha, quindi non puoi collegarlo direttamente a un Arduino! Perciò usiamo un ESP32 che funziona con logica CMOS a 3,3V.

Se vuoi usare un Arduino devi convertire i livelli logici. Ci sono vari modi per farlo (partitore di tensione, optoisolatore, IC level-shifting) ma il più semplice è procurarsi un level shifting module.

Infine, ci sono display simili che usano il driver ST7789 invece del ST7735S. Il codice in questo tutorial è per display con driver ST7735S e non funzionerà con altri.

Collegare il display TFT ST7735 da 1,8″ con ESP32

Collegare il display TFT a un ESP32 è semplice, ma l’etichettatura dei pin sul display è un po’ confusa. Mostra i pin SDA e SCL ma, dato che ha un’interfaccia SPI, questi non sono i pin SDA e SCL per I2C! Invece, SDA corrisponde a MOSI e SCL a SCLK per SPI.

Lo schema di collegamento seguente mostra come collegare il display TFT ST7735 da 1,8″ a un WEMOS Lolin32 lite:

Collegamento display TFT ST7735 con WEMOS Lolin ESP32 lite

E qui, per comodità, le connessioni richieste in tabella:

DisplayESP32
CS / SS5
RST16
DC17
SDA / MOSI23
SCL / SCLK18
BKL/BL22
GNDGND
VCC3.3V

Assicurati di collegare il VCC del display a 3,3V! Inoltre dovresti usare i pin hardware SPI per MOSI e SCLK. A seconda del microcontrollore i pin hardware SPI variano. Puoi trovarli selezionando la tua scheda nell’Arduino IDE e poi eseguendo il codice qui sotto.

void setup() {
  Serial.begin(115200);
  Serial.print("MOSI: ");
  Serial.println(SDA / MOSI);
  Serial.print("MISO: ");
  Serial.println(MISO);
  Serial.print("SCL / SCLK: ");
  Serial.println(SCK);
  Serial.print("CS / SS: ");
  Serial.println(SS);  
}

void loop() { }

Il codice stampa i pin necessari per l’hardware SPI – specificamente MOSI e SCLK. Gli altri pin puoi sceglierli liberamente e MISO non è usato.

Codice per display TFT ST7735 con libreria Adafruit_ST7735

In questa sezione useremo la Adafruit-ST7735 Library per scrivere e disegnare sul display TFT ST7735 da 1,8″. Per installarla apri il Library Manager, cerca “Adafruit-ST7735” e clicca sul pulsante verde INSTALL:

Adafruit-ST7735 in Library Manager
Adafruit-ST7735 nel Library Manager

L’installer probabilmente ti chiederà di installare anche le dipendenze. Clicca su INSTALL ALL:

Install the dependencies for Adafruit-ST7735 Library
Installa dipendenze per la libreria Adafruit-ST7735

Con la libreria installata, possiamo ora testare il display. Compila e carica il codice seguente. Visualizza il testo “Makerguides” con una cornice gialla sul display:

#include <Adafruit_GFX.h>     
#include <Adafruit_ST7735.h>  

#define TFT_CS  5
#define TFT_RST 16
#define TFT_DC  17
// #define TFT_MOSI  23  // SDA // HW MOSI
// #define TFT_SCLK  18  // SCL // HW SCLK
// #define TFT_MISO  19  // not used
#define TFT_BL  22  // LED back-light

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);  // hardware SPI
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

void setup(void) {
  //tft.initB();
  tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab
  //tft.initR(INITR_GREENTAB); // Init ST7735S chip, green tab
  //tft.setSPISpeed(27000000);

  tft.setRotation(1);
  tft.fillScreen(ST77XX_BLACK);

  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(2);
  tft.setCursor(15, 50);
  tft.println("Makerguides");
  tft.drawRect(10, 40, 145, 40, ST77XX_YELLOW);
}

void loop() { }

Se usi hardware SPI non ti serviranno le definizioni dei pin per TFT_MOSI e TFT_SCLK. Tuttavia, se usi software SPI ti serviranno e dovrai passarli al costruttore alternativo per l’oggetto tft:

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

Se compili e carichi il codice, dovresti vedere questo output sul display:

Output on TFT with Adafruit_ST7735 Library
Output sul TFT con libreria Adafruit_ST7735

Se non vedi nulla, o i colori sono sbagliati, o il testo mostra artefatti, prova uno degli altri inizializzatori per il display TFT nel codice:

  //tft.initB();
  tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab
  //tft.initR(INITR_GREENTAB); // Init ST7735S chip, green tab

La tab nera e la tab verde si riferiscono alle linguette colorate attaccate alla pellicola protettiva dello schermo con cui questi display solitamente vengono forniti. Per esempio, l’immagine sotto mostra un display TFT con linguetta verde:

Display TFT con linguetta verde (source)

Il colore della linguetta è importante perché spesso indica il tipo di controller del display usato. La Linguetta verde è tipica per controller più recenti o alternativi come ILI9341, ST7735 o altri modelli specifici. La Linguetta nera indica un controller più vecchio o diverso, come ST7735R o varianti simili, che hanno specifiche leggermente diverse.

Infine, puoi provare a ridurre la velocità SPI se il testo sul display appare corrotto:

 tft.setSPISpeed(27000000);

A proposito, se vuoi accendere o spegnere la retroilluminazione del display, puoi usare questo codice:

pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, LOW);  

Codice per display TFT ST7735 con libreria TFT_eSPI

In questa sezione useremo la TFT_eSPI library invece della libreria Adafruit_ST7735 per controllare il display. Per installarla apri il Library Manager, cerca “TFT_eSPI” e premi “INSTALL”. Dopo l’installazione dovrebbe apparire così:

TFT_eSPI library in Library Manager
Libreria TFT_eSPI nel Library Manager

Ora dobbiamo creare la struttura corretta della cartella progetto. Apri l’Arduino IDE e crea un progetto “tft_test” e salvalo (Salva con nome …). Questo creerà una cartella “tft_test” con il file “tft_test.ino” dentro. In questa cartella crea un altro file chiamato “tft_setup.h“. La tua cartella progetto dovrebbe apparire così

Project Folder Structure
tft_test

Se vuoi saperne di più su questa configurazione e altre opzioni per configurare un display TFT con la libreria TFT_eSPI dai un’occhiata al tutorial How to configure TFT_eSPI Library for TFT display.

Dopo aver creato la cartella progetto con i due file, copia il seguente codice di configurazione per il display TFT nel file tft_setup.h:

// tft_setup.h
#define ST7735_DRIVER

//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_GREENTAB3
//#define ST7735_REDTAB
#define ST7735_BLACKTAB
   
#define TFT_WIDTH  128
#define TFT_HEIGHT 160

#define TFT_RGB_ORDER TFT_RGB  

// WEMOLS Lolin32 lite
#define TFT_CS    5   
#define TFT_RST   16  
#define TFT_DC    17   
// #define TFT_MOSI  23  // SDA // HW MOSI
// #define TFT_SCLK  18  // SCL // HW SCLK
// #define TFT_MISO  19  // not used
#define TFT_BL    22   // LED back-light
#define TFT_BACKLIGHT_ON HIGH

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT

#define SPI_FREQUENCY  27000000
#define SPI_READ_FREQUENCY  20000000
#define SPI_TOUCH_FREQUENCY  2500000

e il codice dello sketch nel file tft_test.ino:

// tft_test.ino
#include "tft_setup.h"
#include"TFT_eSPI.h"

TFT_eSPI tft = TFT_eSPI();

void setup(void) {  
  tft.init();
  tft.fillScreen(TFT_BLACK);  
  tft.setRotation(1);

  tft.setCursor(15, 50, 1);  
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setTextSize(2);
  tft.println("Makerguides");
  tft.drawRect(10, 40, 145, 40, TFT_YELLOW);  
}

void loop() { }

Se compili e carichi il codice dovresti vedere lo stesso output di prima:

Output on TFT with TFT_eSPI Library
Output sul TFT con libreria TFT_eSPI

Simile alla libreria Adafruit_ST7735, il file tft_setup.h per la libreria TFT_eSPI offre diversi inizializzatori a seconda del display TFT specifico (linguetta verde, linguetta nera, …) che stai usando. Se hai problemi con il display (colori sbagliati, testo corrotto), prova prima uno di questi:

//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_GREENTAB3
//#define ST7735_REDTAB
#define ST7735_BLACKTAB

Come prima, la velocità SPI è un altro parametro importante, specificato anch’esso nel file tft_setup.h:

#define SPI_FREQUENCY  27000000

Ho provato una frequenza comune e alta SPI_FREQUENCY di 40000000 ma ho iniziato a vedere testo corrotto. L’immagine sotto mostra due schermate del display TFT. La prima con una SPI_FREQUENCY di 27000000 e la seconda con frequenza 40000000.

TFT text output with different SPI frequencies
Output testo TFT con frequenze SPI diverse

Si vede chiaramente che il testo con frequenza SPI più alta diventa corrotto. Quindi fai attenzione alle velocità elevate e abbassa la frequenza SPI se il testo inizia a essere distorto.

Infine, la libreria TFT_eSPI ti permette di mettere in sleep il driver e il display, oltre a spegnere la retroilluminazione:

pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, LOW);         // Switch off Backlight
tft.writecommand(ST7735_DISPOFF);  // Switch off the display 
tft.writecommand(ST7735_SLPIN);    // Sleep the display driver  

La tabella seguente mostra il consumo energetico del display TFT con i vari componenti accesi o spenti:

RetroilluminazioneDisplayDriverConsumo
ACCESOACCESOACCESO15 mA
SPENTOACCESOACCESO2 mA
SPENTOSPENTOACCESO1.5 mA
SPENTOSPENTOSPENTO0.3 mA

Visualizzare il testo “Makerguides” con retroilluminazione e tutto il resto acceso consuma 15 mA. Ma se spegni tutto (retroilluminazione, display, driver) il consumo scende a 0,3 mA! Ottimo per progetti a batteria.

Conclusioni

In questo tutorial hai imparato come interfacciare un modulo display TFT con driver ST7735 con un ESP32. Abbiamo usato due librerie diverse, Adafruit_ST7735 e TFT_eSPI, per disegnare e scrivere testo sul display TFT.

Se hai commenti, sentiti libero di lasciarli nella sezione commenti.

Buon divertimento con il tinkering ; )