#include <Wire.h>
#include <TimeLib.h>
#include <LiquidCrystal_I2C.h> // Inclure la bibliothèque pour l'écran LCD I2C
#include <EasyButton.h>
// Définir variables globale
// Écran principale
LiquidCrystal_I2C lcd(0x27, 20, 4); // Initialiser l'écran LCD 20 colonnes par 4 lignes avec l'adresse I2C
//Boutons
#define PIN_BUTTON_RESET 3
#define PIN_BUTTON_PLAY 4
#define PIN_BUTTON_MOINS 5
#define PIN_BUTTON_PLUS 6
#define PIN_BUTTON_AFFICHAGE 7
EasyButton button_affichage(PIN_BUTTON_AFFICHAGE);
EasyButton button_plus(PIN_BUTTON_PLUS);
EasyButton button_moins(PIN_BUTTON_MOINS);
EasyButton button_play(PIN_BUTTON_PLAY);
EasyButton button_reset(PIN_BUTTON_RESET);
// Date
int startSecond = 0; // Seconde de départ
const char* mois[] = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"};
const char* jours[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
unsigned long msPrecedent = 0;
const long intervalle = 60000;
//Définir les variables
int affichage = 0; // Affichage courant
//Définir les fonctions
void Rafraichir_Affichage(); // Affichage courant
void AffichageDate(); // Afficher la date et l'heure
void AffichageMinuterie(); // Afficher Minuterie
void AffichageChrono(); // Afficher Chrono
void AffichageAlarme(); // Afficher Alarme
void OnAffichagePressed(); // button_affichage pressed
void OnPlusPressed(); // button_plus pressed
void OnMoinsPressed(); // button_moins pressed
void OnPlayPressed(); // button_play pressed
void OnResetPressed(); // button_reset pressed
//Variables de temps
unsigned long previousMillis = 0;
int secondes = 0;
int minutes = 0;
int heures = 0;
unsigned long currentMillis = millis(); // Temps écoulé depuis le démarrage du programme
unsigned long seconds = currentMillis / 1000; // Convertir le temps en secondes
const long interval = 1000; // Intervalle de rafraîchissement en millisecondes (1 seconde)
//Variable Minuteur
bool minuterie_en_cours = false;
// Variable Chronomètre
bool chrono_en_cours = false;
//Fonctions génériques
void setup() {
Serial.begin(115200);
lcd.init(); // Initialiser l'écran LCD
lcd.backlight(); // Activer le rétroéclairage de l'écran LCD
// Initialisation de l'heure de départ
// Initialisation des contrôles
button_affichage.begin();
button_plus.begin();
button_moins.begin();
button_play.begin();
button_reset.begin();
// Création des triggers
button_affichage.onPressed(OnAffichagePressed);
button_plus.onPressed(OnPlusPressed);
button_moins.onPressed(OnMoinsPressed);
button_play.onPressed(OnPlayPressed);
button_reset.onPressed(OnResetPressed);
Rafraichir_Affichage();
// Attach callback.
//button.onPressedFor(duration, onPressedForDuration);
}
void loop() {
// Continuously update the button state.
button_affichage.read();
button_plus.read();
button_moins.read();
button_play.read();
button_reset.read();
}
// Lancée quand le Bouton principal est enfoncé
void Changer_Affichage(){
int _affichage = affichage;
switch (_affichage) {
case 0: affichage++; break; // Date et Heure
case 1: affichage++; break; // Minuteur
case 2: affichage++; break; // Chronometre
case 3: affichage=0; break; // Alarme
}
Rafraichir_Affichage();
}
//_______________________
// Fonctions Affichage
//_______________________
void Rafraichir_Affichage(){
int _affichage = affichage;
switch (_affichage) {
case 0: AffichageDate(); break; // Date et Heure
case 1: AffichageMinuterie(); break; // Minuterie
case 2: AffichageChrono(); break; // Chronometre
case 3: AffichageAlarme(); break; // Alarme
}
}
// Afficher la date et l'heure
void AffichageDate(){
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.setCursor(0,1);
lcd.print("Date: ");
}
// Afficher Minuterie
void AffichageMinuterie(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Minuterie");
}
// Afficher Chrono
void AffichageChrono(){
lcd.clear();
lcd.setCursor(0,0);
lcd.setCursor(4,1);
lcd.print("Chronometre");
lcd.setCursor(6,2);
lcd.print(heures/10);
lcd.print(heures%10);
lcd.print(":");
lcd.print(minutes/10);
lcd.print(minutes%10);
lcd.print(":");
lcd.print(secondes/10);
lcd.print(secondes%10);
}
// Afficher Alarme
void AffichageAlarme(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alarme");
}
//_______________________
//Fonctions d'évènements
//_______________________
// button_affichage pressed
void OnAffichagePressed(){
Changer_Affichage();
}
// button_plus pressed
void OnPlusPressed(){
int _affichage = affichage;
switch (_affichage){
case 0: OnPlusDatePressed(); break;
case 1: OnPlusMinuteriePressed(); break;
case 2: OnPlusChronoPressed(); break;
case 3: OnPlusAlarmePressed(); break;
}
}
void OnPlusDatePressed(){}
void OnPlusMinuteriePressed(){
}
void OnPlusChronoPressed(){}
void OnPlusAlarmePressed(){
}
// button_moins pressed
void OnMoinsPressed(){
int _affichage = affichage;
switch (_affichage){
case 0: OnMoinsDatePressed(); break;
case 1: OnMoinsMinuteriePressed(); break;
case 2: OnMoinsChronoPressed(); break;
case 3: OnMoinsAlarmePressed(); break;
}
}
void OnMoinsDatePressed(){}
void OnMoinsMinuteriePressed(){
}
void OnMoinsChronoPressed(){}
void OnMoinsAlarmePressed(){
}
// button_play pressed
void OnPlayPressed(){
int _affichage = affichage;
switch (_affichage){
case 0: OnPlayDatePressed(); break;
case 1: OnPlayMinuteriePressed(); break;
case 2: OnPlayChronoPressed(); break;
case 3: OnPlayAlarmePressed(); break;
}
}
void OnPlayDatePressed(){}
void OnPlayMinuteriePressed(){
if (minuterie_en_cours){
StopMinuterie();
}
else{
StartMinuterie();
}
}
void StartMinuterie(){
}
void StopMinuterie(){
}
void OnPlayChronoPressed(){
if (chrono_en_cours){
StopChrono();
}
else{
StartChrono();
}
}
void StartChrono(){
const long interval = 1000; // Intervalle de rafraîchissement en millisecondes (1 seconde)
unsigned long currentMillis = millis(); // Temps écoulé depuis le démarrage du programme
unsigned long seconds = currentMillis / 1000; // Convertir le temps en secondes
if (currentMillis - previousMillis >= interval) {
// Mettre à jour le chrono
previousMillis = currentMillis;
// Incrémenter les secondes et ajuster les minutes si nécessaire
secondes++;
}
if (secondes >= 60){
secondes = 0;
minutes ++;
}
if (minutes >= 60){
minutes = 0;
heures ++;
}
lcd.clear();
lcd.setCursor(0,0);
lcd.setCursor(4,1);
lcd.print("Chronometre");
lcd.setCursor(6,2);
lcd.print(heures/10);
lcd.print(heures%10);
lcd.print(":");
lcd.print(minutes/10);
lcd.print(minutes%10);
lcd.print(":");
lcd.print(secondes/10);
lcd.print(secondes%10);
}
void StopChrono(){
}
void OnPlayAlarmePressed(){}
// button_reset pressed
void OnResetPressed(){
int _affichage = affichage;
switch (_affichage){
case 0: OnResetDatePressed(); break;
case 1: OnResetMinuteriePressed(); break;
case 2: OnResetChronoPressed(); break;
case 3: OnResetAlarmePressed(); break;
}
}
void OnResetDatePressed(){}
void OnResetMinuteriePressed(){
}
void OnResetChronoPressed(){
}
void OnResetAlarmePressed(){}
/*
const long LONG_PRESS = 1000;
void printDigits(int);
// Variable globales
int affichage_en_cours = 0; // 0 = Accueil; 1 = Minuteur; 2 = Chronomètre; 3 = Alarme
int etat = 0;
unsigned long startTime;
unsigned long endTime;
unsigned long duration;
byte timerRunning;
//Définir variables affichage 0 / Accueil
int startDay = 17; // Jour de départ
int startMonth = 4; // Mois de départ
int startYear = 2024; // Année de départ
int startHour = 21; // Heure de départ (24h format)
int startMinute = 30; // Minute de départ
int startSecond = 0; // Seconde de départ
// Tableau des noms des mois
const char* months[] = {
"Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"
};
// Tableau des jours dans chaque mois (pour une année non bissextile)
const int daysInMonth[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
// Définir variables affichage 1 / Minuteur
// Définir variables affichage 2 / Chronomètre
// Variables pour le comptage des minutes et des secondes
int secondes = 0;
int minutes = 0;
int heures = 0;
unsigned long previousMillis = 0;
const long interval = 1000; // Intervalle de rafraîchissement en millisecondes (1 seconde)
// Définir variables affichage 3 / Alarme
void setup() {
lcd.init(); // Initialiser l'écran LCD
lcd.backlight(); // Activer le rétroéclairage de l'écran LCD
// Initialisation de l'heure de départ
setTime(startHour, startMinute, startSecond, startDay, startMonth, startYear);
pinMode(BUTTON_MAIN,INPUT);
}
void loop() {
etat = digitalRead(BUTTON_MAIN);
if (timerRunning == 0 && etat == LOW){ // button pressed & timer not running already
startTime = millis();
timerRunning = 1;
}
if (timerRunning == 1 && etat == HIGH){ // timer running, button released
endTime = millis();
timerRunning = 0;
duration = endTime - startTime;
bool rapide = true; /// Valider si c'est rapide ou long click;
if (duration >= LONG_PRESS) rapide = false;
int affichage = affichage_en_cours;
if (rapide)
{
switch (affichage) {
case 0: affichage_en_cours++; break; // Date et Heure
case 1: affichage_en_cours++; break; // Minuteur
case 2: affichage_en_cours++; break; // Chronometre
case 3: affichage_en_cours=0; break; // Alarme
}
}
else // Appuyer longtemps
{
switch (affichage) {
case 0: affichage_en_cours++; break; // Date et Heure
case 1: affichage_en_cours++; break; // Minuteur
case 2: affichage_en_cours++; break; // Chronometre
case 3: affichage_en_cours=0; break; // Alarme
}
}
// Effacer affichage
lcd.clear();
// Delay a little bit to avoid bouncing
}
unsigned long currentMillis = millis(); // Temps écoulé depuis le démarrage du programme
unsigned long seconds = currentMillis / 1000; // Convertir le temps en secondes
int currentHour = hour();
int currentMinute = minute();
int currentSecond = second();
int currentDay = day();
int currentMonth = month();
int currentYear = year();
// Nouvel affichage selon l'écran actif
switch (affichage_en_cours) {
case 0: //Date et heure
//Récupérer l'heure, les minutes, les secondes, la date, le mois et l'année actuels
// Afficher la date et l'heure sur l'écran LCD
lcd.setCursor(3, 1); // Positionner le curseur pour afficher la date
lcd.print(currentDay); // Afficher le jour
lcd.print(" ");
lcd.print(months[currentMonth - 1]); // Afficher le nom du mois (-1 car les index commencent à 0)
lcd.print(" ");
lcd.print(currentYear); // Afficher l'année
lcd.setCursor(7, 2); // Positionner le curseur pour afficher l'heure
printDigits(currentHour); // Afficher l'heure
lcd.print(":");
printDigits(currentMinute); // Afficher les minutes
break;
case 1: // Minuterie
lcd.setCursor(0,0);
lcd.print("Minuterie");
lcd.setCursor(7,2);
lcd.print(duration);
break;
case 2: // Chrono
lcd.setCursor(0,0);
// Vérifier si l'intervalle de rafraîchissement est écoulé
if (currentMillis - previousMillis >= interval) {
// Mettre à jour le timer
previousMillis = currentMillis;
// Incrémenter les secondes et ajuster les minutes si nécessaire
secondes++;
if (secondes >= 60) {
secondes = 0;
minutes++;
if (minutes >= 60) {
minutes = 0;
heures++;
}
}
}
// Effacer et réafficher le temps sur l'écran LCD
lcd.setCursor(4, 1);
lcd.print("Chronometre");
lcd.setCursor(6, 2); // Positionner le curseur à la colonne 7, ligne 3 (0-based)
lcd.print(heures/10);
lcd.print(heures%10);
lcd.print(":");
lcd.print(minutes / 10); // Afficher le premier chiffre des minutes (dizaine)
lcd.print(minutes % 10); // Afficher le deuxième chiffre des minutes (unité)
lcd.print(":");
lcd.print(secondes / 10); // Afficher le premier chiffre des secondes (dizaine)
lcd.print(secondes % 10); // Afficher le deuxième chiffre des secondes (unité)
break;
case 3: // Alarme
lcd.setCursor(0,0);
lcd.print("Alarme");
lcd.setCursor(7,2);
lcd.print(duration);
break;
}
}
//if(currentHour==alarmeHour && currentMinute==alarmeMinute){
//for(buzzerPin=0;buzzerPin<5;buzzerPin++);
//digitalWrite(buzzerPin,HIGH);
//delay(100);
//digitalWrite(buzzerPin,LOW);
//delay(1000);
void printDigits(int digits) {
// Afficher les chiffres avec un zéro initial si nécessaire
if (digits < 10) {
lcd.print("0");
}
lcd.print(digits);
}
*/