No me funciona mi primer menu para tft tactil de 2,4"

Buenas noches, como prometí en el hilo anterior y muy a pesar mio regreso necesitando ayuda para que funcione el menú de mi proyecto.
Desde el ultimo post estoy enrredao buscando ideas en internet para confeccionar mi menú, empollando manuales y demás. Me puse manos a la obra y tengo confeccionado toda la parte de gráficos y del táctil , pero no consigo relacionar la parte funcional para que el menú actúe como debe. También me falta el que funcionen los números para introducir los datos necesarios.
El esquema del menú es simple: Pantalla principal con un mensaje, al pulsar la pantalla pasa a la pantalla numérica para introducir un valor y al pulsar validar en esta, tiene que pasar a una tercera pantalla con otro mensaje en la cual al volver a tocarla pasara fe nuevo a la pantalla numérica,por ultimo al pulsar otra vez validar debe pasar a la pantalla de inicio.
La teoría bien ... en la practica no consigo pasar de la primera pantalla.
He tratado por todos los medios de hacerlo funcionar pero no hay manera ...
A ver si alguien puede echarle un ojo y decirme que narices hago mal.
Muchísimas gracias por adelantado como siempre .

#include <SPFD5408_Adafruit_GFX.h>    // Libreria de graficos
#include <SPFD5408_Adafruit_TFTLCD.h> // Libreria de LCD 
#include <SPFD5408_TouchScreen.h>     // Libreria del panel tactil

 //pines del panel tactil

#define YP A1   
#define XM A2  
#define YM 7       
#define XP 6         

// Definimos la presion máxima y minima que podemos realizar sobre el panel
#define MINPRESSURE 10
#define MAXPRESSURE 1000

 
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 410); 

short TS_MINX=172;
short TS_MINY=173;
short TS_MAXX=966;
short TS_MAXY=927; 

#define LCD_CS A3   // Definimos los pines del LCD
#define LCD_CD A2   // para poder visualizar elementos graficos
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4


#define  BLACK     0x0000  // Definimos los colores 
#define BLUE      0x001F  // que utilizaremos para
#define BLUE2     0x051F 
#define RED       0xF800  // el texto y los elementos graficos
#define GREEN     0x07E0
#define CYAN      0x07FF
#define MAGENTA   0xF81F
#define YELLOW    0xFFE0
#define WHITE     0xFFFF
#define DARKGREY  0x7BEF
#define ORANGE    0xFD20
#define RED2      0xFE4832

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);       // Instancia LCD

int X; // Variables que almacenaran la coordenada
int Y; // X, Y donde presionemos y la variable Z 
int Z; // almacenara la presion realizada
int posicion = 0;                                                      
int menu = 0;

boolean lineascr = false;
boolean cantidadscr = false;
boolean validar = false;
//boolean validar2 = false;
char pulsacion =0;


void setup() 
{ 
    tft.begin(0x9341);
    menu0 ();
    
}

void menu0 ()                      // GRAFICOS PANTALLA SELECCION LINEA


                                                
  {  
    tft.fillScreen(ORANGE);
    tft.drawRoundRect(0, 0, 240, 319, 8, WHITE);     
    tft.setCursor(31,60); 
    tft.setTextSize(3);
    tft.print("SELECCIONE");
    tft.setCursor(44,140);
    tft.print("UNA LINEA");
    tft.setCursor(50,230);
    tft.print("A CARGAR");
    lecturaPanel();
    lecturamenu0();
    lineascr = true ;
  }

void menu1 ()
                   // GRAFICOS PANTALLA SELECCION CANTIDAD
  
    {
    tft.fillScreen(ORANGE);
    tft.drawRoundRect(0, 0, 240, 319, 8, WHITE);     
    tft.setCursor(30,60); 
    tft.setTextSize(3);
    tft.print("SELECCIONE");
    tft.setCursor(50,140);
    tft.print("CANTIDAD");
    tft.setCursor(50,230);
    tft.print("A CARGAR");
    lecturaPanel();
    lecturamenu1();
    cantidadscr = true ;
    }

void menuTeclado ()

                    // GRAFICOS MENU TECLADO
    
    {
    tft.fillScreen(RED2);
    tft.drawRoundRect(30,10, 180, 80,5, WHITE);  
    tft.fillRoundRect(31,11, 178, 78,5, DARKGREY);

    tft.drawRoundRect(10,130,60,30,5, WHITE);tft.drawRoundRect(90,130,60,30,5, WHITE);tft.drawRoundRect(170,130,60,30,5, WHITE); 
    tft.drawRoundRect(10,180,60,30,5, WHITE);tft.drawRoundRect(90,180,60,30,5, WHITE);tft.drawRoundRect(170,180,60,30,5, WHITE); // BOTONES DIGITOS
    tft.drawRoundRect(10,230,60,30,5, WHITE);tft.drawRoundRect(90,230,60,30,5, WHITE);tft.drawRoundRect(170,230,60,30,5, WHITE);       
    tft.drawRoundRect(10,280,60,30,5, WHITE);tft.drawRoundRect(90,280,60,30,5, WHITE);tft.drawRoundRect(170,280,60,30,5, WHITE);

    tft.fillRoundRect(11, 131,58, 28, 5, ORANGE);tft.fillRoundRect(91,131,58,28,5, ORANGE);tft.fillRoundRect(171,131,58,28,5, ORANGE);
    tft.fillRoundRect(11, 181,58, 28, 5, ORANGE);tft.fillRoundRect(91,181,58,28,5, ORANGE);tft.fillRoundRect(171,181,58,28,5, ORANGE);
    tft.fillRoundRect(11, 231,58, 28, 5, ORANGE);tft.fillRoundRect(91,231,58,28,5, ORANGE);tft.fillRoundRect(171,231,58,28,5, ORANGE);//MARCO BOTONES DIGITOS
    tft.fillRoundRect(11, 281,58, 28, 5, ORANGE);tft.fillRoundRect(91,281,58,28,5, ORANGE);tft.fillRoundRect(171,281,58,28,5, ORANGE);

    tft.setTextSize(3);tft.setTextColor(WHITE);
 
    tft.setCursor(32, 135);tft.print("1"); tft.setCursor(112, 135);tft.print("2"); tft.setCursor(192, 135);tft.print("3"); 
    tft.setCursor(32, 185);tft.print("4"); tft.setCursor(112, 185);tft.print("5"); tft.setCursor(192, 185);tft.print("6"); //DIGITOS Y LETRAS
    tft.setCursor(32, 235);tft.print("7"); tft.setCursor(112, 235);tft.print("8"); tft.setCursor(192, 235);tft.print("9"); 
    tft.setCursor(20, 285);tft.print("RS");tft.setCursor(112, 285);tft.print("0"); tft.setCursor(175, 285);tft.print("VAL"); 
    lecturaPanel();
    lecturamenuTeclado();
    validar = true ;
}  
  
void lecturaPanel()                                                 
{
    TSPoint p = ts.getPoint(); // Realizamos lectura de las coordenadas

  
    pinMode(XM, OUTPUT); // La librería utiliza estos pines como entrada y salida
    pinMode(YP, OUTPUT); // por lo que es necesario declararlos como salida justo
                         // despues de realizar una lectura de coordenadas.    

    X = map(p.x,TS_MINX  ,TS_MAXX, 0, tft.width());
    Y = map(p.y, TS_MINY ,TS_MAXY, 0, tft.height());
    Z = p.z;
}
void lecturamenu0()
{
if((X > 5 && X < 235) && (Y > 5 && Y < 315) && (Z > MINPRESSURE && Z < MAXPRESSURE)){lineascr = 0;}
    if(Z < MINPRESSURE ){pulsacion =0;delay(50);}
}
void lecturamenu1()
{
if((X > 5 && X < 235) && (Y > 5 && Y < 315) && (Z > MINPRESSURE && Z < MAXPRESSURE)){cantidadscr = 0;}
    if(Z < MINPRESSURE ){pulsacion =0;delay(50);}
}

void lecturamenuTeclado()
{
  if((X > 10 && X < 70) && (Y > 100 && Y < 130) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion= '1';}
    if((X > 90 && X < 150) && (Y > 100 && Y < 130) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '2' ;}
    if((X > 170 && X < 230) && (Y > 100 && Y < 130) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '3' ;}

    if((X > 10 && X < 70) && (Y > 150 && Y < 180) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '4' ;}
    if((X > 90 && X < 150) && (Y > 150 && Y < 180) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '5' ;}
    if((X > 170 && X < 230) && (Y > 150 && Y < 180) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '6' ;}

    if((X > 10 && X < 70) && (Y > 200 && Y < 230) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '7' ;}
    if((X > 90 && X < 150) && (Y > 200 && Y < 230) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '8' ;}
    if((X > 170 && X < 230) && (Y > 200 && Y < 230) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '9' ;}

    if((X > 10 && X < 70) && (Y > 250 && Y < 280) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '*' ;}
    if((X > 90 && X < 150) && (Y > 250 && Y < 280) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '0' ;}
    if((X > 170 && X < 230) && (Y > 250 && Y < 280) && (Z > MINPRESSURE && Z < MAXPRESSURE)){pulsacion = '#' ;}
    if(Z < MINPRESSURE ){pulsacion =0;} 
  
}

void loop()
{ 
 if ( pulsacion == lecturamenu0){menuTeclado();} // pasa de menu0(seleccione linea a cargar)a menu teclado
 if ( pulsacion == lecturamenu1){menuTeclado();} // pasa de menu1(seleccione cantidad a cargar) a menu teclado
if ( pulsacion == '#') {menu1();}// pasa de menuteclado a cantidad a cargar
if ( pulsacion == '#') {menu0();}// pasa de teclado a linea a cargar




 
}

Bueno, lindo problema para analizar.

  1. Lo primero para corregir es esto en tu loop
if (pulsacion == '#') {
 menu1();}// pasa de menuteclado a cantidad a cargar
 if (pulsacion == '#') {
 menu0();}// pasa de teclado a linea a cargar

llama a menu1 y a menu0 o sea, solo a menu0.

Ya tienes por donde empezar supongo.

  1. Porque haces consultas tan largas?
    No es mas fácil en lugar de esto
	if ((X > 10 && X < 70) && (Y > 100 && Y < 130) && (Z > MINPRESSURE && Z < MAXPRESSURE)){
		pulsacion= '1';

crear un vector con los datos que corresponde a cada digito y solo preguntar si estan dentro de un loop?

algo asi

int coord[][4] = {{ 10,   70, 100, 130}, // eso para el primer caso '1'
                          { 90, 150, 100, 130},

                           // continua hasta
                          {170, 230, 250, 280}
                         };
char valor[] = {'1','2','3','4','5','6','7','8','9','*','0','#'};

Eso irá como global
y en tu void lecturamenuTeclado()

void lecturamenuTeclado() {
       for (int i= 0; i<11; i++) {
             if (Z > MINPRESSURE && Z < MAXPRESSURE)
                if (X > coord[i][0] && X < coord[i][1] && Y > coord[i][2] && Y < coord[i][3])
                    pulsacion = valor[i];                    
                
       }
}

Lo mismo pudo haberse guardado en una estructura struct pero como dije es lo mismo.

  1. Veo que usas mayúscalas para Variables y Constantes. Pues te diré que esta mal.
    Variables se escriben con minúscula
    Constantes con mayúsculas.
    No uses X, Y, Z, usa en su lugar x, y, z.

Yo seguí tu ejemplo para que se entienda.

Estas estan bien

#define MINPRESSURE 10
#define MAXPRESSURE 1000

#define LCD_CS A3   // Definimos los pines del LCD
#define LCD_CD A2   // para poder visualizar elementos graficos
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Estas estan mal

int X; // Variables que almacenaran la coordenada
int Y; // X, Y donde presionemos y la variable Z
int Z; // almacenara la presion realizada

Luego otras usaste minúsculas. Bien, déjalas asi.

Buenos días,antes de nada agradecerte las molestias en contestar y ayudarme.

  1. Lo primero para corregir es esto en tu loop

Code: [Select]

if (pulsacion == '#') {

menu1();}// pasa de menuteclado a cantidad a cargar
if (pulsacion == '#') {
menu0();}// pasa de teclado a linea a cargar





# llama a menu1 y a menu0 o sea, solo a menu0.

Ya tienes por donde empezar supongo.

Supones bien, ahí es donde me atranco especialmente.no se por donde tirar para hacer que funcionen los menús.
Lo de utilizar '#' para llamar a los 2 menus es porque es porque al pulsar la tecla correspondiente tendria que pasar al siguiente menuuna vez seria al menu0 y otra al menu1 dependiendo de en que parte este de las operaciones este

  1. Porque haces consultas tan largas?
    No es mas fácil en lugar de esto

Code: [Select]

	if ((X > 10 && X < 70) && (Y > 100 && Y < 130) && (Z > MINPRESSURE && Z < MAXPRESSURE)){
	pulsacion= '1';

Supongo que si,no lo se, no tengo experiencia en esto y me resultaba mas comprensible de la otra manera. empezare de nuevo con tus indicaciones a ver si soy capaz de hacerlo...

y en tu void lecturamenuTeclado()

Code: [Select]

void lecturamenuTeclado() {

for (int i= 0; i<11; i++) {
            if (Z > MINPRESSURE && Z < MAXPRESSURE)
                if (X > coord[i][0] && X < coord[i][1] && Y > coord[i][2] && Y < coord[i][3])
                    pulsacion = valor[i];                 
             
      }
}

Una pregunta.... ese es todo el void para menuTeclado o necesitaria algo mas??

  1. Veo que usas mayúscalas para Variables y Constantes. Pues te diré que esta mal.
    Variables se escriben con minúscula
    Constantes con mayúsculas.
    No uses X, Y, Z, usa en su lugar x, y, z.

Pues muchísimas gracias por la información,la verdad es que no lo sabia asi que me puse a escribirlas como me pareció.

Me pongo manos a la obra a ver si puedo hacerlo.
Lo del loop.... buff... no se como incarle el diente.... a ver como me las arreglo.
Muchas gracias de nuevo. Un saludo

Gracias