Skip to Content

Interface do Display TFT ST7735 com ESP32

Interface do Display TFT ST7735 com ESP32

Neste tutorial, vais aprender a ligar um módulo de ecrã TFT de 1,8″ 128×160 com um driver de ecrã ST7735 a um ESP32 (WEMOS Lolin32 lite).

As instruções e o código funcionarão com algumas pequenas alterações para outros ESP32 e TFT, desde que o ecrã utilize o driver ST7735.

Peças Necessárias

Vais precisar de um ESP32 e de um ecrã TFT de 1,8 polegadas com resolução de 128×160 pixels e um CI driver ST7735. Alguns cabos e uma breadboard também podem ser úteis.

Ecrã TFT ST7735 de 1,8″

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cabo USB de Dados

Dupont wire set

Conjunto de Cabos 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.

Módulo de Ecrã TFT ST7735 de 1,8″

O Módulo de Ecrã TFT de 1,8″ que vamos usar tem uma resolução de 128×160 pixels com 65K cores RGB. A imagem abaixo mostra a frente e o verso do módulo de ecrã:

Front and Back of 1.8" TFT ST7735 Display Module
Frente e Verso do Módulo de Ecrã TFT ST7735 de 1,8″ (source)

O módulo usa o chip driver ST7735S e é controlado via uma interface SPI de 4 fios. A tensão de funcionamento é 3,3V e o ecrã consome cerca de 30mA no máximo.

Note que existem várias versões diferentes deste tipo de ecrã TFT. Algumas têm um SD card adicional ou um touch display.

Mais importante, algumas têm um conversor logic level que permite ligar o módulo de ecrã a um Arduino que funciona a 5V. Este aqui não tem, o que significa que não podes ligá-lo diretamente a um Arduino! Por isso usamos um ESP32 que funciona com lógica CMOS de 3,3V.

Se quiseres usar um Arduino, precisas de converter os níveis lógicos. Existem várias formas de fazer isso (divisor de tensão, optoacoplador, CI de mudança de nível), mas a forma mais fácil é usar um level shifting module.

Finalmente, existem ecrãs semelhantes que usam o CI driver ST7789 em vez do ST7735S. O código deste tutorial é para ecrãs com o CI driver ST7735S e não funcionará para outros.

Ligação do Ecrã TFT ST7735 de 1,8″ ao ESP32

Ligar o ecrã TFT a um ESP32 é fácil, mas a identificação dos pinos no ecrã é um pouco confusa. Mostra pinos SDA e SCL, mas como tem uma interface SPI, estes não são os pinos SDA e SCL do I2C! Em vez disso, SDA corresponde a MOSI e SCL a SCLK para SPI.

O diagrama de ligação seguinte mostra como ligar o ecrã TFT ST7735 de 1,8″ a um WEMOS Lolin32 lite:

Ligação do Ecrã TFT ST7735 ao WEMOS Lolin ESP32 lite

E aqui, para tua conveniência, as ligações necessárias numa tabela:

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

Certifica-te de ligar o VCC do ecrã a 3,3V! Também deves usar os pinos hardware SPI para MOSI e SCLK. Dependendo do microcontrolador, os pinos hardware SPI podem variar. Podes encontrá-los selecionando a tua placa no Arduino IDE e depois executando o código abaixo.

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() { }

Ele imprime os pinos que precisas para hardware SPI – especificamente MOSI e SCLK. Os restantes pinos podes escolher livremente e o MISO não é usado.

Código para Ecrã TFT ST7735 com a Biblioteca Adafruit_ST7735

Nesta secção vamos usar a Adafruit-ST7735 Library para escrever e desenhar no ecrã TFT ST7735 de 1,8″. Para a instalar, abre o Library Manager, procura por “Adafruit-ST7735” e clica no botão verde INSTALL:

Adafruit-ST7735 in Library Manager
Adafruit-ST7735 no Library Manager

O instalador provavelmente vai pedir para instalar as dependências também. Clica em INSTALL ALL:

Install the dependencies for Adafruit-ST7735 Library
Instalar Dependências para a Biblioteca Adafruit-ST7735

Com a biblioteca instalada, podemos agora testar o ecrã. Basta compilar e carregar o código seguinte. Ele imprime o texto “Makerguides” com uma moldura amarela no ecrã:

#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 usares hardware SPI, não precisarás das definições dos pinos para TFT_MOSI e TFT_SCLK. No entanto, se usares software SPI, precisarás deles e de os passar para o outro construtor do objeto tft:

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

Se compilares e carregares o código, deverás ver a seguinte saída no teu ecrã:

Output on TFT with Adafruit_ST7735 Library
Saída no TFT com a Biblioteca Adafruit_ST7735

Se não vires nada, ou as cores estiverem erradas, ou o texto apresentar artefactos, experimenta um dos outros inicializadores para o ecrã TFT no código:

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

A aba preta e a aba verde referem-se às abas coloridas presas à película protetora do ecrã que estes ecrãs normalmente trazem. Por exemplo, a imagem abaixo mostra um ecrã TFT com uma aba verde:

Ecrã TFT com Aba Verde (source)

A cor da aba é importante porque muitas vezes indica o tipo de controlador do ecrã usado. A Aba Verde é tipicamente para controladores mais recentes ou alternativos como ILI9341, ST7735, ou outros modelos específicos. A Aba Preta indica um controlador mais antigo ou diferente, como ST7735R ou variantes similares, que têm especificações ligeiramente diferentes.

Finalmente, podes tentar reduzir a velocidade do SPI se o texto no ecrã parecer corrompido:

 tft.setSPISpeed(27000000);

A propósito, se quiseres ligar ou desligar a luz de fundo do ecrã, podes usar o seguinte código:

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

Código para Ecrã TFT ST7735 com a Biblioteca TFT_eSPI

Nesta secção, vamos usar a TFT_eSPI library em vez da biblioteca Adafruit_ST7735 para controlar o ecrã. Para a instalar, abre o Library Manager, procura por “TFT_eSPI” e clica em “INSTALL”. Depois da instalação, deverá ficar assim:

TFT_eSPI library in Library Manager
Biblioteca TFT_eSPI no Library Manager

De seguida, precisamos criar a estrutura correta da pasta do projeto. Abre o Arduino IDE e cria um projeto “tft_test” e guarda-o (Guardar Como …). Isto vai criar uma pasta “tft_test” com o ficheiro “tft_test.ino” dentro. Nesta pasta, cria outro ficheiro chamado “tft_setup.h“. A pasta do teu projeto deverá ficar assim

Project Folder Structure
tft_test

Se quiseres aprender mais sobre esta configuração e outras opções para configurar um ecrã TFT para a biblioteca TFT_eSPI, dá uma vista de olhos ao tutorial How to configure TFT_eSPI Library for TFT display.

Depois de criada a pasta do projeto com os dois ficheiros, copia o seguinte código de configuração para o ecrã TFT no ficheiro 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 o código do sketch vai no ficheiro 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 compilares e carregares o código, deverás ver a mesma saída de antes:

Output on TFT with TFT_eSPI Library
Saída no TFT com a Biblioteca TFT_eSPI

Semelhante à biblioteca Adafruit_ST7735, o ficheiro tft_setup.h para a Biblioteca TFT_eSPI oferece diferentes inicializadores dependendo do ecrã TFT específico (aba verde, aba preta, …) que estás a usar. Se estiveres a ter problemas com o ecrã (cores erradas, texto corrompido), experimenta um destes primeiro:

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

Como antes, a velocidade do SPI é outro parâmetro importante, que também é especificado no ficheiro tft_setup.h:

#define SPI_FREQUENCY  27000000

Experimentei uma frequência comum e mais alta SPI_FREQUENCY de 40000000 mas comecei a ter texto corrompido. A imagem abaixo mostra duas capturas do ecrã TFT. A primeira com uma SPI_FREQUENCY de 27000000 e a segunda com uma frequência de 40000000.

TFT text output with different SPI frequencies
Saída de texto no TFT com diferentes frequências SPI

Podes ver claramente que o texto para a frequência SPI mais alta fica corrompido. Por isso, tem cuidado com velocidades elevadas e baixa a frequência SPI se começares a ver texto distorcido.

Finalmente, a Biblioteca TFT_eSPI permite colocar o driver do ecrã e o ecrã em modo de suspensão, além de desligar a luz de fundo:

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  

A tabela seguinte mostra o consumo de energia do ecrã TFT com os diferentes componentes ligados ou desligados:

Luz de FundoEcrãDriverConsumo
LIGADOLIGADOLIGADO15 mA
DESLIGADOLIGADOLIGADO2 mA
DESLIGADODESLIGADOLIGADO1.5 mA
DESLIGADODESLIGADODESLIGADO0.3 mA

Exibir o texto “Makerguides” com a luz de fundo e tudo o resto ligado consome 15 mA. Mas se desligares tudo (luz de fundo, ecrã, driver), o consumo de energia cai para 0,3 mA! Isto é ótimo para projetos alimentados por bateria.

Conclusões

Neste tutorial aprendeste a ligar um módulo de ecrã TFT com driver ST7735 a um ESP32. Usámos duas bibliotecas diferentes, Adafruit_ST7735 e TFT_eSPI, para desenhar e escrever texto no ecrã TFT.

Se tiveres algum comentário, sente-te à vontade para deixar na secção de comentários.

Boas experiências ; )