Mappatura touch screen

Salve, il mio problema ora è che le aree mappate sensibili al tocco, sono sensibili tutte anche cambiando "schermata".
Praticamente se creo una prima "pagina" e disegno dei pulsanti che aprono altre schrmate, queste altre schermate a loro volta hanno aree sensibili, ma sono sensibili anche quelle dalla prima pagina (non visibile) e se faccio tap e cambio pagina su questa trovo Tutte le aree sensibili di ogni pagina.
Non so se sono stato chiaro, praticamente le aree sensibili al tocco devono essere esclusivamente quelle della "pagina" corrente e non il totale delle aree...
Posso immaginare che magari si debba lavorare con layer, ma non capisco come!
In allegato tutto il papiro di codice, se qualcuno ha un attimo di pazienza lo ringrazio vivamente.

Saluti Maurizio Filomeni

progetto.h (9.69 KB)

alla riga 99 trovo:

    delay(0.000000000000000000000000000000000000000000000000001);

:smiley: è uno scherzo vero?

il tuo problema è che non hai ancora capito come progettare tutta l'applicazione, tutti i pulsanti (quarda che dovrebbe esserci un comando apposito per definire i pulsanti nella libreria...) sono creati dentro al loop e ad ogni giro interroghi tutte le aree utilizzate. Devi sapere tu quali devono essere i pulsanti e le zone sensibili nel momento in cui le usi e ovviamente scartare le altre

e poi perchè il file è un .h ?

Ciao Patrick,
hai centrato in pieno il problema... Ti metto a conoscenza del fatto che questa è la mia prima esperienza con Arduino, touchscreen e quant'altro. Quindi scrivo qui perché so che c'è gente competente (nessuno escluso) che potrebbe aiutarmi e quindi, con molta umiltà, cerco aiuto... Riguardo al file.h ho sbagliato estensione e chiedo scusa, il dilay è un problema che ho tralasciato perché ne ho altri più significativi... E comunque il ciclo for l'ho copiato in rete senza analizzarlo, copia incolla funziona, avanti... Comunque vero il numero sul delay è un po assurdo... :slight_smile: Visto comunque che hai ben capito il mio problema e io ho intuito la tua prima risposta, cortesemente potresti farmi un esempio funzionale, in base al mio progetto?
Ti/Vi ringrazio in anticipo.
Maurizio Filomeni.

comincio con il dirti che la funzione delay(numero) indica il numero di millesimi di secondo durante il quale il programma va in pausa... non fa più nulla se non attendere che siano passati. Questo numero deve essere un numero intero (senza virgola) del tipo unsigned long cioè compreso tra 0 e 4.294.967.295. Resta ovvio che delay(0) è come non averlo scritto.

prova a dare un'occhiata qui

praticamente il succo è questo:

definisci una variabile che contiene il numero di pagina
int pagNum=0

fai il tuo setup

poi nel loop controlli

se pagNum==0 (pagina iniziale)
cancello tutto
disegno i pulsanti della pagina principale
se è stato premuto il touch controllo se il punto corrisponde ad un pulsante
se pulsante1 premuto
pagNum = 1
se pulsante2 premuto
pagNum = 2
e così via...
fine pagina = 0
se pagNum == 1
cancello tutto
disegno i pulsanti della pagina 1
se è stato premuto il touch controllo se il punto corrisponde ad un pulsante
se pulsante11 premuto
pagNum = 11
se pulsante12 premuto
pagNum = 12
se pulsanteX premuto (ci deve essere in ogni pagina un pulsante che fa tornare indietro)
pagNum= 0
e così via

Grazie per la risposta, dunque ho visto il link e ho seguito il tuo consiglio ma ancora non ci sono! Posto un esempio con un solo pulsante attivo tanto per vedere la sequenza delle operazioni. Il problema che si presenta è che qualsiasi punto del display tocco, ricarica la pagina, se tocco il pulsante (mappato) mi ricarica la stessa pagina per poi andare alla seguente come giusto. Potresti cortesemente dare uno sguardo?
Grazie in anticipo

#include <Elegoo_GFX.h>    // Core graphics library
#include <Elegoo_TFTLCD.h> 
#include <TouchScreen.h>

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

#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define MY_BLACK 0x2145
#define MY_RED 0xDAEC 
#define MY_GREY 0x52CB

#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin


#define TS_MINX 120
#define TS_MAXX 900

#define TS_MINY 70
#define TS_MAXY 920


TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define BUTTONSIZE 40


#define REDBAR_MINX 80
#define GREENBAR_MINX 130
#define BLUEBAR_MINX 210
#define BAR_MINY 30
#define BAR_HEIGHT 260
#define BAR_WIDTH 30

#define MINPRESSURE 10
#define MAXPRESSURE 1000

//int touch = 0;
int prog = 0;
int currentpage;
bool BT=1;
bool HD=1;
bool touch = 0;

void drawHome()
{
  //HOME
  currentpage=0;
  tft.fillScreen(MY_BLACK);
  tft.drawRect(0,0,318,240,WHITE);//cornice bianca (distanza sx, top, width,height)

  tft.fillRect(1,1, 316, 20, MY_GREY);//Disegno il banner (distanza sx, top, width,height)
  tft.setTextColor(YELLOW);//colore del testo giallo
  tft.setTextSize(1);//dimensione del font
  tft.setCursor(10,7);//mi posiziono per la scrittura sul banner
  tft.print("C4P1 - By: Filomeni Maurizio  - for EDILTEC");//scrivo
  
  tft.fillRect(50,30, 220, 40, MY_RED);//Disegno il pulsante (distanza sx, top, width,height)
  //tft.drawRect(50,80,200,40,MY_RED);
  tft.setCursor(82,40);//mi posiziono per la scrittura sul pulsante
  tft.setTextColor(WHITE);//colore del testo bianco
  tft.setTextSize(3);//dimensione del font
  tft.print("Programma");//scrivo
  
  tft.fillRect(50,80, 220, 40, MY_RED);//secondo pulsante come sopra
  //tft.drawRect(20,125,200,40,MY_RED);
  tft.setCursor(82,90);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Contatori");
  
  tft.fillRect(50,130, 220, 40, MY_RED);//terzo pulsante come sopra
  //tft.drawRect(20,170,200,40,MY_RED);
  tft.setCursor(100,140);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Setting");

  tft.fillRect(50,180, 220, 40, MY_RED);//quarto pulsante come sopra
  //tft.drawRect(20,215,200,40,MY_RED);
  tft.setCursor(90,190);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Test C4P");
  //FINE HOME
}
void drowBTHD(){
   tft.fillScreen(MY_BLACK);
  tft.drawRect(0,0,318,240,WHITE);//cornice bianca (distanza sx, top, width,height)

  tft.fillRect(1,1, 316, 20, MY_GREY);//Disegno il banner (distanza sx, top, width,height)
  tft.setTextColor(YELLOW);//colore del testo giallo
  tft.setTextSize(1);//dimensione del font
  tft.setCursor(10,7);//mi posiziono per la scrittura sul banner
  tft.print("C4P1 - By: Filomeni Maurizio  - for EDILTEC");//scrivo

  tft.fillRect(1,30, 316, 50, MY_GREY);
  tft.setCursor(50,35);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.print("Finitura - Densita'");
  tft.print("\n");
  tft.setTextSize(1);
  tft.setTextColor(YELLOW);
  tft.print("  Se il prodotto e' standard procedere con il\n");
  tft.print("  pulsante NEXT lasciando i campi senza spunta.");
  
  tft.fillRect(20,90, 240, 40, MY_GREY);
  //tft.drawRect(20,125,200,40,MY_RED);
  tft.setCursor(50,103);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Battentato");

  tft.drawRect(265,90,40,40,MY_RED);//disegno il check box spunta battentato
  tft.fillRect(266,91, 38, 38, MY_GREY);
  
  tft.fillRect(20,140, 240, 40, MY_GREY);
  tft.setCursor(25,148);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Alta Densita'");

  tft.drawRect(265,140,40,40,MY_RED);//disegno il check box spunta Alta Densità
   tft.fillRect(266,141, 38, 38, MY_GREY);
  
  tft.fillRect(20,190, 115, 40, MY_RED);//Disegno pulsante next
  tft.setCursor(45,203);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("NEXT");

  tft.fillRect(145,190, 115, 40, MY_RED);//Disegno pulsante HOME
  tft.setCursor(165,203);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("HOME");
}

void setup() {

  Serial.begin(9600);
  tft.reset();
  tft.begin(0x9341);//driver display
  tft.setRotation(3);//set the display diretion(0-3)
  tft.drawRect(0,0,318,240,WHITE);
  tft.setCursor(90,40);
  tft.setTextColor(WHITE);
  tft.setTextSize(6);
  tft.print("C4P1");

  tft.setCursor(40,100);
  tft.setTextSize(3);
  tft.print(" for EDILTEC");
  tft.print("\n");
  tft.print("\n");
  
  tft.setCursor(50,130);
  tft.setTextSize(2);
  tft.setTextColor(YELLOW);
  tft.print("project and program");
  tft.setCursor(80,150);
  tft.print("By:Filomeni M.");
  tft.print("\n");

  tft.setTextSize(2);
  tft.setTextColor(WHITE);
  tft.setCursor(50, 190);
  tft.print("Loading sistem...");
  tft.print("\n");
  //loading bar
  for (int i; i < 280; i++)
  {
    tft.fillRect(BAR_MINY - 10, BLUEBAR_MINX, i, 10, RED);
    tft.setCursor(30, 270);
    delay(7);
  }

   drawHome();
}

void loop() {
   TSPoint p = ts.getPoint();
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    
    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(),0);//tft.width 320px
    p.y = map(p.y, TS_MINY, TS_MAXY, 0,tft.height());//tft.height 240px
    
    Serial.print("("); Serial.print(p.x);
    Serial.print(", "); Serial.print(p.y);
    Serial.println(")");
if(currentpage==0){
 //HOME
  currentpage=0;
drawHome();
  if (p.x > 32 && p.x < 267 && p.y > 175 && p.y < 208) {
  currentpage=1;
  }

}
  if(currentpage==1){
  drowBTHD();
  }
}

}

prova così.... dovrebbe andare più o meno :slight_smile:

#include <Elegoo_GFX.h>    // Core graphics library
#include <Elegoo_TFTLCD.h>
#include <TouchScreen.h>

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

#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define MY_BLACK 0x2145
#define MY_RED 0xDAEC
#define MY_GREY 0x52CB

#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin

#define TS_MINX 120
#define TS_MAXX 900

#define TS_MINY 70
#define TS_MAXY 920

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define BUTTONSIZE 40
#define REDBAR_MINX 80
#define GREENBAR_MINX 130
#define BLUEBAR_MINX 210
#define BAR_MINY 30
#define BAR_HEIGHT 260
#define BAR_WIDTH 30

#define MINPRESSURE 10
#define MAXPRESSURE 1000

//int touch = 0;
int prog = 0;
int currentpage = 0;
bool BT = 1;
bool HD = 1;
bool touch = 0;

bool daDisegnare = true; // serve per sapere se disegnare la pagina

void drawHome() {
  //HOME
  //currentpage = 0;
  tft.fillScreen(MY_BLACK);
  tft.drawRect(0, 0, 318, 240, WHITE); //cornice bianca (distanza sx, top, width,height)

  tft.fillRect(1, 1, 316, 20, MY_GREY); //Disegno il banner (distanza sx, top, width,height)
  tft.setTextColor(YELLOW);//colore del testo giallo
  tft.setTextSize(1);//dimensione del font
  tft.setCursor(10, 7); //mi posiziono per la scrittura sul banner
  tft.print("C4P1 - By: Filomeni Maurizio  - for EDILTEC");//scrivo

  tft.fillRect(50, 30, 220, 40, MY_RED); //Disegno il pulsante (distanza sx, top, width,height)
  //tft.drawRect(50,80,200,40,MY_RED);
  tft.setCursor(82, 40); //mi posiziono per la scrittura sul pulsante
  tft.setTextColor(WHITE);//colore del testo bianco
  tft.setTextSize(3);//dimensione del font
  tft.print("Programma");//scrivo

  tft.fillRect(50, 80, 220, 40, MY_RED); //secondo pulsante come sopra
  //tft.drawRect(20,125,200,40,MY_RED);
  tft.setCursor(82, 90);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Contatori");

  tft.fillRect(50, 130, 220, 40, MY_RED); //terzo pulsante come sopra
  //tft.drawRect(20,170,200,40,MY_RED);
  tft.setCursor(100, 140);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Setting");

  tft.fillRect(50, 180, 220, 40, MY_RED); //quarto pulsante come sopra
  //tft.drawRect(20,215,200,40,MY_RED);
  tft.setCursor(90, 190);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Test C4P");
  //FINE HOME
}
void drowBTHD() {
  tft.fillScreen(MY_BLACK);
  tft.drawRect(0, 0, 318, 240, WHITE); //cornice bianca (distanza sx, top, width,height)

  tft.fillRect(1, 1, 316, 20, MY_GREY); //Disegno il banner (distanza sx, top, width,height)
  tft.setTextColor(YELLOW);//colore del testo giallo
  tft.setTextSize(1);//dimensione del font
  tft.setCursor(10, 7); //mi posiziono per la scrittura sul banner
  tft.print("C4P1 - By: Filomeni Maurizio  - for EDILTEC");//scrivo

  tft.fillRect(1, 30, 316, 50, MY_GREY);
  tft.setCursor(50, 35);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.print("Finitura - Densita'");
  tft.print("\n");
  tft.setTextSize(1);
  tft.setTextColor(YELLOW);
  tft.print("  Se il prodotto e' standard procedere con il\n");
  tft.print("  pulsante NEXT lasciando i campi senza spunta.");

  tft.fillRect(20, 90, 240, 40, MY_GREY);
  //tft.drawRect(20,125,200,40,MY_RED);
  tft.setCursor(50, 103);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Battentato");

  tft.drawRect(265, 90, 40, 40, MY_RED); //disegno il check box spunta battentato
  tft.fillRect(266, 91, 38, 38, MY_GREY);

  tft.fillRect(20, 140, 240, 40, MY_GREY);
  tft.setCursor(25, 148);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Alta Densita'");

  tft.drawRect(265, 140, 40, 40, MY_RED); //disegno il check box spunta Alta Densità
  tft.fillRect(266, 141, 38, 38, MY_GREY);

  tft.fillRect(20, 190, 115, 40, MY_RED); //Disegno pulsante next
  tft.setCursor(45, 203);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("NEXT");

  tft.fillRect(145, 190, 115, 40, MY_RED); //Disegno pulsante HOME
  tft.setCursor(165, 203);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("HOME");
}

void setup() {
  Serial.begin(9600);
  tft.reset();
  tft.begin(0x9341);//driver display
  tft.setRotation(3);//set the display diretion(0-3)
  tft.drawRect(0, 0, 318, 240, WHITE);
  tft.setCursor(90, 40);
  tft.setTextColor(WHITE);
  tft.setTextSize(6);
  tft.print("C4P1");

  tft.setCursor(40, 100);
  tft.setTextSize(3);
  tft.print(" for EDILTEC");
  tft.print("\n");
  tft.print("\n");

  tft.setCursor(50, 130);
  tft.setTextSize(2);
  tft.setTextColor(YELLOW);
  tft.print("project and program");
  tft.setCursor(80, 150);
  tft.print("By:Filomeni M.");
  tft.print("\n");

  tft.setTextSize(2);
  tft.setTextColor(WHITE);
  tft.setCursor(50, 190);
  tft.print("Loading sistem...");
  tft.print("\n");
  //loading bar
  for (int i; i < 280; i++) {
    tft.fillRect(BAR_MINY - 10, BLUEBAR_MINX, i, 10, RED);
    tft.setCursor(30, 270);
    delay(10);   
  }
  //drawHome();
}

void loop() {
  // in base al valore di currentpage disegno la schermata
  if (currentpage == 0 && daDisegnare) {
    drawHome();
    daDisegnare = false;
  }
  else if (currentpage == 1 && daDisegnare) {
    drowBTHD();
    daDisegnare = false;
  }
  else if (currentpage == 2 && daDisegnare) {
    //drawSetting();
    //daDisegnare = false;
  }

  // controllo il touch
  TSPoint p = ts.getPoint();
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0); //tft.width 320px
    p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); //tft.height 240px

    Serial.print("x= "); Serial.print(p.x);
    Serial.print(", y=  "); Serial.println(p.y);
    // pagina home
    if (currentpage == 0) {
      // se il tocco è all'interno delle coordinate del pulsante 1
      if (p.x > 50 && p.x < 270 && p.y > 30 && p.y < 70) {
        currentpage = 1; // pagina programma
        daDisegnare = true;
      }
      // se il tocco è all'interno delle coordinate del pulsante 2
      else if (p.x > 50 && p.x < 270 && p.y > 80 && p.y < 120) {
        currentpage = 2; //pagina contatori
        daDisegnare = true;
      }
      // se il tocco è all'interno delle coordinate del pulsante 3
      else if (p.x > 50 && p.x < 270 && p.y > 130 && p.y < 170) {
        currentpage = 3;  // pagina setting
        daDisegnare = true;
      }
      // se il tocco è all'interno delle coordinate del pulsante 4
      else if (p.x > 50 && p.x < 270 && p.y > 180 && p.y < 220) {
        currentpage = 4;  // pagina test c4p
        daDisegnare = true;
      }
    }
    //pagina 1
    if (currentpage == 1) {
      // se il tocco è all'interno delle coordinate del checkbox battentato
      if (p.x > 265 && p.x < 305 && p.y > 90 && p.y < 130) {
        // battentato= true;
      }
      // se il tocco è all'interno delle coordinate del checkbox alta densità
      else if (p.x > 265 && p.x < 305 && p.y > 140 && p.y < 180) {
        // altaDensita= true;
      }
      // se il tocco è all'interno delle coordinate del pulsante next
      else if (p.x > 20 && p.x < 135 && p.y > 190 && p.y < 230) {
        //currentpage = 3;  // pagina setting
        //daDisegnare = true;
      }
      // se il tocco è all'interno delle coordinate del pulsante home
      else if (p.x > 145 && p.x < 260 && p.y > 190 && p.y < 230) {
        currentpage = 1;  // pagina home
        daDisegnare = true;
      }
    }
  }
}

edit corretto l'errore

Sei stato molto gentile! Comunque ho fatto un test al volo e non funziona, la loading bar è lentissima (troppo) e ho dovuto commentarla per procedere, Si blocca senza farmi vedere la "home" con i pulsanti, questo perchè era commentata la funzione per "disegnare" la home "drawHome()". Tolto il commento sulla funzione mi presenta la home con i pulsanti ma il tocco non funziona!
Ora non ho tempo, magari questa sera ci do uno sguardo meglio... E ti farò sapere.
Al momento ti ringrazio molto per il tuo tempo prezioso che mi hai dedicato :wink:
Maurizio Filomeni

non funzionava perchè ho scritto:
if (currentpage == 0 && daDidegnare) { //daDisegnare e non daDidegnare :slight_smile:

la riga drawHome() nel setup non è necessaria in quanto nel loop la prima cosa che fa è disegnare la pagina appropriata :wink:

per il tocco non l'ho provato ma secondo me o devi invertire le coordinate come ti avevo spiegato nell'altro post o c'è qualche altro errore, siccome hai a monitor seriale le coordinate del tocco... dovrebbe essere semplice verificare

Ciao,
Perfetto è funzionante! Sei stato molto gentile sono riuscito a capire il meccanismo e per me è stato molto importante... Ora procedo con il progetto che si presenta molto lungo e complesso, ci risentiremo al prossimo POST :wink:
Grazie 1000
Maurizio Filomeni

bene, buon lavoro allora :wink: