cambio funzione con touch

ciao a tutti, ho un arduino con scermo+touch, ho gia creato vari tasti e quando premo uno dei tasti mi cambia funzione, fino qui tutto bene, peroora vorrei implementare un realclock e la temperatura quindi vorrei riassumere tre pulsanti in uno, quindi premo una volta faccio partire una funzione che dura pochi secondi se ripremo lo stesso pulsante mi parte seconda ecc
spero di essermi spiegato bene
guardando in rete sicuramente ci vuole un counter che ogni click su touch aumenta il numero e mostra la schermata appropriata
grazie a tutti

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

//CONTROLLO VALVOLE STALLA
#include <Adafruit_GFX.h>    
#include <Adafruit_TFTLCD.h>  
#include <TouchScreen.h>     

// Pines necesarios para los 4 pines del panel tactil
#define YP A1 // Pin analogico A1 para ADC
#define XM A2 // Pin analogico A2 para ADC
#define YM 7 
#define XP 6 

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

// Para mejor precision de la presion realizada, es necesario 
// medir la resistencia entre los pines X+ y X-.
// En Shield TFT 2.4" LCD se mide entre los pines A2 y 6
// Instancia del panel tactil (Pin XP, YP, XM, YM, Resistencia del panel) 
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 364); 

short TS_MINX = 150; // Coordenadas del panel tactil para delimitar
short TS_MINY = 120; // el tamaño de la zona donde podemos presionar
short TS_MAXX = 850; // y que coincida con el tamaño del LCD
short TS_MAXY = 891; 

#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 RED     0xF800  // el texto y los elementos graficos
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

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 a = 0;          // variable "flag" para control rebotes
int b = 0;
int c = 0;
int d = 0;


int  val = 0;               //pin di input 
int  valb = 0;

#define V1 16
#define V2 17
#define V3 18 
#define VAA 19   //alimentazione valvole



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

 pinMode(16, OUTPUT); //V1
 pinMode(17, OUTPUT); //V2
 pinMode(18, OUTPUT);  //V3
 pinMode(19, OUTPUT);  //VAA

 

 digitalWrite(V1, LOW);
 digitalWrite(V2, HIGH);
 digitalWrite(V3, HIGH);
 digitalWrite(VAA, LOW);


 tft.fillScreen(WHITE);
 tft.setRotation(0);

 tft.setCursor(20,10);  
 tft.setTextSize(1);    
 tft.setTextColor(RED); 
 tft.println("BY DANIELE PASSINI 22/10/18 V 1");
 
 tft.drawRect(40, 20, 160, 60, RED); // BOTTONE1

 tft.setCursor(60,35);  
 tft.setTextSize(2);    
 tft.setTextColor(BLUE); 
 tft.println("V1 APERTA");

 tft.drawRect(40, 100, 160, 60,RED); // bottone 2
 
 tft.setCursor(60,115); 
 tft.setTextSize(2);    
 tft.setTextColor(BLUE);
 tft.println("V2 CHIUSA"); 


 
 tft.drawRect(40, 180, 160, 60,RED); // bottone 3
 
 tft.setCursor(60,195);  
 tft.setTextSize(2);    
 tft.setTextColor(BLUE); 
 tft.println("V3 CHIUSA"); 


 tft.drawRect(40, 260, 160, 60,RED); // bottone 3
 
 tft.setCursor(60,275);  
 tft.setTextSize(2);   
 tft.setTextColor(BLUE);
 tft.println("PROGVALVOLE"); 
 
 delay(3000);
 digitalWrite(VAA, HIGH);
 
 
}

void loop()
{ 
 lecturaPanel(); // lettura del pannello

        // V1
    
   if((X > 40 && X < 200) && (Y > 20 && Y <60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) 
   {
   if (d == 0) 
     {
       
   tft.fillScreen(WHITE);
   tft.setRotation(0);   
     tft.setCursor(20,10);  
     tft.setTextSize(1);    
     tft.setTextColor(RED); 
     tft.println("BY DANIELE PASSINI 22/10/18 V 1");
 
     tft.drawRect(40, 20, 160, 60, RED); // BOTTONE1

     tft.setCursor(60,35);  
     tft.setTextSize(2);    
     tft.setTextColor(BLUE); 
     tft.println("V1 APERTA");

     tft.drawRect(40, 100, 160, 60,RED); // bottone 2
 
     tft.setCursor(60,115); 
     tft.setTextSize(2);    
     tft.setTextColor(BLUE);
     tft.println("V2 CHIUSA"); 


 
     tft.drawRect(40, 180, 160, 60,RED); // bottone 3
 
     tft.setCursor(60,195);  
     tft.setTextSize(2);    
     tft.setTextColor(BLUE); 
     tft.println("V3 CHIUSA"); 


     tft.drawRect(40, 260, 160, 60,RED); // bottone 3
 
     tft.setCursor(60,275);  
     tft.setTextSize(2);   
     tft.setTextColor(BLUE);
      tft.println("PROGVALVOLE"); 
      
    
     delay(150);
    digitalWrite(VAA, LOW);
    delay(150);   
    digitalWrite(V1, LOW);  //V1

    delay(3000);            //ASPETTO LA APERTURA
    digitalWrite(V2, HIGH);  //CHIUDO TUTTO
    digitalWrite(V3, HIGH);
    delay(3000);             //ASPETTO CHIUSURA
    digitalWrite(VAA, HIGH);  //TOLGO ALIMENTAZIONE ALLE ELETTROVALVOLE

    delay(7000);
    digitalWrite(VAA, HIGH);

      } 
} 
   
   // V2
    
   if((X > 40 && X < 200) && (Y > 100 && Y <150) && (Z > MINPRESSURE && Z < MAXPRESSURE)) 
   {
   if (d == 0) 
     {
       
   tft.fillScreen(WHITE);
   tft.setRotation(0);   
     tft.setCursor(20,10);  
     tft.setTextSize(1);    
     tft.setTextColor(RED); 
     tft.println("BY DANIELE PASSINI 22/10/18 V 1");
 
     tft.drawRect(40, 20, 160, 60, RED); // BOTTONE1

     tft.setCursor(60,35);  
     tft.setTextSize(2);    
     tft.setTextColor(BLUE); 
     tft.println("V1 CHIUSA");

     tft.drawRect(40, 100, 160, 60,RED); // bottone 2
 
     tft.setCursor(60,115); 
     tft.setTextSize(2);    
     tft.setTextColor(BLUE);
     tft.println("V2 APERTA"); 


 
     tft.drawRect(40, 180, 160, 60,RED); // bottone 3
 
     tft.setCursor(60,195);  
     tft.setTextSize(2);    
     tft.setTextColor(BLUE); 
     tft.println("V3 CHIUSA"); 


     tft.drawRect(40, 260, 160, 60,RED); // bottone 3
 
     tft.setCursor(60,275);  
     tft.setTextSize(2);   
     tft.setTextColor(BLUE);
      tft.println("PROGVALVOLE"); 
      
    
     delay(150);
     digitalWrite(VAA, LOW);
    delay(150);
     digitalWrite(V2, LOW);
     
     delay(3000);
        
    digitalWrite(V1, HIGH);  //V1
                    
    digitalWrite(V3, HIGH);
    delay(3000);             //ASPETTO CHIUSURA
    digitalWrite(VAA, HIGH);  //TOLGO ALIMENTAZIONE ALLE ELETTROVALVOLE
    delay(3000);
    digitalWrite(VAA, HIGH);
    

      } 
}

  //V3
      
if((X > 40 && X < 200) && (Y > 180 && Y <230) && (Z > MINPRESSURE && Z < MAXPRESSURE)) 
   {
   if (d == 0) 
     {
       
   tft.fillScreen(WHITE);
   tft.setRotation(0);   
     tft.setCursor(20,10);  
     tft.setTextSize(1);    
     tft.setTextColor(RED); 
     tft.println("BY DANIELE PASSINI 22/10/18 V 1");
 
     tft.drawRect(40, 20, 160, 60, RED); // BOTTONE1

     tft.setCursor(60,35);  
     tft.setTextSize(2);    
     tft.setTextColor(BLUE); 
     tft.println("V1 CHIUSA");

     tft.drawRect(40, 100, 160, 60,RED); // bottone 2
 
     tft.setCursor(60,115); 
     tft.setTextSize(2);    
     tft.setTextColor(BLUE);
     tft.println("V2 CHIUSA"); 


 
     tft.drawRect(40, 180, 160, 60,RED); // bottone 3
 
     tft.setCursor(60,195);  
     tft.setTextSize(2);    
     tft.setTextColor(BLUE); 
     tft.println("V3 APERTA"); 


     tft.drawRect(40, 260, 160, 60,RED); // bottone 3
 
     tft.setCursor(60,275);  
     tft.setTextSize(2);   
     tft.setTextColor(BLUE);
      tft.println("PROGVALVOLE"); 
      
    
    delay(150);

    digitalWrite(VAA, LOW);
    delay(150);

     
    digitalWrite(V3, LOW); 
    delay(3000);     //tempo
    digitalWrite(V1, HIGH);
      
    digitalWrite(V2, HIGH); 
    delay(3000);             //ASPETTO CHIUSURA
    digitalWrite(VAA, HIGH);  //TOLGO ALIMENTAZIONE ALLE ELETTROVALVOLE
    delay(3000);
    digitalWrite(VAA, HIGH); 
    
} 
}



}
void lecturaPanel()
{
   digitalWrite(13, HIGH); 
   TSPoint p = ts.getPoint(); // Realizamos lectura de las coordenadas
   digitalWrite(13, LOW);
 
   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.    
 
   // Mapeamos los valores analogicos leidos del panel tactil (0-1023)
   // y los convertimos en valor correspondiente a la medida del LCD 320x240
   X = map(p.x, TS_MAXX, TS_MINX, tft.width(), 0);
   Y = map(p.y, TS_MAXY, TS_MINY, tft.height(), 0);
   Z = p.z;
}

--- il codice si racchiude nei tag CODE non nei tag quote, grazie :slight_smile: - gpb01

passo88:
... sicuramente ci vuole un counter che ogni click su touch aumenta il numero e mostra la schermata appropriata

... si, direi che ti occorre un contatore che incrementi di uno ad ogni touch del bottono, sino al suo limite massimo (poi io ripartirei automaticamente da 1).

Nel loop() confronti il valore precedente del contatore con il valore attuale .. se cambiato fai quello che devi fare. Ovvamente tutto quello che fai NON deve essere bloccante se vuoi poter continuare a premere il bottone anche metre stai facendo qualche cosa d'altro.

Guglielmo

innanzitutto grazie della risposta, ha visto il mio sketch che ne pensa? e`molto semplice, va bene che nel setup() metto la prima schermata del display che voglio?e poi nel loop() inserisco le "if"
che ne pensa?

per tornare al topic, ora cerco il codice preciso online, e poi dovrò mettere dopo la "if" della pressione del touch un altra "if" che controlla a quanto è il contatore in questo modo if (val==1)

ciao a tutti, sono arrivato a questa conclusione ma comunque mi mancano delle parti,
innanzi tutto assegno

int valb = 0;  //ho messo b perche ho un altro val

nel loop()

non so se all fine per incrementare valb devo fare cosi

(valb =+1);

mentre alla fine per riportare il valore a zero?

(valb ==0);

grazie

passo88:
mentre alla fine per riportare il valore a zero?

(valb ==0);

NO, quello è un operatore "logico" di uguaglianza ! L'assegnazione si fa con un solo '='.

Ti consiglio di andare nel reference e studiarti gli operatori "Aritmetici", quelli di "Comparazione" ed infine quelli "Booleani" (logici).

Guglielmo

grazie mille!sia per la guida che per l'aiuto

ho modificato il mio skech per cercare di avere tre funzioni su un unico punto dello schermo ma non funzione a dovere, mi sono letto le istruzioni per i comandi int e if ma cè qualcosa che mi manca mi aiutate per favore

nello skech che posto ho messo la in di pressione dello schermo sempre ripetuta ma sono in dubbio che non serva, perche ragiondoci quando io premo in base alla mia int "e" dovrbbe eseguire quella giusta

void loop() {



  lecturaPanel(); // lettura del pannello

         // V1
     
    if((X > 40 && X < 200) && (Y > 20 && Y <60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
      if (d == 0) {
         if (e == 0) {
        
      
       // BOTTONE1

      
      tft.setCursor(60,35);  
      tft.setTextSize(2);    
      tft.setTextColor(BLUE); 
      tft.println("V1 APERTA");

      delay(200);

      e ++;   //aumento il vale di uno 
      }
       }
        }
    if((X > 40 && X < 200) && (Y > 20 && Y <60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
      if (d == 0) {
         if (e == 1) {

   
      tft.setCursor(60,35);  
      tft.setTextSize(2);    
      tft.setTextColor(BLUE); 
      tft.println("V2 APERTA");

      delay(200);

      
     
     

      e ++;//aumento il vale di uno 
      }
       }
        }
      if((X > 40 && X < 200) && (Y > 20 && Y <60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
      if (d == 0) {
      if (e == 2) {

        
      tft.setCursor(60,35);  
      tft.setTextSize(2);    
      tft.setTextColor(BLUE); 
      tft.println("V3 APERTA");

      delay(200);

      e = 0;   
    }
    }
    }

se posti il programma completo si capisce di più
se poi prima di postarlo dall'ide premi ctrl +t il programma viene messo a posto in automatico ... e diventa più leggibile
qui l'ho fatto io eliminando anche tutte le righe vuote

void loop() {
  lecturaPanel(); // lettura del pannello
  // V1
  if ((X > 40 && X < 200) && (Y > 20 && Y < 60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
    if (d == 0) {
      if (e == 0) {
        // BOTTONE1
        tft.setCursor(60, 35);
        tft.setTextSize(2);
        tft.setTextColor(BLUE);
        tft.println("V1 APERTA");
        delay(200);
        e ++;   //aumento il vale di uno
      }
    }
  }
  if ((X > 40 && X < 200) && (Y > 20 && Y < 60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
    if (d == 0) {
      if (e == 1) {
        tft.setCursor(60, 35);
        tft.setTextSize(2);
        tft.setTextColor(BLUE);
        tft.println("V2 APERTA");
        delay(200);
        e ++;//aumento il vale di uno
      }
    }
  }
  if ((X > 40 && X < 200) && (Y > 20 && Y < 60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
    if (d == 0) {
      if (e == 2) {
        tft.setCursor(60, 35);
        tft.setTextSize(2);
        tft.setTextColor(BLUE);
        tft.println("V3 APERTA");
        delay(200);
        e = 0;
      }
    }
  }

facendo questo si nota in primis che manca la graffa di chiusure del loop :slight_smile:
poi ci sono 3 if completi ed identici
l'unica cosa che cambia è i'if e=0, =1,=2
quindi si possono buttare via e fare tutto dentro al primo if
così

void loop() {
  lecturaPanel(); // lettura del pannello
  // V1
  if ((X > 40 && X < 200) && (Y > 20 && Y < 60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
    if (d == 0) {
      if (e == 0) {
        // BOTTONE1
        tft.setCursor(60, 35);
        tft.setTextSize(2);
        tft.setTextColor(BLUE);
        tft.println("V1 APERTA");
        delay(200);
        e ++;   //aumento il vale di uno
      } else if (e == 1) {
        tft.setCursor(60, 35);
        tft.setTextSize(2);
        tft.setTextColor(BLUE);
        tft.println("V2 APERTA");
        delay(200);
        e ++;//aumento il vale di uno
      } else if (e == 2) {
        tft.setCursor(60, 35);
        tft.setTextSize(2);
        tft.setTextColor(BLUE);
        tft.println("V3 APERTA");
        delay(200);
        e = 0;
      }
    }
  }
}

dal quale si capisce che siccome tu continui ad aumentare e (e++) in ogni if ed essendo questa la condizione per passare al prossimo... continuerà a girare li dentro senza sosta fino a quando non togli il dito dal pulsante
quindi
meglio usare switch()...case
in questo modo con l'istruzione break interrompi il ciclo e vai a rileggere il pannello
... tra l'altro io in fondo azzererei x è y così non corri il rischio che faccia più giri li dentro :wink:

void loop() {
  lecturaPanel(); // lettura del pannello
  // V1
  if ((X > 40 && X < 200) && (Y > 20 && Y < 60) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
    if (d == 0) {
      switch (e) {
        case 0:
          // BOTTONE1
          tft.setCursor(60, 35);
          tft.setTextSize(2);
          tft.setTextColor(BLUE);
          tft.println("V1 APERTA");
          delay(200);
          e ++;   //aumento il vale di uno
          break;
        case 1:
          tft.setCursor(60, 35);
          tft.setTextSize(2);
          tft.setTextColor(BLUE);
          tft.println("V2 APERTA");
          delay(200);
          e ++; //aumento di uno
          break;
        case 2:
          tft.setCursor(60, 35);
          tft.setTextSize(2);
          tft.setTextColor(BLUE);
          tft.println("V3 APERTA");
          delay(200);
          e = 0;
          break;
      }
    }
  }
  x = 0;
  y = 0;
}

grazie molte ho capito, nel programma ho inserito anche un realclok quindi io dopo questa funzione if ho un altra funzione else if e per finire else che ogni secondo deve leggere l'orologio e stampare la nuova ora, in questo modo pero devo tenere premuto per piu' tempo lo schermo per far si che dopo il secondo di loop mi legga la pressione
fatto cosi non funziona bene tra l'altro vorrei aggiungere anche un altro comando che ad una certa ora mi avvia il secondo if...
come potrei sistemare questo problema?
e possibile creare due loop il primo per la prima parte di schermo e il secondo per la restante?
grazie
altra cosa non mi legge questo comando

x = 0;
y = 0;

inserisco il programma completo per esattezza

//CONTROLLO VALVOLE STALLA
#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <TouchScreen.h>
#include <Wire.h>
#include <DS3231.h>
// Pines necesarios para los 4 pines del panel tactil
#define YP A1 // Pin analogico A1 para ADC
#define XM A2 // Pin analogico A2 para ADC
#define YM 7
#define XP 6
// Definimos la presion máxima y minima que podemos realizar sobre el panel
#define MINPRESSURE 1
#define MAXPRESSURE 1000
// Para mejor precision de la presion realizada, es necesario
// medir la resistencia entre los pines X+ y X-.
// En Shield TFT 2.4" LCD se mide entre los pines A2 y 6
// Instancia del panel tactil (Pin XP, YP, XM, YM, Resistencia del panel)
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 364);
short TS_MINX = 150; // Coordenadas del panel tactil para delimitar
short TS_MINY = 120; // el tamaño de la zona donde podemos presionar
short TS_MAXX = 850; // y que coincida con el tamaño del LCD
short TS_MAXY = 891;
#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	RED     0xF800  // el texto y los elementos graficos
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
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 a = 0;          // variable "flag" para control rebotes
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int  val = 0;               //pin di input
int  valb = 0;
#define V1 16
#define V2 17
#define V3 18
#define VAA 19   //alimentazione valvole
DS3231 clock;
RTCDateTime dt;
#define sclk 13  // Don't change
#define mosi 11  // Don't change

void setup(void) {

  tft.begin(0x9341);
  clock.begin();
  pinMode(16, OUTPUT); //V1
  pinMode(17, OUTPUT); //V2
  pinMode(18, OUTPUT);  //V3
  pinMode(19, OUTPUT);  //VAA
  digitalWrite(V1, LOW);
  digitalWrite(V2, HIGH);
  digitalWrite(V3, HIGH);
  digitalWrite(VAA, LOW);  //valvole accese
  delay(3000);
  digitalWrite(VAA, HIGH);  //valvole spente

  tft.fillScreen(WHITE);
  tft.setRotation(0);

}

void loop() {

  lecturaPanel(); // lettura del pannello

  // V1
  if ((X > 40 && X < 200) && (Y > 40 && Y < 90) && (Z > MINPRESSURE && Z < MAXPRESSURE)) {
    if (d == 0) {
      switch (e) {
        case 0:
          // BOTTONE1
          tft.fillRect(42, 22, 162, 55, WHITE); //data
          tft.setCursor(60, 35);
          tft.setTextSize(2);
          tft.setTextColor(BLUE);
          tft.println("V1 APERTA");
          delay(200);
          e ++;   //aumento il vale di uno
          break;
        case 1:
          tft.fillRect(42, 22, 162, 55, WHITE); //data
          tft.setCursor(60, 35);
          tft.setTextSize(2);
          tft.setTextColor(BLUE);
          tft.println("V2 APERTA");
          delay(200);
          e ++; //aumento di uno
          break;
        case 2:
          tft.fillRect(42, 22, 162, 55, WHITE); //data
          tft.setCursor(60, 35);
          tft.setTextSize(2);
          tft.setTextColor(BLUE);
          tft.println("V3 APERTA");
          delay(200);
          e = 0;
          break;
      }
    }
  }
  //PROG VALVOLE

 else if ((X > 40 && X < 200) && (Y > 100 && Y < 150) && (Z > MINPRESSURE && Z < MAXPRESSURE))  {
    if (d == 0) {

      tft.fillRect(10, 10, 240, 360, GREEN);
      tft.setCursor(20, 40);
      tft.setTextSize(2);
      tft.setTextColor(BLUE);
      tft.println("SCARICO Valvola 1");
      tft.setCursor(20, 80);
      tft.setTextSize(3);
      tft.setTextColor(BLUE);
      tft.println("ATTIVO");
      tft.setCursor(20, 120);
      tft.setTextSize(3);
      tft.setTextColor(BLUE);
      tft.println("PER FERMARE");
      tft.setCursor(20, 160);
      tft.setTextSize(3);
      tft.setTextColor(BLUE);
      tft.println("PREMERE");
      tft.setCursor(20, 200);
      tft.setTextSize(3);
      tft.setTextColor(BLUE);
      tft.println("RESET");
      delay(150);
      digitalWrite(VAA, LOW);   //accendo
      delay(150);
      digitalWrite(V1, LOW);  //V1
      digitalWrite(V2, HIGH);
      digitalWrite(V3, HIGH);
      delay(3000);
      digitalWrite(VAA, HIGH);   //spengo
      delay(1200000);    //1200000 20 min
      digitalWrite(VAA, LOW);   //a ccendo
      delay(150);
      digitalWrite(V2, LOW);
      delay(3000);     //10000 10 sec
      digitalWrite(V1, HIGH);
      digitalWrite(V3, HIGH);
      delay(3000);
      digitalWrite(VAA, HIGH);     //spengo
      tft.setCursor(20, 40);
      tft.setTextSize(2);
      tft.setTextColor(BLUE);
      tft.println("SCARICO Valvola 2");
      delay(150);
      delay(1200000);   //20min
      digitalWrite(VAA, LOW);    //accendo
      delay(150);
      digitalWrite(V3, LOW);
      delay(3000);    //3sec
      digitalWrite(V2, HIGH);
      digitalWrite(V1, HIGH);
      delay(150);
      digitalWrite(VAA, HIGH);   //spengo
      delay(150);
      tft.setCursor(20, 40);
      tft.setTextSize(2);
      tft.setTextColor(BLUE);
      tft.println("SCARICO Valvola 3");
      delay(150);
      delay(1200000);   //20min
      digitalWrite(VAA, LOW);  //accendo
      delay(150);
      digitalWrite(V1, LOW);  //V1
      delay(3000);     //10 sec
      digitalWrite(V2, HIGH);
      digitalWrite(V3, HIGH);

      //reset
      tft.fillScreen(WHITE);
      tft.setRotation(0);
      tft.setCursor(20, 10);
      tft.setTextSize(1);
      tft.setTextColor(RED);
      tft.println("BY DANIELE PASSINI 22/10/18 V 1");
      tft.drawRect(40, 20, 160, 60, RED); // BOTTONE1
      tft.setCursor(60, 35);
      tft.setTextSize(2);
      tft.setTextColor(BLUE);
      tft.println("V1 APERTA");
      tft.drawRect(40, 100, 160, 60, RED); //prog
      tft.setCursor(60, 115);
      tft.setTextSize(2);
      tft.setTextColor(BLUE);
      tft.println("PROG1");
      tft.drawRect(40, 180, 160, 60, RED); //data
      tft.setCursor(60, 195);
      tft.setTextSize(2);
      tft.setTextColor(BLUE);
      tft.println();
      tft.drawRect(40, 260, 160, 60, RED); // Temp
      tft.setCursor(60, 275);
      tft.setTextSize(2);
      tft.setTextColor(BLUE);
      tft.println();
      delay(7000);             //ASPETTO CHIUSURA
      digitalWrite(VAA, HIGH);  //TOLGO ALIMENTAZIONE ALLE ELETTROVALVOLE
    }
  }
  else {
    dt = clock.getDateTime();
    tft.setCursor(20, 10);
    tft.setTextSize(1);
    tft.setTextColor(RED);
    tft.println("BY DANIELE PASSINI 22/10/18 V 1");
    tft.drawRect(40, 20, 160, 60, RED); // BOTTONE1
    tft.setCursor(60, 35);
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.println("V1 APERTA");
    tft.drawRect(40, 100, 160, 60, RED); //prog
    tft.setCursor(60, 115);
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.println("PROG1");
    tft.drawRect(40, 180, 160, 60, RED); //data
    tft.fillRect(42, 182, 155, 55, WHITE); //CANCELLO LO SCHERMO data
    tft.setCursor(60, 195);
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.println(clock.dateFormat("d-m-Y", dt));
    tft.setCursor(60, 215);
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.println(clock.dateFormat("H:i:s", dt));
    tft.drawRect(40, 260, 160, 60, RED); // Temp
    tft.fillRect(42, 262, 155, 55, WHITE); //data
    tft.setCursor(60, 275);
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.println(clock.readTemperature());
    delay(200);
  }
}
void lecturaPanel()
{
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint(); // Realizamos lectura de las coordenadas
  digitalWrite(13, LOW);
  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.
  // Mapeamos los valores analogicos leidos del panel tactil (0-1023)
  // y los convertimos en valor correspondiente a la medida del LCD 320x240
  X = map(p.x, TS_MAXX, TS_MINX, tft.width(), 0);
  Y = map(p.y, TS_MAXY, TS_MINY, tft.height(), 0);
  Z = p.z;
}
  pinMode(16, OUTPUT); //V1
  pinMode(17, OUTPUT); //V2
  pinMode(18, OUTPUT);  //V3
  pinMode(19, OUTPUT);  //VAA

visto che hai messo i define...

  pinMode(V1, OUTPUT); 
  pinMode(V2, OUTPUT); 
  pinMode(V3, OUTPUT);  
  pinMode(VAA, OUTPUT);

questo sicuramente assieme agli altri 2 posti dove c'è lo stesso delay, è un problema...

    tft.println("SCARICO Valvola 3");
      delay(150);
      delay(1200000);   //20min
      digitalWrite(VAA, LOW);  //accendo

in questo if il programma sta li ad aspettare per 1 ora senza avere la possibilità di fare niente altro...

perchè dici che se fa l'aggiornamento ora non esegue gli altri if?

altra cosa non mi legge questo comando

x = 0;
y = 0;

forse perchè li scrivi minuscoli??? :wink:

e possibile creare due loop il primo per la prima parte di schermo e il secondo per la restante?

certo ma non si chiama loop, si chiama funzione, è come quella che fa la lettura dal tft
infatti vedo che questa parte è comune

    tft.setCursor(20, 10);
    tft.setTextSize(1);
    tft.setTextColor(RED);
    tft.println("BY DANIELE PASSINI 22/10/18 V 1");
    tft.drawRect(40, 20, 160, 60, RED); // BOTTONE1
    tft.setCursor(60, 35);
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.println("V1 APERTA");
    tft.drawRect(40, 100, 160, 60, RED); //prog
    tft.setCursor(60, 115);
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.println("PROG1");
    tft.drawRect(40, 180, 160, 60, RED); //data

fatto cosi non funziona bene tra l'altro vorrei aggiungere anche un altro comando che ad una certa ora mi avvia il secondo if.

si certo ma prima devi studiarti l'uso di millis() perchè come ti ho detto con quei delay lunghissimi.... non riuscirai a fare nulla del genere
per millis() vedere qui:
Per capire come funziona e come applicare la funzione millis(), puoi studiare prima QUI, poi QUI ed infine leggere anche QUI e QUI e questo post di Claudio_FF... vedrai che ti sarà tutto più chiaro