Algunos consejos para usar TFT´s

Esperemos que ayude a mas de uno a mejorar sus proyectos, vamos con el siguiente punto.

Creación de menús con la pantalla táctil

La mayoría de TFT´s disponibles tienen pantallas táctiles resistivas. Debo aclarar que existen dos tipos de cableado: uno de ellos fue diseñado para funcionar en el arduino UNO y emplea cuatro hilos generalmente dos pines analógicos y dos pines digitales, resulta algo confuso ponerlo a punto ya que hay que asignar manualmente y por prueba y error el valor de la resistencia de referencia de la pantalla táctil. Usan chips tanto XPT2046 como STMPE610, su funcionamiento es complejo y aun hoy no he podido llegar a conocerlos bien.

La otra variante en la que se conecta el XPT2046, emplea 5 lineas: TCLK, TCS, TDIN, TDOUT, IRQ. A pesar de que el nombre de cada pin podría señalar a la pantalla táctil como un dispositivo SPI, esto no es así, gracias a la librería Utouch diseñada por Henning Karlsen, la pantalla puede ser controlada por completo con pines digitales. En el Due o MEGA se puede usar cualquiera de ellos. No es necesario el empleo de conversores lógicos 5-3.3 V, ya que la pantalla se comporta igual tanto en arduinos como el UNO o MEGA, e incluso el Due.

No he podido conseguir TFT con pantallas táctiles capacitivas, aun tengo mucho por aprender de ellas.
Me centraré en pantallas con chip XPT2046 y 5 hilos. Asumiré que ya tenemos la tripleta de calibración que podemos conseguir del ejemplo Utouch_Calibration.

Para usar la pantalla táctil dentro de un sketch, las lineas de código básicas son

Inicio del encabezado

#include <UTouch.h>   // touch lib   XPT2046

Antes de la definición de variables generales

//touch panel (TCLK, TCS, TDIN, TDOUT, IRQ)
UTouch  myTouch(6,5,4,3,2);

Estas variables generales posibilitarán el acceso a las coordenadas de la pantalla táctil

int x, y;

En el setup(), hay que incluir estas lineas:

   myTouch.InitTouch();
    myTouch.setPrecision(PREC_HI);

Hay 4 modos para esta linea: LOW, MEDIUM, HI y EXTREME, la que mejor se comporta es la HI.

La mejor forma de usar la pantalla táctil es dividirla en segmentos rectangulares, dentro de bucles de espera que responden al cambio de alguna coordenada xy de la pantalla táctil. De esta forma podemos usar toda la pantalla o solo segmentos de ella.

Sugiero diseñar cada menú como una función independiente, de esta forma podemos usar la pantalla táctil completa en cada menu, sin que se superpongan secciones táctiles remanentes.

void Menubase()
{
    //Instrucciones que solo se usan una vez al activar el menu: fondos de pantalla, valores iniciales de una variable, imagenes BMP, texto inicial, encabezados, distribución de botones. 
    
    while (true)
      {

//Instrucciones que llaman secciones de programa que cambian con el tiempo: la hora de un reloj, la lectura de algún sensor, acción con algún led, por ejemplo


        if (myTouch.dataAvailable())
           {

//Instrucciones que dependen de la presión de algún segmento de la pantalla táctil
              myTouch.read();
              x=myTouch.getX();
              y=myTouch.getY();        


//Segmentos de pantalla táctil para accesar a nuevos menús o bien manipular algún deslizador o icono

// MenuX              
        if ((y>=y11) && (y<=y12)) 
           {      
          if ((x>=x11) && (x<=x12)) 
             {        
                Redbox24SPI(x11,y11,x12,y12);                
                MenuX();
             }
           }    
//End Menu X

           }

      }
}

Esta función podemos usarla para crear el menu principal y también permite crear todos los menus que necesitemos en el proyecto, usando cualquier parte de la pantalla

Sugiero usar segmentos acotados con valores específicos, con la idea de no cargar de variables cada sketch, en el ejemplo uso variables para cada segmento táctil debido a que me resultó muy cómodo para diseñar menus rápidos.

El dibujo de botones lo podemos lograr usando funciones generales como esta:

void button24SPI(int x1, int y1, int x2, int y2, uint16_t color)
{
  tft.fillRoundRect(x1,y1,(x2-x1),(y2-y1),3,color);  
  tft.drawRoundRect(x1,y1,(x2-x1),(y2-y1),3,WHITE);  
}

Para resaltar los botones que pulsamos, recomiendo usar una función indicadora como esta:

void Redbox24SPI(int x1, int y1, int x2, int y2)
{
  tft.drawRoundRect(x1,y1,(x2-x1),(y2-y1),3,RED);  
  
  while (myTouch.dataAvailable())
  myTouch.read();
  tft.drawRoundRect(x1,y1,(x2-x1),(y2-y1),3,RED);  
}

Así podremos "tener la sensación de tocar" el botón cuando lo pulsamos

Este es el sketch completo MEGA menu

Funciona con la librería ILI9341_due versión 094, tanto en Due como en MEGA, incluso funciona en el arduino UNO. Las pantallas en las que funciona directamente son estas: ILI9341 2.4" o ILI9341 2.8".

Con algunos ajustes también puede funcionar en pantallas que funcionan con la librería UTFT, como las basadas en el chip SSD1986 o bien ILI9325D/C, ya que casi todas tiene el chip XPT2046 con 5 hilos de control

Funcionamiento de algunos ejemplos:
Calibración de la pantalla táctil
Botón táctil de encendido/apagado de la PC
Menu 1
Menu 2

En la siguiente: diseño de barras deslizantes que funcionan con la pantalla táctil