Manual
do
Maker
.
com
O display ILI9341 touch é um display incrível para usar com Arduino ou qualquer outra MCU com barramento SPI. Mas o que realmente faz valer a pena utilizar esse display é a biblioteca utilizada, que pode fazer toda a diferença. Nesse artigo vou citar brevemente duas dicas e no projeto surpresa que estou quase concluindo, mostro mais a respeito.
A biblioteca que recomendo é a TFT_eSPI. Ela é um espetáculo: fácil de usar e tem montes de exemplos, que podem inclusive servir de base para seus projetos. Instale-a através do gerenciador de bibliotecas, seja na IDE do Arduino ou PlatformIO em alguma outra IDE.
Tem várias formas de fazê-lo. Dá pra guardar os parâmetros na EEPROM, no sistema de arquivos do ESP8266/ESP32, ou simplesmente armazená-las estaticamente. Apesar de estar utilizando ESP32 para o projeto surpresa, preferi armazenar em variável mesmo.
Para calibrar é muito simples; copie o sketch a seguir. Claro que seu display já deve estar devidamente conectado, mas como estou utilizando a AFSmartControl para interagir com esse display, não preciso sequer saber o pinout. De qualquer modo, vou dar umas dicas.
Após subir esse sketch, toque nos cantos do display conforme for solicitado. Ao final será exibido na serial as linhas para adicionar em setup().
/*
Sketch to generate the setup() calibration values, these are reported
to the Serial Monitor.
The sketch has been tested on the ESP8266 and screen with XPT2046 driver.
*/
#include <Arduino.h>
#include <SPI.h>
#include <TFT_eSPI.h> // Hardware-specific library
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
void touch_calibrate();
//------------------------------------------------------------------------------------------
void setup() {
// Use serial port
Serial.begin(9600);
// Initialise the TFT screen
tft.init();
// Set the rotation before we calibrate
tft.setRotation(0);
// Calibrate the touch screen and retrieve the scaling factors
touch_calibrate();
/*
// Replace above line with the code sent to Serial Monitor
// once calibration is complete, e.g.:
uint16_t calData[5] = { 286, 3534, 283, 3600, 6 };
tft.setTouch(calData);
*/
// Clear the screen
tft.fillScreen(TFT_BLACK);
tft.drawCentreString("Touch screen to test!",tft.width()/2, tft.height()/2, 2);
}
//------------------------------------------------------------------------------------------
void loop(void) {
uint16_t x = 0, y = 0; // To store the touch coordinates
// Pressed will be set true is there is a valid touch on the screen
boolean pressed = tft.getTouch(&x, &y);
// Draw a white spot at the detected coordinates
if (pressed) {
tft.fillCircle(x, y, 2, TFT_WHITE);
//Serial.print("x,y = ");
//Serial.print(x);
//Serial.print(",");
}
}
//------------------------------------------------------------------------------------------
// Code to run a screen calibration, not needed when calibration values set in setup()
void touch_calibrate()
{
uint16_t calData[5];
uint8_t calDataOK = 0;
// Calibrate
tft.fillScreen(TFT_BLACK);
tft.setCursor(20, 0);
tft.setTextFont(2);
tft.setTextSize(1);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.println("Touch corners as indicated");
tft.setTextFont(1);
tft.println();
tft.calibrateTouch(calData, TFT_MAGENTA, TFT_BLACK, 15);
Serial.println(); Serial.println();
Serial.println("// Use this calibration code in setup():");
Serial.print(" uint16_t calData[5] = ");
Serial.print("{ ");
for (uint8_t i = 0; i < 5; i++)
{
Serial.print(calData[i]);
if (i < 4) Serial.print(", ");
}
Serial.println(" };");
Serial.print(" tft.setTouch(calData);");
Serial.println(); Serial.println();
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.println("Calibration complete!");
tft.println("Calibration code sent to Serial port.");
delay(4000);
}
A primeira coisa a fazer após instalar a biblioteca é editar o arquivo User_Setup.h. Nesse arquivo, apenas confirme que o padrão é o display ILI9341. Depois, se assim como eu, estiver usando ESP32, procure pela respectiva seção.
Procure por EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP e defina os pinos conforme seu wiring. Como estou utilizando a AFSmartControl, o pinout fica sendo:
#define TOUCH_CS 33 // OK
#define TFT_MISO 19 // OK
#define TFT_MOSI 23 // OK
#define TFT_SCLK 18 // OK
#define TFT_CS 12 // ERA 33
#define TFT_DC 2 // OK
#define TFT_RST 4 // INDEFINIDO
#define TFT_RST -1 // INDEFINIDO
Essa é uma dúvida dolorosa e está relacionada ao padrão de cores suportado pelo display.
O RGB que costumamos interagir normalmente é 24 bits, ou 3 bytes, ou "RGB888". Só que esse display trabalha com RGB565. Os pixels do RGB565 têm 5 bits para vermelho, 6 bits para verde e 5 bits para azul. Desse modo, temos um total de 16 bits, que é um número hexadecimal de 4 dígitos. Por essa razão não é nada intuitivo definir as cores manualmente. Para nossa sorte, a biblioteca TFT_eSPI oferece uma função que converte o RGB888 para RGB565. Então, ao invés de usarmos as cores predefinidas desse modo:
tft.fillRect(5, 130, 230, 20, TFT_VIOLET);
Podemos escolher qualquer cor desejada, passando-a dessa maneira para a função (ex: 120,220,20):
tft.fillRect(5, 130, 230, 20, tft.color565(120,220,20));
Com alguns bits a menos, a representação visual fica um pouco empobrecida, mas é o suficiente para reconhecer a tonalidade à contento.
Como não quero dar muita dica sobre o projeto que estou preparando para artigo, deixo apenas a imagem de destaque como referência, mas acredite, será um espetáculo!
Esse display e essa placa estão disponíveis no site da AFEletronica, basta dar uma olhada por lá.
Já escrevi sobre a AFSmartControl e se quiser saber mais a respeito, leia esse artigo.
Espero que acompanhe o blog, a surpresa relacionada a esse display será incrível!
Revisão: Ricardo Amaral de Andrade
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.