Go Down

Topic: tft se reinicia con cada ciclo loop (Read 407 times) previous topic - next topic

iaky

Hola a todos

 al empezar a trastear con la tft  de 2,8 me pasa que cuando meto la configuración de una pantalla en el setup la muestra correctamente ,pero al hacerlo en el loop se ve como vuelve a cargar en cada ciclo ,el problema es tengo que dejarla en el loop porque la idea es que valla cambiando según valla tocando distintos botones creando así distintas pantallas con varios menús.
¿ A alguno os ha pasado esto? ¿como puedo solucionarlo?  


Estoy usando un tft elegoo de 2,8 en un arduino mega con las librerías que me traía en un cd al comprarlo

iaky

Code: [Select]


#include <Elegoo_GFX.h>     // libreria para definir graficos
#include <Elegoo_TFTLCD.h> // libreria especifica del tft
#include <TouchScreen.h>  //libreria para el tactil

//______________pines para el tactil____________________________

#define YP A3  // usar un pin analogico
#define XM A2  // usar un pin analogico
#define YM 9   // puedes usar un pin digital
#define XP 8   // puedes usar un pin digital

//______________coordenadas tope para el tactil__________________

//Touch For New ILI9341 TP
#define TS_MINX 120
#define TS_MINY 70
#define TS_MAXX 900
#define TS_MAXY 920

//______creo objeto pantalla tactil___________________________
//______le digo los pines que usa y la resistencia en ohnmios_

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

#define MINPRESSURE 10              // establezco la presion minima para la pulsacion
#define MAXPRESSURE 1000            // establezco la presion maxima para la pulsacion

//____________pines para el tft_________________________________

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
// optional
#define LCD_RESET A4

//__________definimos los colores en hexadecimal 16 bits________

#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

//__________creo objeto pantalla tft____________________________

Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
int x;
int y;
int z;
int pantalla;

void setup() {
 /* Serial.begin(9600);                //inicio la comunicacion con el ordenador
  Serial.println("comienzo....");   // le mando escribir en monitor serie */
  
  tft.reset();                      // reseteo  la pantalla tft
  tft.begin(0x9341);                //inicio la pantalla tft indicandole el chip del controlador ili9341
  tft.setRotation(3);
 pantalla = 0;
 pinMode(13,OUTPUT);
}
void loop() {
  

 lectura();
/*Serial.print("x = ");Serial.print(x);
Serial.print("y = ");Serial.print(y);
Serial.print("z = ");Serial.println(z);*/
if(pantalla == 0){
  if((x > 80 && x < 140) && (y > 40 && y < 140) && (z > MINPRESSURE && z < MAXPRESSURE)){
  pantalla = 1;
  tft.fillScreen(BLACK);
  delay(250);
}
 if((x > 80 && x < 140) && (y > 140 && y < 240) && (z > MINPRESSURE && z < MAXPRESSURE)){
  pantalla = 2;
  tft.fillScreen(BLACK);
  delay(250);
}
if((x > 160 && x < 220) && (y > 40 && y < 140) && (z > MINPRESSURE && z < MAXPRESSURE)){
  pantalla = 3;
  tft.fillScreen(BLACK);
  delay(250);
}
if((x > 160 && x < 220) && (y > 140 && y < 240) && (z > MINPRESSURE && z < MAXPRESSURE)){
  pantalla = 4;
  tft.fillScreen(BLACK);
  delay(250);
}
}
if(pantalla != 0){
  if((x > 80 && x < 200) && (y > 80 && y < 200) && (z > MINPRESSURE && z < MAXPRESSURE)){
  pantalla = 0;
  tft.fillScreen(BLACK);
  delay(250);      
}
}

  
  //__________________________pantalla 0________________________________//

 if(pantalla == 0){
  
//tft.setRotation(3);
tft.fillScreen(BLACK);
tft.setCursor(30,10);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("PRUEbA  1");
tft.drawLine(0,60,340,60,RED);
tft.drawRect(39,79,102,62,WHITE);
tft.drawRect(179,79,102,62,WHITE);
tft.drawRect(39,159,102,62,WHITE);
tft.drawRect(179,159,102,62,WHITE);
tft.fillRect(40,80,100,60,MAGENTA);// cuadrado A
tft.fillRect(180,80,100,60,YELLOW);// cuadrado B
tft.fillRect(40,160,100,60,CYAN);// cuadrado C
tft.fillRect(180,160,100,60,BLUE);// cuadrado D
tft.setCursor(75,90);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("A");
tft.setCursor(215,90);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("B");
tft.setCursor(75,170);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("C");
tft.setCursor(215,170);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("D");
delay(1000);delay(1000);delay(1000);delay(1000);delay(1000);
 }
//__________________________pantalla 1_______________________//

if( pantalla == 1){
  
 //tft.setRotation(3);
tft.fillScreen(MAGENTA);
tft.setCursor(30,10);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("PANTALLA1");
tft.drawLine(0,60,340,60,RED);
tft.drawCircle(160,140,60,WHITE);
tft.fillCircle(160,140,58,BLACK);
tft.setCursor(125,130);
tft.setTextColor(YELLOW);
tft.setTextSize(2);
tft.println("volver");
delay(1000);delay(1000);delay(1000);delay(1000);delay(1000);
}
//_______________________pantalla 2_________________________//

 if( pantalla == 2){
  
 //tft.setRotation(3);
tft.fillScreen(YELLOW);
tft.setCursor(30,10);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("PANTALLA2");
tft.drawLine(0,60,340,60,RED);
tft.drawCircle(160,140,60,WHITE);
tft.fillCircle(160,140,58,BLACK);
tft.setCursor(125,130);
tft.setTextColor(YELLOW);
tft.setTextSize(2);
tft.println("volver");
delay(1000);delay(1000);delay(1000);delay(1000);delay(1000);
}
//________________________pantalla 3_________________________//

 if( pantalla == 3){
  
 //tft.setRotation(3);
tft.fillScreen(CYAN);
tft.setCursor(30,10);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("PANTALLA3");
tft.drawLine(0,60,340,60,RED);
tft.drawCircle(160,140,60,WHITE);
tft.fillCircle(160,140,58,BLACK);
tft.setCursor(125,130);
tft.setTextColor(YELLOW);
tft.setTextSize(2);
tft.println("volver");
delay(1000);delay(1000);delay(1000);delay(1000);delay(1000);
}
//______________________pantalla 4____________________________//

if( pantalla == 4){
  
 //tft.setRotation(3);
tft.fillScreen(BLUE);
tft.setCursor(30,10);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println("PANTALLA4");
tft.drawLine(0,60,340,60,RED);
tft.drawCircle(160,140,60,WHITE);
tft.fillCircle(160,140,58,BLACK);
tft.setCursor(125,130);
tft.setTextColor(YELLOW);
tft.setTextSize(2);
tft.println("volver");
delay(1000);delay(1000);delay(1000);delay(1000);delay(1000);
}

//=======================TOUCH===================

     /*  if(pantalla = 0){
        if(x > 40 && x < 140){
          if(y > 80 && y < 140){
            pantalla = 1;
          }
          if(p.y > 160 && p.y >220){
            pantalla = 3;
          }
        }
        if(p.x > 180 && p.x < 220){
          if(p.y > 80 && p.y < 140){
            pantalla = 2;
          }
          if(p.y > 160 && p.y < 220){
            pantalla = 4;
          }
        }
       }*/
   }
 void lectura(){
  digitalWrite(13,HIGH);
   TSPoint p = ts.getPoint();
  digitalWrite(13,HIGH);
  
   pinMode(XM, OUTPUT);
   pinMode(YP, OUTPUT);

    x = map(p.x, TS_MAXX, TS_MINX,tft.height(),0 );
    y = map(p.y, TS_MAXY, TS_MINY,tft.width(),0);
    z = p.z;
    delay(100);
 }

TFTLCDCyg

#2
Feb 02, 2019, 10:55 pm Last Edit: Feb 02, 2019, 11:08 pm by TFTLCDCyg
El problema es que has escrito el menú dentro del loop principal. Esa forma de programar no es eficiente y te lleva a muchos errores, debes separar cada menú y trabajarlos como si fueran ciclos independientes.

La ventaja de los TFT táctiles es que puedes implementar un entorno visual con el que puedes interactuar.

Este es el esquema general de un menú principal con tres submenús, como verás no es necesario usar void loop para generar acciones cíclicas. Para navegar entre menús utilizas botones táctiles para cada opción de salida.

Code: [Select]
void setup() {
MP();
}
void loop(){}

void MP()
{
  //instrucciones que se ejecutan una vez al ingresar a este menú
  while(1)
  {
    //instrucciones que se ejecutan cíclicamente en este menú
    //Botón táctil que te lleva al menú 1
    Menu1();
    //Botón táctil que te lleva al menú 2
    Menu2();
    //Botón táctil que te lleva al menú 3
    Menu3();    
  }
}

void Menu1()
{
  //instrucciones que se ejecutan una vez al ingresar a este menú
  while(1)
  {
    //instrucciones que se ejecutan cíclicamente en este menú
    //Botón táctil que te lleva al menú 1
    Menu2();
    //Botón táctil que te lleva al menú 2
    Menu3();
    //Botón táctil que te lleva al menú principal
    MP();
  }
}


void Menu2()
{
  //instrucciones que se ejecutan una vez al ingresar a este menú
  while(1)
  {
    //instrucciones que se ejecutan cíclicamente en este menú
    //Botón táctil que te lleva al menú 1
    Menu1();
    //Botón táctil que te lleva al menú 2
    Menu3();
    //Botón táctil que te lleva al menú principal
    MP();
  }
}


void Menu3()
{
  //instrucciones que se ejecutan una vez al ingresar a este menú
  while(1)
  {
    //instrucciones que se ejecutan cíclicamente en este menú
    //Botón táctil que te lleva al menú 1
    Menu1();
    //Botón táctil que te lleva al menú 2
    Menu2();
    //Botón táctil que te lleva al menú principal
    MP();
  }
}



Video-ejemplo con ILI9341+arduino Due
Video-ejemplo con shield TFT+Arduino MEGA
Video-ejemplo con FT843(controlador FT800)+Arduino Due
ft81xmania.com/comunidad/

iaky

Ya había probado a hacer funciones por cada menú pero las llamaba desde el loop , tu solución ha funcionado perfectamente . he aprendido que no hace falta escribir nada en el loop que pensaba que si.
Así que solo queda darte las gracias .



MUCHAS GRACIAS

Go Up