Display TFT 1.8″ ST7735 – Utilizando o display com o NodeMCU ou Arduino
A existência de uma interface de visualização de dados é algo muito importante tanto no desenvolvimento de um software quanto no mundo dos sistemas embarcados de maneira geral, de modo que, em virtude de sua importância, precisamos sempre estar construindo interfaces concisas e de fácil entendimento. Entretanto isso é uma tarefa bastante desafiadora no mundo maker, devido a baixa quantidade de recursos disponíveis nas plataformas utilizadas. Sendo assim, apresentamos o Display TFT 1.8″ com o controlador ST7735, que por sua vez, consiste em um módulo bem interessante e que pode ser utilizado com o propósito citado.
Nesse tutorial focamos no uso do Display TFT 1.8″ ST7735 usando a plataforma NodeMCU. Ainda assim, fizemos uma explicação de como fazer a mesma experiência usando a plataforma Arduino no Tópico: Usando o Display TFT 1.8″ ST7735 na plataforma Arduino.
[toc]
O Display TFT 1.8″ ST7735
Esta pequena tela tem uma resolução de 128×160 pixels, o que permite sua utilização como um pequeno painel de visualização, sendo possível até mesmo fazer o seu uso em mini computadores como o Raspberry Pi e o Orange Pi. Além disso, ela também conta com uma interface para conexão de cartões SD em sua parte traseira. A tela conta com um total de 8 pinos, sendo dois destes para alimentação, um para o backlight e os outros 5 para comunicação que é feita via SPI.
Mãos à obra – Imprimindo informações no display usando um NodeMCU
Componentes utilizados:
- 1x NodeMCU
- 1x Display TFT 1.8″
- 8x Jumpers
Montando o projeto
Para realizar a montagem, iremos conectar os pinos na seguinte ordem:
A montagem final deve estar semelhante a imagem abaixo:
Veja como ficou a nossa montagem na prática:
Se tudo estiver montado corretamente, quando o sistema for ligado teremos uma tela em branco.
Sempre monte seu projeto com a alimentação desligada para evitar possíveis curtos circuitos que podem danificar o seu dispositivo.
Programando
Antes de adentrarmos na apresentação do código, disponibilizamos uma seção para ajudar aqueles que são iniciantes no NodeMCU. Sinta-se livre para prosseguir caso você já tem domínio da IDE do Arduino e com o NodeMCU.
Esse passo a passo foi tirado do tutorial: Conhecendo a Família ESP – Internet das coisas
– Preparando a IDE Arduino
Usaremos a Arduino IDE, mas você pode programa-lo com LUA, ou até a propria SDK.
1-) Vá em Arquivos>Preferencias, e adicione este link em “URLs Adicionais…”: http://arduino.esp8266.com/stable/package_esp8266com_index.json
2-) Vá em Ferramentas>Placa>Gerenciador de placas.
3-) Procure pelo ESP8266 e instale-o.
4-) Após instalar as placas do ESP8266, selecione-a em Ferramentas>Placa> NodeMCU 1.0 (caso esteja usando uma versão mais antiga do NodeMCU, pode ser que tenha que usar a versão 0.9)
5-) Agora, é só configurar a placa, aconselho a usarem igual ao da foto. Testem primeiramente com o upload a 115200@bps, caso nao funcione, teste com outras velocidades! Não se esqueça de selecionar a porta que estiver seu FTDI.
Sua IDE esta pronta para funcionar com o ESP8266. Vamos seguir!
– Bibliotecas
Neste projeto estaremos utilizando duas bibliotecas, sendo uma para estabelecer a comunicação com o display, e outra para renderizar figuras de forma simplificada. Para isso, iremos fazer o download das duas bibliotecas da seguinte forma:
- Na ide do arduino, navegamos até a opção Sketch, selecionamos a opção Incluir biblioteca e navegamos até a opção Gerenciar Bibliotecas como mostra a figura abaixo:
- Ao selecionar a opção Gerenciar bibliotecas, será aberto um painel como mostra a figura a seguir:
- Nesta Janela iremos procurar as bibliotecas Adafruit ST7735 e Adafruit GFX Library, ambas podem ser instaladas através deste ambiente (Caso ocorra algum erro ou a imagem não apareça corretamente, a tela pode estar utilizando o controlador ILI9341, neste caso faça o download da biblioteca Adafruit ILI9341).
Biblioteca Adafruit GFX Library
– Programando
Agora que temos o nosso sistema montado, e as bibliotecas já instaladas, podemos partir para o código. Observem o código a seguir e que pode ser utilizado para diversos projetos.
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library #define D3 0 #define D4 2 #define D5 14 #define D7 13 #define D8 15 #define TFT_CS D8 #define TFT_RST D4 #define TFT_DC D3 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // Instância do objeto tipo Adafruit_ST7735 que recebe como argumentos os pinos de controle #define TFT_SCLK D5 #define TFT_MOSI D7 void setup(void){ tft.setCursor(0,30); // Move o cursor para a coluna 30 na linha 0 tft.initR(INITR_BLACKTAB); // Inicializa a tela com um fundo preto tft.setTextSize(2); // Seta o tamanho da fonte de texto para o tamanho 2 tft.fillScreen(ST7735_BLACK); // Preenche a tela com a cor preta tft.setTextColor(ST7735_BLUE); // Seta a cor do texto para Azul tft.print("Vida"); // Escreve a palavra Vida Com a cor que foi setada na linha acima tft.setTextColor(ST7735_WHITE); // Seta a cor do texto para Branco tft.print("De "); // Escreve a palavra Vida com a cor que foi setada na linha acima tft.setTextColor(ST7735_BLUE); // Seta a cor do texto para Azul tft.print("Silicio"); // Escreve a palavra Silício, com a cor que foi setada na linha acima } void loop(){ tft.invertDisplay(true); // Inverte as cores que estão na tela delay(500); // Aguarda 0,5 segundos tft.invertDisplay(false); // Volta as cores originais delay(500); // Aguarda 0,5 segundos }
Colocando para funcionar
Veja o resultado que obtivemos.
Usando o Display TFT 1.8″ ST7735 na plataforma Arduino
As bibliotecas da Adafruit de uma maneira geral possuem um grau bastante elevado de extensibilidade, ou seja podem ser utilizadas em diversas plataformas, como o nodeMCU e também o arduino. Caso você necessite utilizar este mesmo display em outra plataforma, como por exemplo o arduino uno, basta com que siga o padrão de conexão mostrado na tabela abaixo:
Já no código, podemos eliminar a grande parte dos #DEFINES criados anteriormente, utilizando apenas três pinos para estabelecer a comunicação, após isso, o código será exatamente o mesmo de antes.
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library #define TFT_CS 10 #define TFT_RST 8 #define TFT_DC 9 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // Instância do objeto tipo Adafruit_ST7735 que recebe como argumentos os pinos de controle void setup(void){ tft.setCursor(0,30); // Move o cursor para a coluna 30 na linha 0 tft.initR(INITR_BLACKTAB); // Inicializa a tela com um fundo preto tft.setTextSize(2); // Seta o tamanho da fonte de texto para o tamanho 2 tft.fillScreen(ST7735_BLACK); // Preenche a tela com a cor preta tft.setTextColor(ST7735_BLUE); // Seta a cor do texto para Azul tft.print("Vida"); // Escreve a palavra Vida Com a cor que foi setada na linha acima tft.setTextColor(ST7735_WHITE); // Seta a cor do texto para Branco tft.print("De "); // Escreve a palavra Vida com a cor que foi setada na linha acima tft.setTextColor(ST7735_BLUE); // Seta a cor do texto para Azul tft.print("Silicio"); // Escreve a palavra Silício, com a cor que foi setada na linha acima } void loop(){ tft.invertDisplay(true); // Inverte as cores que estão na tela delay(500); // Aguarda 0,5 segundos tft.invertDisplay(false); // Volta as cores originais delay(500); // Aguarda 0,5 segundos }
E pronto, agora temos o mesmo código sendo executado no arduino
Entendendo a Fundo
Software
– Incluindo as bibliotecas a serem utilizadas no projeto
Inicialmente, observe que foi necessário incluir duas bibliotecas no código para que o mesmo pudesse funcionar corretamente. A biblioteca Adafruit_GFX.h fornece um conjunto de funções gráficas para telas LCD e OLED simplificando o uso desses displays.
A biblioteca Adafruit_GFX sempre trabalha em conjunto com uma segunda biblioteca fornecida para cada tipo específico de display, no nosso caso usamos a biblioteca para o controlador ST7735: Adafruit_ST7735.h.
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library
Existem vários tipos de versões de display com controladores diferentes. Para conseguir usar o seu display adequadamente, é fundamental que se saiba exatamente qual o controlador para que consiga encontrar as bibliotecas especificas para ele.
– Declarando o objeto tft
Em seguida, cria-se o objeto que é responsável por realizar a troca de mensagens entre o nodeMCU e o display. O método construtor da classe Adafruit_ST7735 recebe como parâmetros, os pinos responsáveis por interfacear a comunicação SPI entre o microcontrolador e o display.
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
Lembre-se: tft é apenas o nome que escolhemos, sendo assim, é importante ressaltar que, o objeto identificado por tft poderia ser chamado de qualquer outro nome, como por exemplo, lcd ou display, respectivamente.
– Movendo o cursor do LCD
tft.setCursor(0,30);
Essa função é responsável por mover o cursor responsável por escrever o texto na tela, neste caso o cursor será movido no eixo Y uma distância de 30 pixels da posição onde ela se encontra (no caso a posição 0,0), ficando este na posição (0,30).
– Inicializando a tela
Essa função inicializa o chip do controlador do display no caso o ST7735.
tft.initR(INITR_BLACKTAB);
– Definindo o tamanho da fonte
A biblioteca Adafruit_ST7735 conta com 5 tipos de tamanhos de fonte, sendo eles enumerados do menor 0 até o maior 5, e este valor sendo definido por um número inteiro.
tft.setTextSize(2);
– Preenchendo toda a tela com uma cor
A função fillScreen, como o próprio nome já diz, preenche tudo que está sob a tela com uma única cor, no caso sendo representada pelo define ST7735_NomedaCor.
tft.fillScreen(ST7735_BLACK);
– Definindo a cor do texto
De forma semelhante a função fillScreen, a função setTextColor muda a cor da fonte utilizada para escrever a mensagem desejada.
tft.setTextColor(ST7735_BLUE);
– Escrevendo na tela
A função print, escreve na tela o vetor de caracteres passados como parâmetro, porém é importante ressaltar que a cor e o tamanho da fonte serão sempre os últimos que foram setados antes da chamada desta função.
tft.print("Vida");
– Invertendo as cores do display
Já a função invertDisplay, inverte a cor de tudo que está sendo mostrado na tela no momento,caso o argumento repassado seja true, caso seja false a cor não será invertida, ou voltará ao estado original.
tft.invertDisplay(true);
Veja que nesse programa inicializamos e escrevemos na tela na função setup() que é executada apenas umas vez. Na função loop() interagimos com a tela invertendo as cores do LCD.
Para um aplicação prática, em geral iremos escrever valores variáveis, tais como temperatura ou vazão. Nesse caso iremos trabalhar com as funções gráficas do display dentro da função loop().
Desafio
O desafio, para este tutorial, consiste em utilizar a seguinte função:
void desenhaCirculos(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } }
Esta função possibilita o desenho de círculos em sequencia na tela, sendo estes espaçados com base em seu raio, ou seja, quanto menor o raio mais círculos teremos na tela, e quanto maior o raio, menos círculos serão desenhados na tela. Você consegue utilizando esta função desenhar círculos de tamanho variável na tela conforme o valor do raio varia ?
Considerações finais
Este tutorial, teve como objetivo apresentar um display muito utilizado como interface homem máquina em plataformas embarcadas. O seu baixo custo e bom funcionamento o tornam um módulo muito interessante de ser utilizado nos mais diversos tipos de aplicações, onde precisamos fornecer informações ao usuário. Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.
Formado em Ciência da computação pela UFV-CAF em 2017 e atualmente cursando pós-graduação Stricto Sensu em Ciência da computação pela Universidade Federal de Viçosa, na área de arquitetura de computadores. É um entusiasta na área de sistemas embarcados e robótica.
3 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Greetings
I have a sketch made for the ST7735 screen and I’m trying to adapt it to ILI9341 and rename all ST7735 to ILI9341 but, I get the following error: ‘class Adafruit_ILI9341’ has no member named ‘initR’ in the line “tft.initR ( INITR_BLACKTAB); ”
The Adafruit_ILI9341 library is installed correctly; Any tips? Or does this function not exist in that library? Hence the code cannot be adapted?
Thank you
Fiz uma pergunta, não obtive resposta e estou fazendo outra! (reconheço que a minha primeira questão se torna muito trabalhosa!)
Gostaria de saber se posso usar o seu sketch em um display tft 2.2 com ili9341; o que devo mudar no código; obrigado
Saudações Danilo! Tenho esse código de Relógio e Termômetro com um Display TFT 1.8″ ST7735 e gostaria de usá-lo em um Display TFT 2.2″ ILI9341; posso usar o mesmo código ou tem de ser feita alguma adaptação? você poderia me ajudar? (youtube: https://www.youtube.com/watch?v=Xs7H2SQPUHo&feature=em-comments)
/*
* original from http://www.instructables.com/id/Arduino-TFT-display-and-font-library/
* some changes by Nicu FLORICA (niq_ro) from http://www.tehnic.go.ro
*
An example digital clock using a TFT LCD screen to show the time.
Demonstrates use of the font printing routines. (Time updates but date does not.)
Now it use RTClib library bu Nicu FLORICA
This examples uses the hardware SPI only. Non-hardware SPI
is just too slow (~8 times slower!)
Based on clock sketch by Gilchrist 6/2/2014 1.0
Updated by Bodmer, using library from https://github.com/Bodmer/TFT_ST7735
A few colour codes:
code color
0x0000 Black
0xFFFF White
0xBDF7 Light Gray
0x7BEF Dark Gray
0xF800 Red
0xFFE0 Yellow
0xFBE0 Orange
0x79E0 Brown
0x7E0 Green
0x7FF Cyan
0x1F Blue
0xF81F Pink
*/
#include // Graphics and font library for ST7735 driver chip
#include
TFT_ST7735 tft = TFT_ST7735(); // Invoke library, pins defined in User_Setup.h
// see User_Setup.h: RST –> D7, CS –> D9, D/C –> D8, DIN –> D11, CLK –> D13
uint32_t targetTime = 0; // for next 1 second timeout
byte omm = 99;
boolean initial = 1;
byte xcolon = 0;
unsigned int colour = 0;
static uint8_t conv2d(const char* p) {
uint8_t v = 0;
if (‘0’ <= *p && *p <= '9')
v = *p – '0';
return 10 * v + *++p – '0';
}
//uint8_t hh=conv2d(__TIME__), mm=conv2d(__TIME__+3), ss=conv2d(__TIME__+6); // Get H, M, S from compile time
byte jos = 10;
#include
#include “RTClib.h”
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”};
int hh, mm, ss;
int yy, ll, dd, zz;
#define DS3231_I2C_ADDRESS 104
byte tMSB, tLSB;
float temp3231;
float temperatura, temperatura0;
void setup(void) {
tft.init();
tft.setRotation(1);
tft.fillScreen(ST7735_BLACK);
tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); // Note: the new fonts do not draw the background colour
Serial.begin(9600);
delay(3000); // wait for console opening
if (! rtc.begin()) {
Serial.println(“Couldn’t find RTC”);
while (1);
}
if (rtc.lostPower()) {
Serial.println(“RTC lost power, lets set the time!”);
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
targetTime = millis() + 1000;
}
void loop() {
tft.setTextSize(1);
if (targetTime < millis()) {
targetTime = millis()+1000;
DateTime now = rtc.now();
/*
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
*/
hh = now.hour(), DEC;
mm = now.minute(), DEC;
ss = now.second(), DEC;
yy = now.year(), DEC;
ll = now.month(), DEC;
dd = now.day(), DEC;
//zz = daysOfTheWeek[now.dayOfTheWeek()];
temperatura = get3231Temp();
tft.setTextSize(1);
if (ss==0 || initial) {
initial = 0;
tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
tft.setCursor (15, 52+jos);
// tft.print(__DATE__); // This uses the standard ADAFruit small font
tft.print(daysOfTheWeek[now.dayOfTheWeek()]);
tft.print(" – ");
tft.print(ll);
tft.print("/");
tft.print(dd);
tft.print("/");
tft.print(yy);
if (temperatura0 != temperatura)
{
for (int y=85; y < tft.height(); y+=1) {
tft.drawFastHLine(0, y, tft.width(), ST7735_BLACK);
}
int temperatura1 = temperatura;
float temperatura2 = 100*(temperatura – temperatura1);
tft.setTextSize(3);
tft.setTextColor(TFT_YELLOW);
tft.setCursor (30, 85+jos);
if (temperatura <10) tft.print(" ");
// tft.print(temperatura);
tft.print(temperatura1);
tft.print(".");
tft.setCursor (85, 90+jos);
tft.setTextSize(2);
if (temperatura2 == 0) tft.print("00");
else tft.print(temperatura2,0);
tft.setCursor (124, 85+jos);
tft.setTextSize(3);
tft.print("C");
tft.setTextSize(2);
tft.setCursor (110, 84+jos);
tft.print("O");
tft.setTextSize(1);
temperatura0 = temperatura;
}
}
// Update digital time
byte xpos = 6;
byte ypos = 0+jos;
if (omm != mm) { // Only redraw every minute to minimise flicker
// Uncomment ONE of the next 2 lines, using the ghost image demonstrates text overlay as time is drawn over it
//tft.setTextColor(ST7735_RED, ST7735_BLACK); // Leave a 7 segment ghost image, comment out next line!
tft.setTextColor(ST7735_BLACK, ST7735_BLACK); // Set font colour to back to wipe image
// Font 7 is to show a pseudo 7 segment display.
// Font 7 only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : .
tft.drawString("88:88",xpos,ypos,7); // Overwrite the text to clear it
tft.setTextColor(ST7735_RED, ST7735_BLACK); // Red
omm = mm;
if (hh<10) xpos+= tft.drawChar('0',xpos,ypos,7);
xpos+= tft.drawNumber(hh,xpos,ypos,7);
xcolon=xpos;
xpos+= tft.drawChar(':',xpos,ypos,7);
if (mm> 6) * 0.25 ); //only care about bits 7 & 8
}
else {
//oh noes, no data!
}
return temp3231;
}
Meus antecipados agradecimentos,