Menu arduino et sous menu

bonjour j'essaie depuis un bon moment j'en suis arriver a sa qlq pourrait m'aider a faire les sous menu puis pouvoir les changé les valeur
voici mon code

#include <UTFTGLUE.h>
#include <TouchScreen.h>

UTFTGLUE myGLCD(0, A2, A1, A3, A4, A0);

#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 3800
#define TS_MAXY 4000
TouchScreen ts = TouchScreen(8, A3, A2, 9, 300); //XP = 8, XM = A2, YP = A3, YM = 9

void setup() {
  myGLCD.InitLCD();
  myGLCD.setFont(BigFont);
  myGLCD.clrScr();
  
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(0, 0, 0);
  
  myGLCD.print("Parametres", CENTER, 20);
  
  int rectWidth = (myGLCD.getDisplayXSize() - 50) / 2;
  int rectHeight = 60;
  int rectSpacing = 15;
  
  int startY = 110;
  
  // Draw and label the rectangles
  int rect1Left = 20;
  int rect1Top = startY;
  int rect1Right = rect1Left + rectWidth;
  int rect1Bottom = rect1Top + rectHeight;
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect(rect1Left, rect1Top, rect1Right, rect1Bottom);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRect(rect1Left, rect1Top, rect1Right, rect1Bottom);
  myGLCD.print("Luminosite", rect1Left + 10, rect1Top + (rectHeight / 2) - 10);
  
  int rect2Left = rect1Right + rectSpacing;
  int rect2Top = startY;
  int rect2Right = rect2Left + rectWidth;
  int rect2Bottom = rect2Top + rectHeight;
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect(rect2Left, rect2Top, rect2Right, rect2Bottom);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRect(rect2Left, rect2Top, rect2Right, rect2Bottom);
  myGLCD.print("Humidite", rect2Left + 10, rect2Top + (rectHeight / 2) - 10);
  
  int rect3Left = 20;
  int rect3Top = rect1Bottom + rectSpacing;
  int rect3Right = rect3Left + rectWidth;
  int rect3Bottom = rect3Top + rectHeight;
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect(rect3Left, rect3Top, rect3Right, rect3Bottom);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRect(rect3Left, rect3Top, rect3Right, rect3Bottom);
  myGLCD.print("Date/Heure", rect3Left + 10, rect3Top + (rectHeight / 2) - 10);
  
  int rect4Left = rect3Right + rectSpacing;
  int rect4Top = rect2Bottom + rectSpacing;
  int rect4Right = rect4Left + rectWidth;
  int rect4Bottom = rect4Top + rectHeight;
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect(rect4Left, rect4Top, rect4Right, rect4Bottom);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRect(rect4Left, rect4Top, rect4Right, rect4Bottom);
  myGLCD.print("Manuel", rect4Left + 10, rect4Top + (rectHeight / 2) - 10);
}

void loop() {
  TSPoint touch = ts.getPoint();

  int touchX = map(touch.x, TS_MINX, TS_MAXX, 0, myGLCD.getDisplayXSize());
  int touchY = map(touch.y, TS_MINY, TS_MAXY, 0, myGLCD.getDisplayYSize());
  
   int rectWidth = (myGLCD.getDisplayXSize() - 50) / 2;
  int rectHeight = 60;
  int rectSpacing = 15;
  int startY = 110;
  
  
  if (touch.z > 1) {
    // Check if touch is inside the first rectangle
    if (touchX > 20 && touchX < 20 + rectWidth && touchY > startY && touchY < startY + rectHeight) {
      // Add your code for adjusting screen brightness here
    }
    
    // Add your code for the other rectangles here
    
    delay(2000); // Wait for 2 seconds
  }
}

Bonjour et bienvenue,

Merci de prendre quelques minutes pour lire les bonnes pratiques du forum francophone et les appliquer.

En particulier, la mise en forme du code avec les balises <code/>

Ce que tu demandes n'est pas forcément simple, mais heureusement il existe une bibliothèque Arduino qui le fait très bien.

Je te conseille de la tester et voir si elle te convient. Ce sera plus facile pour faire évoluer ton code et ses menus.

J'ajouterai qu'une explication de ce ce que doit faire le programme et quelques mot sur son organisation plutôt que de balancer des lignes de codes sans explication te permettrait très probablement d'avoir plus d'aide.

Mais c'est toi qui vois.

Il faut comme l'indique @fdufnews que tu mettes ton code dans des balises <code> et que tu l'indente au préalable pour que ton code soit plus facilement lisible.

En essayant de prendre du temps pour déchiffrer ton code, il semble que tu te sois arrêter à afficher le menu de premier niveau.
Au plutôt que tu as modifier un code d'exemple de base?

Du coup, il faut maintenant que tu affiche le sous menu correspondant au premier écran, lorsque tu pose ton doigt sur le premier rectangle.
Modifier aussi la détection du "touche", pour s'adapter au niveau de menu dans le quel tu te trouve.

Ce genre de programme, se prête bien à l'utilisation de machine d'état, mais ne connaissant pas ton niveau de codage et présumant que tu es un débutant, je ne te le conseillerais pas.
La proposition de @lesept me semble la meilleur solution pour toi.

bonjour, voici le projet et le materiel avec un DHT21 ou dht22 une DS3231, [Module d'affichage LCD TFT 3.5 pouces, 480x320 ,un arduino me6520, et un Clavier AD simulant cinq modules de touches, bouton analogique

j'aimerai un menu simple pour pouvoir naviguer avec que qlq réglage genre heure/date humidite le % voulue ainsi qun mode manuel qui active un moteur pendant 30 sec si il est appuier et qu'il lis les valeurs temperature et humidité tout les minutes

en effeet je suis debutant en proggramation j'utilise le chat gpt mais il n'arri pas bien a faire le menu simple avant de passer au plus compliqueé j'ai pu avoir les code des autres composant.

le premier paragraphe cest a dire en morceau ?

A mon humble avis, tu n'as pas besoin de menu pour ça. Tu raisonnes comme si tu étais devant un PC sous Windows. Mais ici c'est différent. Tu as des boutons et un afficheur. C'est ton interface homme machine, elle te permet de commander ton Arduino pour qu'il interroge ses capteurs (DHT et DS3231) et affiche des choses sur ton écran.

Ton programme va 'écouter' le clavier et en fonction des touches enfoncées il exécutera des fonctions : lecture capteur et affichage température ou humidité, affichage de l'heure.

oui je vois se serait pas mal de dédier direct les bouton au action mais j'aurai aimer pouvoir modifier l'heure et date sans pour autant passer par le pc est ce qu'il y aurai moyen stp de m'aider avec les sous menu svp
j'ai essayer les Example envoyer mais j'ai des erreur je m'en sort pas trop

Pour ça c'est pareil, tu peux le faire avec des boutons. Si ton écran est tactile, tu peux aussi faire des boutons sur l'écran.

Peux-tu donner plus de détails sur ton matériel ?

  • écran tactile on non ?
  • qu'est-ce que ce clavier AD ? Tu peux montrer une photo ou pointer vers le site vendeur ?
  • qu'entends-tu par 'bouton analogique' ?

bonjour merci de ta reponse voici les reference du clavier que j'ai citer https://fr.aliexpress.com/item/32800088501.html?spm=a2g0o.order_list.order_list_main.30.17485e5b91fcXc&gatewayAdapt=glo2fra

l'ecran est tactile mais si sa simplifie la chose cest pas grave de ne pas l'utiliser voici sa reference :

https://fr.aliexpress.com/item/1005002657180870.html?spm=a2g0o.order_list.order_list_main.40.17485e5b91fcXc&gatewayAdapt=glo2fra

j'ai un dht11 plus tard je vais prendre un dht22

OK, merci
Je trouve ton clavier ici aussi, avec des explications :
https://www.keyestudio.com/products/keyes-ad-keyboard-simulate-five-key-module-analog-button-for-arduino-sensor-expansion-board

Analog acquisition, press the different buttons of different voltage output

Donc, si je comprends bien tu le connectes sur une entrée analogique et un analogRead te fournit une valeur différente selon qu'un bouton est pressé ou non ? L'as-tu testé dans un premier temps, afin de voir comment il fonctionne ?

Pour l'écran, as-tu réussi à le faire fonctionner (avec quelles bibliothèques), pour afficher quelque chose ? As-tu testé le tactile ?

Si je peux me permettre, tu cherches à faire trop compliqué de suite, alors que tu ne maitrise pas du tout ton matériel.
Commence par des choses simples, affichage de la température lu par exemple.
laisse tomber les menus pour l'instant qui ne sont pas vraiment vital à ton projet.
Lorsque tu auras acquis plus d'expérience sur ton matériel, tu pourra rajouter ces fonctionnalités.

Du coup tu bloque sur quoi exactement, car le sous menu c'est un peu vague?
à la vu de ton code, au démarrage de ton application, tu affiche l'heure et la date.
Quand tu appuis sur ton écran, le contenu de la fonction afficheMenu, ne s'affiche pas ?

Je ne suis pas sûre de comprendre ce que tu veux dire, les key_read ne sont pas justement l'utilisation de ton écran tactille?

Non c'est son clavier (voir le lien au #12)

@duck971
Au passage, je pense que les fourchettes de valeurs testées dans le code sont un peu étroites. Elles sont tout juste au niveau du bruit de conversion. Personnellement, j'aurais mis au moins ±5.

En fait le problème, c'est que les appuis boutons ne transmettent aucune information au menu.
key-read n'est pas traduit en un numéro de bouton qui serait passé à afficheMenu().
Dans afficheMenu() tu as la variable selectedOption qui n'est modifiée nulle part.

Dans loop(), tu dois avoir un affichage par défaut, disons l'heure.
Ensuite tu dois juste tester si une touche est appuyée. Cet appui change l'affichage et fait apparaître le menu.
C'est là qu'il faut ensuite lire le clavier pour savoir quel option l'utilisateur veut sélectionner.
Tu affectes le numéro de l'option sélectionnée à une variable et tu quittes le menu.
Dans loop() tu regardes le contenu de la variable qui contient le numéro de l'option et tu adaptes l'affichage.

ha oui j'ai oublié que c'était un clavier analogique :scream:

bonjour d'accord merci je changerai les valeurs

aufait oui cest sa au demarage il affiche l'heure/date température et humidité puis quand j'appuie il affiche le menu et je suis bloqué apres, cest a dire quand j'appuie la touche ok exemple au 1er il m'affiche pas la possiblité de modifier soit la date ou l'heure.

malheureusement j'ai pas trop compris ce qu'il manque au code

je ne vois pas dans ton code l'endroit ou tu demande l'affichage du sous-menu, lorsque tu fais ok
ok correspond à quel valeur de key-read ?

Il me semble que tu n'a pas non plus d'affichage dédié à la modification de l'heure par exemple?

Désolé de redire une nouvelle fois la même chose (c'est la dernière fois, promis !) : tu n'as pas besoin de menus ou de sous-menus qui sont compliqués à mettre en œuvre.

Tu as un écran tactile et des boutons, c'est suffisant.

Pour modifier l'heure par exemple, tu peux cliquer sur le nombre des heures et utiliser les boutons haut et bas pour l'incrémenter ou la décrémenter. Même chose pour les minutes, le mois, la date, etc.

C'est bien plus simple que de faire des menus, qui vont entraîner d'autres besoins.

Il te suffit donc de détecter un appui sur la zone qui contient le chiffre que tu veux modifier, puis détecter les appuis sur les boutons : haut ou bas pour modifier, bouton "isolé" ou clic autre part sur l'écran pour sortir du mode de modification.

Si tu veux faire ça bien tu peux même le faire comme une machine à états (voir tuto de @J-M-L sur le forum). Mais sinon, ça se fait très bien avec des if...