#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Bounce2.h>
// Définition des broches des boutons
const int boutonSuivantPin = 9;
const int boutonValiderPin = 6;
const int boutonInterruptionPin = 3; // Nouveau bouton pour interrompre sur D3 (interruption)
// Taille de l'écran OLED
#define LARGEUR_ECRAN 128
#define HAUTEUR_ECRAN 64
// Adresse I2C de l'écran OLED
#define OLED_RESET -1
Adafruit_SSD1306 ecran(LARGEUR_ECRAN, HAUTEUR_ECRAN, &Wire, OLED_RESET);
// Variables de menu
int indexMenu = 0; // Index du menu actuel
const int elementsMenu = 3; // Nombre d'éléments dans le menu
volatile bool interruptionDemandee = false; // Interruption demandée (volatile car utilisée dans une ISR)
bool menuActif = true; // État du menu (actif ou non)
// Déclaration des boutons avec Bounce2
Bounce boutonSuivant = Bounce();
Bounce boutonValider = Bounce();
// Texte du menu
const char* menu[] = {"Option 1", "Option 2", "Option 3"};
// Fonction pour afficher le menu
void afficherMenu() {
ecran.clearDisplay();
ecran.setTextSize(1);
ecran.setTextColor(SSD1306_WHITE);
for (int i = 0; i < elementsMenu; i++) {
if (i == indexMenu) {
ecran.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Mettre en surbrillance l'élément sélectionné
} else {
ecran.setTextColor(SSD1306_WHITE);
}
ecran.setCursor(0, i * 10);
ecran.println(menu[i]);
}
ecran.display();
}
// Sketches séparés pour les options
void option1_setup() {
Serial.println("Option 1 sélectionnée");
}
void option1_loop() {
while (!interruptionDemandee) {
Serial.println("Exécution de l'Option 1");
delay(1000); // Ajout d'une pause pour voir les messages plus distinctement
}
}
void option2_setup() {
Serial.println("Option 2 sélectionnée");
}
void option2_loop() {
while (!interruptionDemandee) {
Serial.println("Exécution de l'Option 2");
delay(1000); // Ajout d'une pause pour voir les messages plus distinctement
}
}
void option3_setup() {
Serial.println("Option 3 sélectionnée");
}
void option3_loop() {
while (!interruptionDemandee) {
Serial.println("Exécution de l'Option 3");
delay(1000); // Ajout d'une pause pour voir les messages plus distinctement
}
}
// Fonction pour lancer l'option choisie
void lancerOption(int index) {
interruptionDemandee = false; // Réinitialiser l'état d'interruption avant de commencer
switch (index) {
case 0:
option1_setup();
option1_loop();
break;
case 1:
option2_setup();
option2_loop();
break;
case 2:
option3_setup();
option3_loop();
break;
}
}
// Fonction pour réinitialiser le menu
void reinitialiserMenu() {
Serial.println("Réinitialisation du menu");
indexMenu = 0; // Réinitialiser le choix à l'option 1
menuActif = true; // Réactiver le menu
afficherMenu(); // Réafficher le menu
}
// Fonction d'interruption pour stopper l'option en cours et réinitialiser le menu
void ISR_interruption() {
interruptionDemandee = true; // Marquer que l'interruption a été demandée
}
void setup() {
// Initialisation du port série
Serial.begin(9600);
// Initialisation de l'écran OLED
if (!ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Échec de l'initialisation de l'écran OLED"));
for (;;);
}
ecran.clearDisplay();
ecran.display();
// Initialisation des boutons en INPUT_PULLUP
pinMode(boutonSuivantPin, INPUT_PULLUP);
pinMode(boutonValiderPin, INPUT_PULLUP);
pinMode(boutonInterruptionPin, INPUT_PULLUP); // Nouveau bouton pour l'interruption sur D3
// Initialisation de Bounce2 pour les boutons
boutonSuivant.attach(boutonSuivantPin);
boutonSuivant.interval(5); // Délai anti-rebond pour bouton "Suivant"
boutonValider.attach(boutonValiderPin);
boutonValider.interval(5); // Délai anti-rebond pour bouton "Valider"
// Configurer l'interruption externe sur D3
attachInterrupt(digitalPinToInterrupt(boutonInterruptionPin), ISR_interruption, FALLING);
// Afficher le menu initial
afficherMenu();
}
void loop() {
// Si le menu est actif
if (menuActif) {
// Mettre à jour l'état des boutons de navigation
boutonSuivant.update();
boutonValider.update();
// Gestion du bouton "Suivant" (navigation)
if (boutonSuivant.fell()) {
indexMenu = (indexMenu + 1) % elementsMenu; // Passer au prochain élément
afficherMenu();
}
// Gestion du bouton "Valider" (validation)
if (boutonValider.fell()) {
Serial.print("Lancement de l'option ");
Serial.println(indexMenu + 1);
menuActif = false; // Désactiver le menu
lancerOption(indexMenu); // Lancer le setup et le loop correspondant
}
}
// Si l'interruption a été demandée, réinitialiser le menu
if (interruptionDemandee) {
reinitialiserMenu();
interruptionDemandee = false; // Réinitialiser l'état d'interruption
}
}