#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Définition des broches des boutons
#define BACK_BUTTON 2
#define UP_BUTTON 3
#define OK_BUTTON 4
#define DOWN_BUTTON 5
// Définition des dimensions de l'écran OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Variables pour le menu
int menuIndex = 0; // Indice de l'option actuelle
int submenuIndex = 0; // Indice du sous-menu
bool inSubmenu = false;
bool alarmOn = false; // Statut de l'alarme
int alarmHour = 7; // Heure par défaut pour l'alarme
int alarmMinute = 0; // Minute par défaut pour l'alarme
bool is24HourFormat = true; // Format par défaut
int melodyChoice = 0; // Mélodie par défaut (0 = Melodie1, 1 = Melodie2)
bool screenOn = true; // État de l'écran (allumé ou éteint)
// Pour le défilement
const int visibleLines = 2; // Nombre d'options affichées à la fois
int scrollIndex = 0; // Premier élément affiché dans la liste
// Liste des options principales
const char *mainMenu[] = {
"Reglage de l'heure",
"Reglage de l'alarme",
"Choix de l'alarme",
"Eteindre l'ecran"
};
const int mainMenuSize = sizeof(mainMenu) / sizeof(mainMenu[0]);
// Fonctions pour afficher les menus
void displayMenu() {
if (!screenOn) return; // Ne rien afficher si l'écran est éteint
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
if (!inSubmenu) {
display.setCursor(0, 0);
display.println("Menu principal:");
for (int i = 0; i < visibleLines; i++) {
int optionIndex = scrollIndex + i;
if (optionIndex < mainMenuSize) {
display.setCursor(10, 20 + i * 20);
display.println(menuIndex == optionIndex ? "> " + String(mainMenu[optionIndex]) : " " + String(mainMenu[optionIndex]));
}
}
} else {
if (menuIndex == 0) { // Sous-menu réglage de l'heure
display.println("Format de l'heure:");
display.setCursor(10, 20);
display.println(submenuIndex == 0 ? "> 24H" : " 24H");
display.setCursor(10, 40);
display.println(submenuIndex == 1 ? "> AM/PM" : " AM/PM");
} else if (menuIndex == 1) { // Sous-menu réglage d'alarme
display.println("Reglage Alarme:");
display.setCursor(10, 20);
display.print("> ");
if (alarmHour < 10) display.print("0");
display.print(alarmHour);
display.print(":");
if (alarmMinute < 10) display.print("0");
display.print(alarmMinute);
display.println();
display.setCursor(10, 40);
display.println(submenuIndex == 1 ? "> Alarme ON" : " Alarme ON");
} else if (menuIndex == 2) { // Sous-menu choix de l'alarme
display.println("Choix de l'alarme:");
display.setCursor(10, 20);
display.println(submenuIndex == 0 ? "> Melodie1" : " Melodie1");
display.setCursor(10, 40);
display.println(submenuIndex == 1 ? "> Melodie2" : " Melodie2");
}
}
display.display();
}
void setup() {
// Initialisation des boutons
pinMode(BACK_BUTTON, INPUT_PULLUP);
pinMode(UP_BUTTON, INPUT_PULLUP);
pinMode(OK_BUTTON, INPUT_PULLUP);
pinMode(DOWN_BUTTON, INPUT_PULLUP);
// Initialisation de l'écran OLED
if (!display.begin(SSD1306_WHITE, 0x3C)) {
for (;;); // Boucle infinie si l'écran ne s'initialise pas
}
display.display();
delay(1000);
display.clearDisplay();
// Affichage initial
displayMenu();
}
void loop() {
if (!screenOn && digitalRead(OK_BUTTON) == LOW) {
screenOn = true; // Allumer l'écran avec le bouton OK
displayMenu();
delay(200);
return;
}
if (!screenOn) return; // Ne pas traiter les autres interactions si l'écran est éteint
if (digitalRead(UP_BUTTON) == LOW) {
if (!inSubmenu) {
menuIndex = (menuIndex - 1 + mainMenuSize) % mainMenuSize;
// Ajuster le défilement si nécessaire
if (menuIndex < scrollIndex) {
scrollIndex = menuIndex;
}
} else {
submenuIndex = (submenuIndex - 1 + 2) % 2; // 2 sous-options
}
displayMenu();
delay(200);
}
if (digitalRead(DOWN_BUTTON) == LOW) {
if (!inSubmenu) {
menuIndex = (menuIndex + 1) % mainMenuSize;
// Ajuster le défilement si nécessaire
if (menuIndex >= scrollIndex + visibleLines) {
scrollIndex = menuIndex - visibleLines + 1;
}
} else {
submenuIndex = (submenuIndex + 1) % 2; // 2 sous-options
}
displayMenu();
delay(200);
}
if (digitalRead(OK_BUTTON) == LOW) {
if (!inSubmenu) {
if (menuIndex == 3) { // Eteindre l'écran
screenOn = false;
display.clearDisplay();
display.display();
} else {
inSubmenu = true; // Entrer dans le sous-menu
}
} else {
if (menuIndex == 0) { // Réglage de l'heure
is24HourFormat = (submenuIndex == 0);
} else if (menuIndex == 1) { // Réglage d'alarme
if (submenuIndex == 0) {
alarmHour = (alarmHour + 1) % 24;
} else {
alarmOn = !alarmOn;
}
} else if (menuIndex == 2) { // Choix de l'alarme
melodyChoice = submenuIndex;
}
inSubmenu = false; // Retourner au menu principal après réglage
}
displayMenu();
delay(200);
}
if (digitalRead(BACK_BUTTON) == LOW) {
if (inSubmenu) {
inSubmenu = false; // Retourner au menu principal
}
displayMenu();
delay(200);
}
}