PROBLEMAS TACTIL TFT CON ARUDINO MEGA

Buenos Días,

He adquirido una pantalla TFT tactil (adjunto enlace)

https://es.aliexpress.com/item/Free-shipping-1pair-3pcs-3-2-TFT-LCD-Touch-TFT-3-2-inch-Shield-Mega-2560/32272760245.html?spm=2114.13010608.0.0.lj9uPH&detailNewVersion=&categoryId=400103

la pantalla en cuestión es de 3,2" y viene con su shield para adaptarla al ardunino mega. su resolución es de 240x320 con el controlador IC9341. He modificado la libreria UTFT para adapatarla a su resolución y he utilizado la librería tactil UTouch, incluso he ejecutado el programa de calibración de los ejemplos y todo va bien, salvando que una vez cargado el programa, he tenido que desconectar todo físicamente, arduino, shield y pantalla y volver a ensamblarlo para que funcione. (no entiendo porque)

Hasta ahí todo mas o menos solucionado y me he puesto con mi proyecto (quiero controlar con una pantalla táctil en el puesto de mando de un barco, periféricos en la sala de maquinas con otro arduino en serie con el de la pantalla táctil)

La pantalla lleva varios menús, pero ... no tengo manera de hacer que funcione el táctil

Os cuento mis pasos ante mi desesperación inicializo todas las librerias y variables que de momento voy necesitando.

También genero una pequeña rutina, para que resalte los botones cada vez que pulso táctilmente

#include <UTFT.h> // Carga la librería TFT de la pantalla
#include <UTouch.h> // Carga la librería Tactil
UTFT    myGLCD(ILI9327,38,39,40,41); //Define la pantalla como myGLCD y asigna pines
UTouch  myTouch( 6, 5, 4, 3, 2); // Define el táctil como myTouch y asigna pines
extern uint8_t SmallFont[]; // Carga las Fuentes Smallfonts
extern uint8_t Arial_round_16x24[]; // Carga la Fuente Arial 16
extern uint8_t BigFont[]; // Carga la Fuente BigFont
extern uint8_t TinyFont[]; // Carga Fuente la TinyFont

int x , y ;
char currentPage;

Después creo las diferentes pantallas

void pantallaGeneral()
{
  myGLCD.clrScr(); //Borra la pantalla
  myGLCD.fillScr(0,0,0); //Pone la pantalla en negro
  myGLCD.setFont (Arial_round_16x24);
  myGLCD.setColor (0,0,255); //Asigno color azul
  myGLCD.fillRoundRect (11,198,309,227); //Barra inferior
  myGLCD.fillRoundRect (11,11,101,180); // CuadroIzda
  myGLCD.fillRoundRect (118,11,205,180); // Cuadrocentro
  myGLCD.fillRoundRect (219,11,309,180); // Cuadro sup dcha
  myGLCD.setColor (255,255,255); //Asigno color blanco
  myGLCD.drawRoundRect (11,198,309,227);//Marco Barra inferior
  myGLCD.drawRoundRect (11,11,101,180); // Marco Izda
  myGLCD.drawRoundRect (118,11,205,180); // Marco centro
  myGLCD.drawRoundRect (219,11,309,180); // Marco dcha
  myGLCD.print ("AJUSTES",CENTER,202);
  myGLCD.print ("ELECTRON.",250,170,270);
  myGLCD.print ("INTERIOR",45,165,270);
  myGLCD.print ("EXTERIOR",145,165,270);
}


void pantallaInterior()
{
  myGLCD.clrScr(); //Borra la pantalla
  myGLCD.fillScr(0,0,0); //Pone la pantalla en negro
  myGLCD.setFont (Arial_round_16x24);
  myGLCD.setColor (0,0,255); //Asigno color azul
  myGLCD.fillRoundRect (11,198,309,227); //Barra inferior
  myGLCD.fillRoundRect (11,11,140,180); // Cuadro Potenciometro
  myGLCD.fillRoundRect (150,11,309,90); // Cuadro sup dcha
  myGLCD.fillRoundRect (150,101,309,180); // Cuadro inf dcha
  myGLCD.setColor (255,255,255); //Asigno color blanco
  myGLCD.drawRoundRect (11,198,309,227);//Marco Barra inferior
  myGLCD.print ("MENU PRINCIPAL",CENTER,202);
  myGLCD.print ("LUCES",188,30);
  myGLCD.print ("PUENTE",179,50);
  myGLCD.print ("LUCES",188,120);
  myGLCD.print ("CONSOLA",170,140);
  myGLCD.drawRoundRect (11,11,140,180);// Marco Cuadro Potenciometro
  myGLCD.drawRoundRect (150,11,309,90); // Marco Cuadro sup dcha
  myGLCD.drawRoundRect (150,101,309,180); // Matco Cuadro inf dcha
  myGLCD.setFont (BigFont); 
  myGLCD.setColor (VGA_YELLOW); //Asigno color amarillo
  myGLCD.fillRoundRect (21,21,131,170);
  myGLCD.print ("DIMMER",25,160);
}

void pantallaExterior()
{
  myGLCD.clrScr(); //Borra la pantalla
  myGLCD.fillScr(0,0,0); //Pone la pantalla en negro
  myGLCD.setFont (Arial_round_16x24);
  myGLCD.setColor (0,0,255); //Asigno color azul
  myGLCD.fillRoundRect (11,198,309,227); //Barra inferior
  myGLCD.fillRoundRect (11,11,101,90); // Cuadro Sup Izda
  myGLCD.fillRoundRect (11,101,101,180); // Cuadro Inf Izda
  myGLCD.fillRoundRect (118,11,205,90); // Cuadro sup centro
  myGLCD.fillRoundRect (118,101,205,180); // Cuadro inf centro
  myGLCD.fillRoundRect (219,11,309,90); // Cuadro sup dcha
  myGLCD.fillRoundRect (219,101,309,180); // Cuadro inf dcha
  myGLCD.setColor (255,255,255); //Asigno color blanco
  myGLCD.drawRoundRect (11,198,309,227);//Marco Barra inferior
  myGLCD.drawRoundRect (11,11,101,90); // Marco Sup Izda
  myGLCD.drawRoundRect (11,101,101,180); // Marco Inf Izda
  myGLCD.drawRoundRect (118,11,205,90); // Marco sup centro
  myGLCD.drawRoundRect (118,101,205,180); // Marco inf centro
  myGLCD.drawRoundRect (219,11,309,90); // Marco sup dcha
  myGLCD.drawRoundRect (219,101,309,180); // Marco inf dcha
  myGLCD.print ("MENU PRINCIPAL",CENTER,202);
  myGLCD.print ("NAV",240,40);
  myGLCD.print ("FOND.",225,130);
  myGLCD.print ("LUZ",30,30);
  myGLCD.print ("PROA",25,50);
  myGLCD.print ("LUZ",30,120);
  myGLCD.print ("POPA",25,140);
  myGLCD.print ("FOCO",125,40);
  myGLCD.print ("VENT.",125,130);
}

void pantallaElectronica()
{
  myGLCD.clrScr(); //Borra la pantalla
  myGLCD.fillScr(0,0,0); //Pone la pantalla en negro
  myGLCD.setFont (Arial_round_16x24);
  myGLCD.setColor (0,0,255); //Asigno color azul
  myGLCD.fillRoundRect (11,198,309,227); //Barra inferior
  myGLCD.fillRoundRect (11,11,101,90); // Cuadro Sup Izda
  myGLCD.fillRoundRect (11,101,101,180); // Cuadro Inf Izda
  myGLCD.fillRoundRect (118,11,205,90); // Cuadro sup centro
  myGLCD.fillRoundRect (118,101,205,180); // Cuadro inf centro
  myGLCD.fillRoundRect (219,11,309,90); // Cuadro sup dcha
  myGLCD.fillRoundRect (219,101,309,180); // Cuadro inf dcha
  myGLCD.setColor (255,255,255); //Asigno color blanco
  myGLCD.drawRoundRect (11,198,309,227);//Marco Barra inferior
  myGLCD.drawRoundRect (11,11,101,90); // Marco Sup Izda
  myGLCD.drawRoundRect (11,101,101,180); // Marco Inf Izda
  myGLCD.drawRoundRect (118,11,205,90); // Marco sup centro
  myGLCD.drawRoundRect (118,101,205,180); // Marco inf centro
  myGLCD.drawRoundRect (219,11,309,90); // Marco sup dcha
  myGLCD.drawRoundRect (219,101,309,180); // Marco inf dcha
  myGLCD.print ("MENU PRINCIPAL",CENTER,202);
  myGLCD.print ("VHF",240,40);
  myGLCD.print ("RADAR",225,130);
  myGLCD.print ("SONDA",17,40);
  myGLCD.print ("PLOT.",20,130);
  myGLCD.print ("AIS",140,40);
  myGLCD.print ("MUSIC",123,130);
}


void drawFrame(int x1, int y1, int x2, int y2) // Resalta los botones al pulsarlos
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (x1, y1, x2, y2);
}

luego genero el setup

void setup() {
  
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
myGLCD.InitLCD(); //Inicializo la pantalla
myGLCD.clrScr(); //Borra la pantalla
myGLCD.setBackColor(0, 0, 255);  

pantallaInterior();
currentPage = '0'; // Asume pantallaInterior como pantalla de incio

}

y definitivamente empiezo con el loop

void loop() {

if( currentPage  == "0") {
   if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX(); // coordenada X donde presiono
      y=myTouch.getY(); // coordenada y donde presiono
      if ( (x>15) && (x<300) && (y>199) && (y<229)) {//Coordenadas boton "MENU PRINCIPAL"
        drawFrame(11,198,309,227);//Resalta botón
        currentPage = '1';
        myGLCD.clrScr();
        pantallaGeneral();
      }
      if ((x>150) && (x<309) && (y>11) && (y<90)) {; // Coordenadas Cuadro sup dcha
      drawFrame(150,11,309,90); //resalta botón
      myGLCD.setColor (255,0,0); //Color rojo
      myGLCD.fillRect(299,16,309,85); //Piloto indicativo (rectangulo rojo)
      }
      if ((x>150) && (x<309) && (y>101) && (y<180)) {; // Coordenadas Cuadro sup dcha
      drawFrame(150,101,309,180); //resalta botón
      myGLCD.setColor (255,0,0); //Color rojo
      myGLCD.fillRect(299,106,309,175); //Piloto indicativo (rectangulo rojo)
      }     
}
}
}

pues bien, ni flores ... me podéis ayudar donde esta el fallo, el programa me compila bien sin proboemas

también me vendría bien saber donde me podría descargar tipos de letra (fonts) para esta pantalla y estas librerias.

Saludos,

(PD. soy muy nuevo en estas lides. si digo autenticas burradas, pido discupas de antemano)

Mi primer sugerencia: no uses este tipo de proyectos para cuestiones que tengan algo que ver con seguridad y por favor realiza pruebas todo el tiempo.

Respecto al problema que mencionas: ese fallo no tiene que ver con la calibración de la pantalla táctil, y no se puede resolver con una rutina en tu sketch, es posible que los chips XPT que se usaron cuando se diseño la librería ya no se sigan instalando en las pantallas actuales.

No hay otra forma que desconectar el arduino de la alimentación y cruzar los dedos para que al volverlo a activar funcione la pantalla táctil.

Te dejo un ejemplo de como puedes manejar menus con la librería UTFT

PD: ese bug es una de las razones por las que no seguí usando la librería UTFT. Si has leído otros post de un servidor, ya sabes que sugerencia de pantalla tengo para que mejores las prestaciones de tu proyecto.

Lo primero de todo, muchas gracias por tu tiempo.

La pantalla de calibración funciona bien, solo que después de cargar el programa has de desconectarlo todo y volver a conectarlo.

He probado con algún programa demo en el que básicamente lo hacían como yo, y me funcionaba perfectamente. osea que la pantalla no es, aunque evidente mente estoy bastante decepcionado con ella.

El ejemplo que tu me da el error:

exit status 1
Error compilacion en targeta Arduino/Genuino Mega or Mega 2560

con lo cual no lo puedo probar, y debido a mi ignorancia, no puedo saber como aprovechar la informacion leyendo solo el código.

Pero muchas gracias.

Si decidiese tirar la pantalla a la basura, que pantalla me recomendarías que fuese de mas de 3,2 pulgadas y que su coste no se salga de madre?

Básicamente solo quiero la pantalla para encender y apagar elementos del barco. aunque el proyecto incluye tambien botoneras manuales por si las fly.

No me gusta tirar la pasta, pero si la pantallas es una caquita, me desharé de ella

gracias, gracias. muchas gracias y un saludo desde Asturias

Estoy valorando en mandarlo todo a paseo y comprarme una pantalla Nextion

la NEXTION NX4827T043

https://es.aliexpress.com/store/product/4-3-Nextion-HMI-Intelligent-Smart-USART-UART-Serial-TFT-LCD-Module-Display-w-Touch-Panel/900905_32447988844.html?detailNewVersion=&categoryId=400401&spm=2114.12010408.1000023.5.8vKv48

o bien la NEXTION NX482KT043

Que opinas?

Hola amigo.

Te sugiero que valores mis enlaces.
Son pantallas basadas en chip FTDI. Yo las tengo y funcionan muy finas, ademas de extras. Son de 5 pulgadas.

FT800

Y si quieres resolucion 800x480;

FT810

Saludos.
P.D. Son mas baratas y con soporte librería GD2/3

muchas gracias, voy a mirar esa pantalla, y valorar que hago.

te dire cosas.

Y pierde un poco mas de tiempo leyendo este enlace y saldrás de dudas.