Menu pour écran TFT

Bonjour,

J’essaye de faire un menu de base pour un écran TFT 3.2" rien de bien sorcier pour vous mais pour moi c’est une autre histoire.
J’arrive à changer de menu mais quand j’arrive sur le 2éme menu aussitôt l’écran se rafraîchit et repasse sur la page d’accueil.
Je joint mon petit code si une âme charitable pouvait me porté secoure.
Merci

#include <Arduino.h>
#include <UTFT.h> // Librairie gestion ecran TFT
#include <UTouch.h> // Librairie gestion tactile ecran TFT
#include <UTFT_tinyFAT.h> // Librairie gestion carte SD
#include <tinyFAT.h> // Librairie gestion carte SD	
	
UTFT        myGLCD(ITDB32WD, 38,39,40,41);   
UTouch      myTouch(6,5,4,3,2);							
UTFT_tinyFAT myFiles(&myGLCD);

void setup()								
{										
  myGLCD.InitLCD();								  
  myGLCD.clrScr();								 
  myTouch.InitTouch();								 
  myTouch.setPrecision(PREC_MEDIUM);	
  file.initFAT(SPISPEED_HIGH);					 
}										

void loop()									
{							
  int x, y;									  
 Homescreen();										  
  while (myTouch.dataAvailable() == true)					  
  {										  
    myTouch.read();								    
    x = myTouch.getX();								    
    y = myTouch.getY();	

   if (((y>=200) && (y<=239)) && ((x>=260) && (x<=319))) // si appuie sur cette zone alors exécution de pwm
      {      
      pwm();						      
      }										    
  }										  
}										
void Homescreen(){
    myFiles.loadBitmap(0 ,0,400,240,"Home.raw"); //image de fond 
  }
void pwm(){
    myFiles.loadBitmap(0 ,0,400,240,"pwm.raw"); //image de fond 
  }

le plus simple tu definie une variable globale dont tu change la valeur quant tu selectione une touche , ensuite un simple switch te perme de lance la page que tu souaite :

byte selecteurPage=0;
void setup(){}
void loop(){

switch( selecteurPage){// on selection l'affichage de page voulut

case 0:
page0();// on afiche la page 0 index par exemple
break;
case 1:
page1();// si la valeur de notre selecteur vaut 1 on affiche la page 1
break;
case 2:
page2();
break;
case 3:
page3();
break;
default:
page0();
break;}

}

Pour le changement de valeur de “selecteurPage” vous me conseillez de passer par des IF? exemple:

if ( x>=1 && x<=200 && y>=1 && y<=239) // selection de l'affichage 1
{selecteurPage=1;}
if ( x>=201 && x<=399 && y>=1 && y<=239)// selection de l'affichage 2
{selecteurPage=2;}

je te conseil deja de te cree une fonction qui va te dire si il y a apuis sur une zone ou pas !

moi c’est ce que j’ai fait en prenant example sur mon club elec :www.Mon-Club-Elec.fr | MAIN / ArduinoExpertTFTGraphiqueCouleur240x320TouchpadTestToucheCentrale

voici ce que ça donne chez moi:

boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur)
{
    int testX;
    int testY;
    boolean reponse=false;
    if (dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        read();// read() est une fonction de la lib Utouch.h
        X=getX(), Y=getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
        {
            reponse= true;
        }
        else
        {
            reponse=false;
        }
    }
    return reponse;
}

ensuite tu pourra te faire des :

if ( testouche(int zoneX, int zoneY,int Longueur,int hauteur)){

selecteurPage=X; }

cette partie

int x, y;  
 Homescreen();  
  while (myTouch.dataAvailable() == true)  
  {  
    myTouch.read();    
    x = myTouch.getX();    
    y = myTouch.getY();

n’a t elle pas la même fonction?

boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur)
{
    int testX;
    int testY;
    boolean reponse=false;
    if (dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        read();// read() est une fonction de la lib Utouch.h
        X=getX(), Y=getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à  ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à  ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
        {
            reponse= true;
        }
        else
        {
            reponse=false;
        }
    }
    return reponse;
}

c'est proche efectivement mais dans ton cas si par maleur tu reste en apuis ça risque de bloqué le deroulement de ton programe je pense et surtout tu te limite a une seul touche apparament !

Non, des liens de touche, je pense en avoir une dizaine et une à deux sous menu par liens. Je ne parviens pas à faire fonctionné la partie que tu m'as transmis j'ai par exemple: dataAvailable' was not declared in this scope

c’etait un exemple que je te fournisai il faut remplace mes dataavaibe par tes myTouch.dataAvailable() de meme pour les autre fonction defini dans utouch!

boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur)
{
    int testX;
    int testY;
    boolean reponse=false;
    if (myTouch.dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        myTouch.read();// read() est une fonction de la lib Utouch.h
        X=myTouch.getX(), Y=myTouch.getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
        {
            reponse= true;
        }
        else
        {
            reponse=false;
        }
    }
    return reponse;
}

j’ai modifier ce code devrai fonctioné

Bonne nouvelle, j’avance mais il reste cela: return-statement with a value, in function returning ‘void’

void loop()									
{boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur);
{
    int testX,testY;
    int X,Y,zoneX,zoneY,Longueur,hauteur;
    boolean reponse=false;
    if (myTouch.dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        myTouch.read();// read() est une fonction de la lib Utouch.h
        X=myTouch.getX(), Y=myTouch.getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
        {
            reponse= true;
        }
        else
        {
            reponse=false;
        }
    }
    return reponse;
}
						  
}

houlala … bon je veut pas te paraitre mechant mais il me semble qu’il va faloir reprendre les basse !

que te dit ton compilateur :“return-statement with a value, in function returning ‘void’” il te dit en gros que tu as une fonction qui est definie en VOID donc qui ne retourne RIEN et que la tu cherche a lui faire retourné quelque chose —> ça il aime pas donc il t’insulte (gentilment hein!! :grin: )

donc en y regardant pourquoi as tu mi la definition de la fonction testTouche() dans le"coeur" de ton programme?

la fonction testTouche doit etre mis en dehor et on y fait appelle dans la boucle Loop:

// on defini la fonction testTouche qui est definie en bolean donc elle renvoie une variable de type booleene donc soit faux : false soit vrai: true:

boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur);
{
    int testX,testY;
    int X,Y,zoneX,zoneY,Longueur,hauteur;
    boolean reponse=false;
    if (myTouch.dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        myTouch.read();// read() est une fonction de la lib Utouch.h
        X=myTouch.getX(), Y=myTouch.getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
        {
            reponse= true;
        }
        else
        {
            reponse=false;
        }
    }
    return reponse;
}

void loop()									
{
//ici on utilse la fonction testTouche
if(TestTouche( 15, 15,15,15)==true){// ici on teste s'il y a appuis sur la touche de 15/15pixel dont le coint superieur gauche et a x=15pix et y est a 15pix
selecteurPage=1;
}
						  
}

voila regarde bien les deux code pour comprendre la diference :slight_smile:

Mille excuse, non tu n’es pas méchant bien au contraire, il serait grossier de ma part de faire le fanfaron.
J’avais mis le test touche dans le loop car j’ai vue plusieurs exemple ainsi.
Bon voilà, j’ai réussi à utilisé ton code.
Petite question sur le TestTouche(15, 15,15,15) les chiffres donne les coordonnées soit TestTouche(X, Y,X,Y) comment dans par exemple
myGLCD.drawRoundRect (0, 22, 239, 0);

J’ai rajouté if(selecteurPage==0){ if(TestTouche(Etc… pour rendre actif cette partie du tactile que dans la page 0.

#include <Arduino.h>
#include <UTFT.h> // Librairie gestion ecran TFT
#include <UTouch.h> // Librairie gestion tactile ecran TFT
#include <UTFT_tinyFAT.h> // Librairie gestion carte SD
#include <tinyFAT.h> // Librairie gestion carte SD	
	
UTFT        myGLCD(ITDB32WD, 38,39,40,41);   
UTouch      myTouch(6,5,4,3,2);							
UTFT_tinyFAT myFiles(&myGLCD);
byte selecteurPage=0;
		
// on defini la fonction testTouche qui est definie en bolean donc elle renvoie une variable de type booleene donc soit faux : false soit vrai: true:

boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur)
{
   int X, Y,testX,testY; 
    
    boolean reponse=false;
    if (myTouch.dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        myTouch.read();// read() est une fonction de la lib Utouch.h
        X=myTouch.getX(), Y=myTouch.getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
         {reponse= true;}
        else
         {reponse=false;}
    }
    return reponse;
}
void setup()								
{										
  myGLCD.InitLCD();								  
  myGLCD.clrScr();								 
  myTouch.InitTouch();								 
  myTouch.setPrecision(PREC_MEDIUM);	
  file.initFAT(SPISPEED_HIGH);					 
}	
void loop()									
{
//ici on utilse la fonction testTouche
// ici on teste s'il y a appuis sur la touche de 15/15pixel dont le coint superieur gauche et a x=15pix et y est a 15pix
if(selecteurPage==0){ if(TestTouche(15, 15,15,15)==true){selecteurPage=1;
   myGLCD.clrScr();//effacement de l'écran
   pwm();}}// utilisation de void pwm
if(selecteurPage==0){;if(TestTouche(30, 30,15,15)==true){selecteurPage=2;
   myGLCD.clrScr();//effacement de l'écran
   piscine();}}// utilisation de void piscine
if(selecteurPage>0){;if(TestTouche(30, 30,15,15)==true){selecteurPage=0;
   myGLCD.clrScr();//effacement de l'écran
   }}//retour a la premier page   					  
}
void pwm(){
myFiles.loadBitmap(0 ,0,400,240,"pwm.raw");

}void piscine(){
myFiles.loadBitmap(0 ,0,400,240,"Piscine.raw");

}

alors la fonction ne gére pas les cercles de base mais que des surfaces de type rectangulaires: dans la fonction testTouche(X,Y,A,B)

X = coordoné en x du coin superieur gauche du rectangle Y= coordoné en y du coin superieur gauche du rectangle A = longueur du rectangle sur x B=longueur du rectangle sur y

a et b ne sont pas des coordonnées .

en suite si tu fais des touches sous forme de cercle tu peut dire que le cercle rentre dans un carré dont le centre se situ au centre du cercle donc: la longueur = la hauteur = 2*le rayon les coordonées X=xcercle-rayon Y=ycercle-rayon

ensuite pour gagner du temps dans l'execution du programe crée toi des fonctions comme suit:

//////////*************************////////////
void page_1(){
//Affichage des donne de la page1

if (testtouch(blabla)){selecteurpage =2;}
}
//////////*************************////////////
void page_2(){
//Affichage des donne de la page2

if (testtouch(blabla)){selecteurpage =1;}

}
//////////*************************////////////

ensuite dans le loop il n'y a que :

void loop(){

switch(selecteurpage){

 case 1:
page_1();
break;

 case 2:
page_2();
break;

default:
page_1();
break;
}

ainsi lors de l'execution de ton programe soit la lecture en boucle du loop, le programe ne lit que la page selectioné par le selecteur de page et va ignoré le reste tu y ganera en clarté et en vitesse d'afichage

il y plein d'autre astuce que tu verra au fur et a mesure !

Une question me taraude m'esprit comment selecteurpage peux t-il changer d'état puis que la modification est faite en dehors du Loop() et que les voids pages ne sont pas appelés?

en fait le switch ( selecteurPage) qui est dans le loop, va selactioné par defaut la page-1() quant le programe ce deroul effctivement c'est le loop qui est lu mais comme il y a un switch qui oriente ver une page le programe va temporairement sortir du loop et executer la page 1. a la fin de la page in il reprendra le loop la ou il la laisé!

Dans l'exemple le selecteurPage ne peut que rester en valeur 1 et jamais en 2 ou 3.

void loop()                                 
{   
  switch(selecteurPage){

 case 1:
Home();
break;

 case 2:
page_2();
break;

 case 3:
page_3();
break;

default:
Home();
break;
  }
}
void Home(){
//Affichage de la page d'accueil
if (TestTouche(15, 15,150,15)){selecteurPage =1;}
myFiles.loadBitmap(0 ,0,400,240,"Home.raw");

}
//////////*************************////////////
void page_2(){
//Affichage des donne de la page2
if (TestTouche(30, 200,150,200)){selecteurPage =2;}
myFiles.loadBitmap(0 ,0,400,240,"pwm.raw");

}
void page_3(){
//Affichage des donne de la page2
if (TestTouche(30, 45,150,45)){selecteurPage =3;}
myFiles.loadBitmap(0 ,0,400,240,"Piscine.raw");

}

normal dans ta fonction home si il y a apuis sur la zone test le selecteur passe a 1 donc tu reste sur home si tu veux changer de page il faut faire une zone test qui lorsquelle est actioné donne une valeur a selecteur page qui soit 2,3 ou autre pour changer de page. tu peut meme faire plusier touche sur la meme page et en fonction de celle que tu actione selecteur page change et donc la page avec

void loop()                                 
{   
  switch(selecteurPage){

 case 1:
Home();
break;

 case 2:
page_2();
break;

 case 3:
page_3();
break;

default:
Home();
break;
  }
}
void Home(){
//Affichage de la page d'accueil
if (TestTouche(15, 15,150,15)){selecteurPage =2;}
myFiles.loadBitmap(0 ,0,400,240,"Home.raw");

}
//////////*************************////////////
void page_2(){
//Affichage des donne de la page2
if (TestTouche(30, 200,150,200)){selecteurPage =3;}
myFiles.loadBitmap(0 ,0,400,240,"pwm.raw");
if (TestTouche(15, 15,150,15)){selecteurPage =1;}
;

}
void page_3(){
//Affichage des donne de la page3
if (TestTouche(30, 45,150,45)){selecteurPage =2;}
myFiles.loadBitmap(0 ,0,400,240,"Piscine.raw");

}

Génial, je viens enfin de comprendre! :D

Merci à toi!

Une dernière question tu as appris tous cela ou?

Mais de rien le forum est la pour ça ! j'ai apris ça et la sur le net ! le forum ma bien aider et le site du zero ma fournie les basse C/C++ pour la programation!

Merci en tout cas, voilà le code final.

#include <Arduino.h>
#include <UTFT.h> // Librairie gestion ecran TFT
#include <UTouch.h> // Librairie gestion tactile ecran TFT
#include <UTFT_tinyFAT.h> // Librairie gestion carte SD
#include <tinyFAT.h> // Librairie gestion carte SD	
	
UTFT        myGLCD(ITDB32WD, 38,39,40,41);   
UTouch      myTouch(6,5,4,3,2);							
UTFT_tinyFAT myFiles(&myGLCD);
byte selecteurPage=0;
		
// on defini la fonction testTouche qui est definie en bolean donc elle renvoie une variable de type booleene donc soit faux : false soit vrai: true:
boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur)
{
   int X, Y,testX,testY; 
    
    boolean reponse=false;
    if (myTouch.dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        myTouch.read();// read() est une fonction de la lib Utouch.h
        X=myTouch.getX(), Y=myTouch.getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
         {reponse= true;}
        else
         {reponse=false;}
    }
    return reponse;
}
void setup()								
{										
  myGLCD.InitLCD();								  
  myGLCD.clrScr();								 
  myTouch.InitTouch();								 
  myTouch.setPrecision(PREC_MEDIUM);	
  file.initFAT(SPISPEED_HIGH);					 
}	
void loop()									
{      
  switch(selecteurPage){case 1:Home();break;
                        case 2:page_2(); break;
                        case 3:page_3();break;
                        default:Home();break; }
}
void Home(){
//Affichage de la page d'accueil
myFiles.loadBitmap(0 ,0,400,240,"Home.raw");
// si touche de cette partie alors appelle de la page_2()
if (TestTouche(15, 15,150,15)){selecteurPage =2;}
// si touche de cette partie alors appelle de la page_3()
if (TestTouche(30, 45,150,45)){selecteurPage =3;}

}
//////////*************************////////////
void page_2(){
myFiles.loadBitmap(0 ,0,400,240,"pwm.raw");
// si touche de cette partie alors appelle de la page Home
if (TestTouche(30, 200,150,200)){selecteurPage =0;}
}
void page_3(){
myFiles.loadBitmap(0 ,0,400,240,"Piscine.raw");
// si touche de cette partie alors appelle de la page Home
if (TestTouche(30, 45,150,45)){selecteurPage =0;}
}

Une petite question encore, si je fais par exemple dans void Homme()

 myGLCD.setFont(SmallFont);
 myGLCD.setColor(255, 255, 255);
 myGLCD.print("25", 30, 60);

Le 25 s'affiche correctement mais il s'efface à chaque rafraîchissement. Comment puis-je faire?