SOLUCIONADO Teclado matricial no funciona con pantalla tft de 7"

Compañeros tengo una consulta que me trae un poco loco, estoy usando un pantalla tft de 7 " y hasta allí todo ok con el táctil y la pantalla, pero el proyecto también usa un teclado matricial y cuando compilo el código el teclado matricial funciona pero el táctil ya no funciona, para que funcione el táctil tengo que quitar el código del teclado matricial.

Adjunto un poco de mi código para ver si me echan una mano

void loop(){
Menubase();   
}

void tecladoMatricial(){
 char key = keypad.getKey();
 
switch (key)
{
  case '0' :
  Serial.println("Boton 0 oprimido");
  break; 

  case '2' :
  Serial.println("Boton 2 oprimido");
  break; 

  case '4' :
  Serial.println("Boton 4 oprimido");
  break; 

  case '5' :
  Serial.println("Boton 5 oprimido");
  break; 

  case '7' :
  Serial.println("Boton 7 oprimido");
  break; 

  case '8' :
  Serial.println("Boton 8 oprimido");
  break; 

  case '1' :
  Serial.println("Boton 1 oprimido");
  break; 

  case '*' :
  Serial.println("Boton * oprimido");
  break; 
}
 
}

void Menubase()
{

    myGLCD.setColor(VGA_LIME);
    myGLCD.setBackColor(VGA_GRAY);
    myGLCD.setFont(GroteskBold24x48);

    dtostrf(diametro,6,2,Diamet);   
    sprintf(dx,"%6s", Diamet);   //Conversion de float a cadena para poder imprimir en la pantalla
    myGLCD.print(dx,280,725);
 
while(true){
          
      pulsacion();  
      tecladoMatricial();   
     }
    }

void pulsacion()
     
      {

        if (myTouch.dataAvailable())
           {
              myTouch.read();
              x=myTouch.getX();
              y=myTouch.getY();        

               //RACIMOS
        if ((y>=550) && (y<=600)) 
           {      
          if ((x>=5) && (x<=220)) 
             {         
                 
                  if (a==0){
                     a=1;
                                   
                  }
                }
              }
           }
         }

Te diste cuenta de esto

 while(true){
          pulsacion();  
    	  tecladoMatricial();   
}

Ahi le dices que toda la vida se quede mirando pulsacion y tecladoMatricial()

::slight_smile: pienso que igual tendrían que funcionar los 2 ( teclado matricial + táctil ), pero al parecer el código o bien me deja usar el táctil o bien me deja usar el teclado matricial, pero los dos a la misma vez no los puedo usar

Lo que confundes es que si lo hace pero no tienes luego nunca vuelve a ejecutar la parte de Menubase() que te permite ver los cambios en el TFT

Modificalo asi

void loop(){
	Menubase();   
}

void tecladoMatricial(){
  	char key = keypad.getKey();
 
	switch (key) {
	  	case '0' :
	  			Serial.println("Boton 0 oprimido");
	  			break; 

		case '2' :
				Serial.println("Boton 2 oprimido");
				break; 

		case '4' :
				Serial.println("Boton 4 oprimido");
				break; 

		case '5' :
				Serial.println("Boton 5 oprimido");
				break; 

		case '7' :
				Serial.println("Boton 7 oprimido");
				break; 

		case '8' :
				Serial.println("Boton 8 oprimido");
				break; 

		case '1' :
				Serial.println("Boton 1 oprimido");
				break; 

		case '*' :
				Serial.println("Boton * oprimido");
				break; 
	}
 
}

void pulsacion() {

    if (myTouch.dataAvailable())    {
		myTouch.read();
		x=myTouch.getX();
		y=myTouch.getY();        

		//RACIMOS
		if ((y>=550) && (y<=600)) {      
			if ((x>=5) && (x<=220)) {         
		  		if (a==0) {
		 		    a=1;
		        }
            }
        }
    }
} 

void Menubase() {

    myGLCD.setColor(VGA_LIME);
    myGLCD.setBackColor(VGA_GRAY);
    myGLCD.setFont(GroteskBold24x48);

    dtostrf(diametro,6,2,Diamet);   
    sprintf(dx,"%6s", Diamet);   //Conversion de float a cadena para poder imprimir en la pantalla
    myGLCD.print(dx,280,725);
 
	pulsacion();  
    tecladoMatricial();   
}

Estuve probando la modificacion y funciona solo por momentos no se que tendra el arduino con el matricial jejeje, ademas que me lanzan un efecto parpadeante en los numeros de la pantalla, pero no todo estuvo perdido, porque buscando entre mis cosas encontre un arduino nano, la verdad que estaba un poco viejito pero funciona bien, se me ocurrio la idea de conectarle el teclado y que me envie los comandos de la teclas por puerto serial al arduino mega y hasta ahora esta funcionando correctamente, se que no es la solucion mas adecuada pero necesito sacar este proyecto rapidamente y el arduino nano ni sabia que existia en mi cajon ::slight_smile: .

void loop(){
Menubase();   
}


void Menubase()
{

    myGLCD.setColor(VGA_LIME);
    myGLCD.setBackColor(VGA_GRAY);
    myGLCD.setFont(GroteskBold24x48);

    dtostrf(diametro,6,2,Diamet);   
    sprintf(dx,"%6s", Diamet);   //Conversion de float a cadena para poder imprimir en la pantalla
    myGLCD.print(dx,280,725);
 
while(true){
          
      pulsacion();  
      puertoTeclado();   
     }
    }

void pulsacion()
     
      {

        if (myTouch.dataAvailable())
           {
              myTouch.read();
              x=myTouch.getX();
              y=myTouch.getY();        

               //RACIMOS
        if ((y>=550) && (y<=600)) 
           {      
          if ((x>=5) && (x<=220)) 
             {         
                 
                  if (a==0){
                     a=1;
                                   
                  }
                }
              }
void puertoTeclado(){
  
  if(Serial1.available()) {
    inChar = Serial1.read();
    if (isDigit(inChar)){
    inString += inChar;
    }  
    if (inChar == '\n') {    
      numero= inString.toInt();
      inString = "";          
       

              if( numero == 8){
                myGLCD.setColor(VGA_SILVER );
                myGLCD.fillCircle(365, 250, 40);
       
       }
              if( numero == 5){
                myGLCD.setColor(VGA_FUCHSIA);
                myGLCD.fillCircle(365, 250, 40);
  
   
       }
              if( numero == 2){
                  myGLCD.setColor(VGA_RED );
                myGLCD.fillCircle(365, 250, 40);    

       }
              if( numero == 0){   
                myGLCD.setColor(VGA_BLACK);
                myGLCD.fillCircle(365, 250, 39);
                myGLCD.setColor(VGA_WHITE);
                myGLCD.drawCircle(365, 250, 39);      
      
     
       }
              if( numero == 7){
                 myGLCD.setColor( VGA_LIME);
                myGLCD.fillCircle(365, 250, 40);    

       }
              if( numero == 4){
                 myGLCD.setColor(VGA_BLUE );
                myGLCD.fillCircle(365, 250, 40);      

       }
              if( numero == 1){
                myGLCD.setColor(VGA_OLIVE);
                myGLCD.fillCircle(365, 250, 40);  

       }
    }    
  } 
}
           }
         }

Ahh veo que lo cambiaste todo!!

Vuelves a poner todo dentro de un while(1) será que eso quieres.. no digo mas nada por ello

inString += inChar;

Para que esto si luego procesas circulos de diferentes colores con 1 solo dígito?

pulsación() no se para que sirve porque no hace nada, solo modifica a como 0 o 1.

Pq no explicas que quieres hacer?

Compañero disculpa por la confusión es que aun falta mucho codigo, esto solo es una pequeña parte de todo el skecth. Pongo while(1) por que si no lo pongo la pantalla del LCD me da un efecto parpadeante como si se actualizara rapidamente, justamente lo hice por recomendación de TFTLCDCyg en un post del forohttp://forum.arduino.cc/index.php?topic=346755.0

Creo que deberías separar los elementos y configurarlos por separado con algún sketch muy básico. Por ejemplo inicia representando un botón táctil en el TFT.

El siguiente paso es insertar dentro del sketch del botón táctil, el llamado la librería del teclado y en el setup los iniciadores respectivos. Vuelves a subir el sketch y compruebas que funciona.

La parte importante es convertir la sección que crea el botón táctil, en una función y la del teclado en otra, llamándolas desde una tercer función dependiente de while() y de condiciones iniciadoras.

Por último, la función primaria, debes llamarla desde el setup(), no desde void loop(), así cuando llames funciones que se deben ejecutar una sola vez, el void loop no hará que se comporten con refrescos continuos

La instrucción while(), da mejores resultados si la usas fuera del void loop(), y mejor aún si no usas el void loop para nada. Sé que eso no lo dice "el libro", y todo mundo se pierde si no ven el void loop como parte del sketch.

Este es un ejemplo muy general de lo que digo:

//llamado de librerías

//Definición de variables

setup(){
//iniciadores

Menubase();
}

void loop(){}

void Menubase(){
//instrucciones que se ejecutan una sola vez al llamar Menubase
 while(1){
  //instrucciones en ciclo

  if(condición1){funciónA();}
  if(condición2){funciónB();}
  
 }
}

funcionA(){
//instrucciones que se ejecutan una sola vez al llamar funcionA
 while(1){
  //instrucciones en ciclo

  if(condición1){funciónC();}
  if(condición2){Menubase();}
  
 }
}


funcionB(){
//instrucciones que se ejecutan una sola vez al llamar funcionB
 while(1){
  //instrucciones en ciclo

  if(condición1){funciónA();}
  if(condición2){Menubase();}
  
 }
}

funcionC(){
//instrucciones que se ejecutan una sola vez al llamar funcionC
 while(1){
  //instrucciones en ciclo

  if(condición1){funciónA();}
  if(condición2){Menubase();}
  
 }
}

Vaya he creado un menu sin querer jejeje. En este ejemplo general, no se usa void loop, sin embargo se consiguen ciclos con while() dentro de las funciones secundarias y la principal.

PD: aprendí a programar los sktechs de esa forma, debido a que las pantallas que uso en los proyectos, no funcionan con el método tradicional.

No hay mejor explicación, siguiendo tus pasos uno a uno se soluciono el problema, gracias compañero

Por curiosidad, ¿podrías compartir tu sketch?, resulta interesante saber como lo has solucionado.

TFTLCDCyg simplemente movi Menubase() al void setup() y el void loop lo deje vacio, no me habia imaginado que llamando funciones desde el void setup podia funcionar un skecth ciclicamente como lo haze en el void loop....que cosas no jejeje

TFTLCDCyg Voy abrir un post, la verdad que tengo una consulta para abrir archivos de una sd y visualizarlos en la tft pero poder deslizar el archivo ya que es grande y no cabe en la pantalla, casi igual como lo hace un celular almomento de abrir un pdf, se puede mirar el pdf que tine cientos de hojas con solo deslizar el dedo.

Bueno pero eso es un post mas, gracias compañeros

void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
Serial2.begin(9600);
 
myGLCD.InitLCD(PORTRAIT); 
 myGLCD.clrScr();

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

  Menubase(); 
}

void loop{ }