Display ILI9341 touch

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.

Como calibrar o display ILI9341 touch

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);
}

Pinout do display ILI9341

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

Como passar cores RGB para o display ILI9431 ?

Antes, o “merchan”. Se está procurando um livro de ESP32, recomendo o do Pedro, me identifico com o raciocínio dele.

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!

Onde comprar o display ILI9341 touch ?

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

Djames Suhanko

Sobre o autor: Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.