#include <Wire.h>
#include <RTClib.h>
#include <TM1637Display.h>
#include <EEPROM.h>
// Définition des broches
#define CLK 2
#define DIO 3
#define BTN_SELECT 10
#define BTN_PLUS 11
#define BTN_MINUS 12
#define BUZZER 13
#define LED_ALARM 9
// Initialisation des modules
RTC_DS1307 rtc;
TM1637Display display(CLK, DIO);
// Variables globales
int alarm_h = 7, alarm_m = 0;
bool alarm_set = false;
void setup() {
Serial.begin(9600);
Serial.println("Démarrage du réveil...");
pinMode(BTN_SELECT, INPUT_PULLUP);
pinMode(BTN_PLUS, INPUT_PULLUP);
pinMode(BTN_MINUS, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
pinMode(LED_ALARM, OUTPUT);
display.setBrightness(7);
if (!rtc.begin()) {
Serial.println("Erreur RTC");
display.showNumberDec(9999);
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
EEPROM.get(0, alarm_h);
EEPROM.get(1, alarm_m);
EEPROM.get(2, alarm_set);
display.showNumberDecEx(alarm_h * 100 + alarm_m, 0b01000000, true);
digitalWrite(LED_ALARM, alarm_set ? HIGH : LOW);
Serial.println("Réveil prêt.");
}
void loop() {
DateTime now = rtc.now();
display.showNumberDecEx(now.hour() * 100 + now.minute(), 0b01000000, true); // Affichage de l'heure actuelle
// Gestion de l'activation et désactivation de l'alarme en dehors du menu
if (digitalRead(BTN_PLUS) == LOW) {
alarm_set = true; // Activer l'alarme
EEPROM.put(2, alarm_set); // Sauvegarder l'état de l'alarme dans l'EEPROM
digitalWrite(LED_ALARM, HIGH); // Allumer la LED d'alarme
Serial.println("Alarme activée");
delay(200); // Délai pour éviter les rebonds
}
if (digitalRead(BTN_MINUS) == LOW) {
alarm_set = false; // Désactiver l'alarme
EEPROM.put(2, alarm_set); // Sauvegarder l'état de l'alarme dans l'EEPROM
digitalWrite(LED_ALARM, LOW); // Éteindre la LED d'alarme
Serial.println("Alarme désactivée");
delay(200); // Délai pour éviter les rebonds
}
// Si l'heure de l'alarme est atteinte et activée, faire sonner l'alarme
if (now.hour() == alarm_h && now.minute() == alarm_m && alarm_set) {
Serial.println("Alarme déclenchée !");
for (int i = 0; i < 10; i++) {
digitalWrite(BUZZER, HIGH);
delay(500);
digitalWrite(BUZZER, LOW);
delay(500);
}
}
// Vérification de l'appui sur le bouton Select pour entrer dans le menu de réglage
if (digitalRead(BTN_SELECT) == LOW) {
Serial.println("Appui sur Select - Entrée dans le menu de réglage");
delay(200); // Délais pour éviter les rebonds
reglerHeureOuAlarme(); // Lancer le menu de réglage
}
delay(100); // Petite pause pour limiter les boucles
}
void reglerHeureOuAlarme() {
int mode = 0;
while (true) {
if (mode == 0) {
display.showNumberDecEx(1111, 0b01000000, true);
Serial.println("Mode de réglage de l'heure sélectionné");
if (digitalRead(BTN_SELECT) == LOW) { delay(200); mode = 1; }
} else if (mode == 1) {
reglerHeure();
mode = 2;
} else if (mode == 2) {
display.showNumberDecEx(2222, 0b01000000, true);
Serial.println("Mode de réglage de l'alarme sélectionné");
if (digitalRead(BTN_SELECT) == LOW) { delay(200); mode = 3; }
} else if (mode == 3) {
reglerAlarme();
mode = 4;
} else if (mode == 4) {
display.showNumberDecEx(3333, 0b01000000, true); // Affichage du menu 3333
Serial.println("Mode de réglage de l'heure de l'alarme");
// Afficher l'heure actuelle de l'alarme
display.showNumberDecEx(alarm_h * 100 + alarm_m, 0b01000000, true); // Afficher l'heure de l'alarme
Serial.print("Réglage de l'heure de l'alarme : ");
Serial.print(alarm_h);
Serial.print(":");
Serial.println(alarm_m);
// Gestion des boutons Select pour valider
if (digitalRead(BTN_SELECT) == LOW) {
delay(200);
Serial.println("Réglage de l'heure validé.");
break; // Quitter le menu 3333
}
}
}
}
void reglerHeure() {
DateTime now = rtc.now();
int h = now.hour(), m = now.minute();
while (digitalRead(BTN_SELECT) == HIGH) {
if (digitalRead(BTN_PLUS) == LOW) { delay(200); h = (h + 1) % 24; }
if (digitalRead(BTN_MINUS) == LOW) { delay(200); m = (m + 1) % 60; }
display.showNumberDecEx(h * 100 + m, 0b01000000, true); // Affichage de l'heure de l'alarme
delay(200);
}
rtc.adjust(DateTime(now.year(), now.month(), now.day(), h, m, 0)); // Mettre à jour l'heure du RTC
}
void reglerAlarme() {
// Réglage des heures de l'alarme
while (digitalRead(BTN_SELECT) == HIGH) {
if (digitalRead(BTN_PLUS) == LOW) { delay(200); alarm_h = (alarm_h + 1) % 24; }
if (digitalRead(BTN_MINUS) == LOW) { delay(200); alarm_m = (alarm_m + 1) % 60; }
display.showNumberDecEx(alarm_h * 100 + alarm_m, 0b01000000, true); // Affichage de l'heure de l'alarme
delay(200);
}
EEPROM.put(0, alarm_h); // Sauvegarder dans l'EEPROM
EEPROM.put(1, alarm_m); // Sauvegarder dans l'EEPROM
}