Comment faire un menu avec plusieurs pages

le code test " chrono"


#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GC9A01A.h"

#include <Wire.h>

/////////////////////////  ECRAN ROND 1,28 " //////////////////

#define BLACK      0x0000
#define RED        0xF800
#define GREEN      0x07E0
#define CYAN       0x07FF
#define CYAN     0xFFE0
#define WHITE      0xFFFF
#define Maroon     0x7800


#define TFT_DC  9
#define TFT_CS  10

Adafruit_GC9A01A tft(TFT_CS, TFT_DC);
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>
#include <Fonts/FreeSansBold18pt7b.h>
#include <Fonts/FreeSansBold24pt7b.h>

int oldSec, oldMi, T;

#include <OneButton.h>

const int boutonPin = 2; // Broche du bouton
unsigned long tempsDebut = 0;     // Stocke le temps auquel le chronomètre est démarré
unsigned long tempsPasse = 0;     // Stocke le temps écoulé depuis le démarrage du chronomètre
bool chronometreEnMarche = false; // Indique si le chronomètre est en cours d'exécution

OneButton bouton(boutonPin, true); // Créez un objet OneButton en spécifiant la broche du bouton et si elle est en mode pull-up

void setup() {
  Serial.begin(9600); // Initialise la communication série

  ////////////////// TFT ////////////////////
  tft.begin();
  tft.fillScreen(GC9A01A_BLACK);
  
  bouton.attachClick(toggleChronometre); // Attachez la fonction toggleChronometre() à l'événement de clic sur le bouton
  bouton.attachLongPressStart(startResetChronometre); // Attachez la fonction startResetChronometre() à l'événement de début d'appui long sur le bouton
  bouton.attachDuringLongPress(resetChronometre); // Attachez la fonction resetChronometre() à l'événement de maintien d'appui long sur le bouton
}

void loop() {
  
  bouton.tick(); // Appel de la méthode tick() de la bibliothèque OneButton dans la boucle loop()
if (T == 0) {
    tft.setTextSize(8);
        tft.setCursor(65, 90);
    tft.print(00);
    tft.setCursor(15, 90);
    tft.print(00);
        tft.setCursor(180, 90);
    tft.print(00);
    tft.setCursor(130, 90);
    tft.print(00);
            tft.setCursor(96, 104);
    tft.print(":");
    T = 1;
}
  if (chronometreEnMarche) {
    unsigned long tempsActuel = millis();
    tempsPasse = tempsActuel - tempsDebut;
  }
  afficherTemps(tempsPasse);
  delay(10); // Légère pause pour la stabilité
}

void toggleChronometre() {
  if (chronometreEnMarche) { // Si le chronomètre est en marche, arrêtez-le
    tempsPasse = millis() - tempsDebut;
    chronometreEnMarche = false;
  } else { // Sinon, démarrez ou redémarrez le chronomètre
    tempsDebut = millis() - tempsPasse;
    chronometreEnMarche = true;
  }
}

void startResetChronometre() {
  // Si l'appui long débute alors que le chronomètre est arrêté, remettez-le à zéro
  if (!chronometreEnMarche) {
    resetChronometre();
  }
}

void resetChronometre() {
  // Réinitialise le chronomètre en remettant à zéro les variables
  tempsDebut = 0;
  tempsPasse = 0;
  chronometreEnMarche = false;
  Serial.println("Chronomètre réinitialisé !");
}

void afficherTemps(unsigned long temps) {
  unsigned long secondes = temps / 1000;
  unsigned long minutes = secondes / 60;
  secondes %= 60;
 
   tft.setTextSize(8);
  tft.setTextColor(WHITE);

  if (oldMi != minutes) {
    tft.fillRect(5, 78, 120, 86, tft.color565(0, 0, 0)); // carré pour effacer les minutes
    tft.setCursor(65, 90);
    tft.print(minutes % 10, DEC);
    tft.setCursor(15, 90);
    tft.print(minutes / 10, DEC);
   oldMi = minutes;
  }
    if (oldSec != secondes) {
    tft.fillRect(116, 78, 120, 86, tft.color565(0, 0, 0)); // carré pour effacer les secondes
  //  tft.fillRect(98, 90, 6, 22, tft.color565(0, 0, 0)); // // carré pour effacer les : des minutes
    tft.setCursor(180, 90);
    tft.print(secondes % 10, DEC);
    tft.setCursor(130, 90);
    tft.print(secondes / 10, DEC);
            tft.setCursor(96, 104);
    tft.print(":");
    oldSec = secondes;
  }
}