/*** Real Time Clock / horloge en temps réel ***/
#include<RTClib.h>
RTC_DS1307 rtc;
// variables d'horloge
char Jour[7][10] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"}; // Les jours de la semaine.
char Mois[13][10] = {"", "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin",
"Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"
};
char Horloge[9], LaDate[20], ALARM[9];
DateTime now; // Variable de type DateTime nommée "now"
//DateTime, ajoute la capacité de chronométrage et donne accès aux heures, minutes, secondes, jours, mois et années.
int year = 0; int month = 0; int day = 0;
int hour = 0; int minute = 0; int second = 0;
int alarm_hours = 0; int alarm_minutes = 0;
/*** Afficheur lcd 2004 ***/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
/*** Bibliothèque ezButton pour Arduino ***/
#include<ezButton.h>
/*** Brochage piezo***/
byte buzzer_pin = 5;
/*** Brochage encodeur rotatif ***/
byte clk = 2; // clock
byte dt = 3; // Data
byte sw = 4; // Bouton poussoir
// déclare la variable de la classe ezButton "boutonPoussoir"
ezButton boutonPoussoir(sw);
// Variables encodeur rotatif
int Compteur = 0; // valeur par défaut de Compteur
int prev_Compteur = -1; // valeur précédante par défaut de Compteur
int flag = 1; // drapeau
// variable de type String Date Heure
String rtc_date = "";
String rtc_time = "";
char* menu[] = {"Date and Time",
"Set Alarm",
"Stopwatch",
"Countdown Timer"
};
void setup() {
rtc.begin();
lcd.init(); lcd.backlight();
lcdPrintCenter("Cipad 71e",1);
lcdPrintCenter("Edition",2);
delay(2000);
attachInterrupt(digitalPinToInterrupt(clk), encoder, FALLING);
boutonPoussoir.setDebounceTime(25); // anti-rebonds
}
void encoder() {
prev_Compteur = Compteur;
if (digitalRead(dt) == HIGH)Compteur++;
else Compteur--;
flag = 1;
}
void mode_selecteur() {
// Limite la valeur de Compteur à une plage donnée. constrain() = contraindre()
// Syntaxe: constrain(variable, limite inférieure, limite supérieure)
Compteur = constrain(Compteur, 0, 3);
if (prev_Compteur != Compteur && flag == 1) {
switch (Compteur) {
case 0: lcd.clear();
lcdPrintCenter(menu[Compteur], 0);
break;
case 1: lcd.clear();
lcdPrintCenter(menu[Compteur], 0);
break;
case 2: lcd.clear();
lcdPrintCenter(menu[Compteur], 0);
break;
case 3: lcd.clear();
lcdPrintCenter(menu[Compteur], 0);
break;
}
flag = 0;
}
}
void info() {
lcd.setCursor(0, 3);
lcd.print("Flag "); lcd.print(flag);
lcd.print(" Compteur "); lcd.print(Compteur);
}
void loop() {
// DateTime now = rtc.now();
//info();
boutonPoussoir.loop();
if (boutonPoussoir.isPressed())select_mode();
mode_selecteur();
current_time();
if (alarm_minutes == minute && alarm_hours == hour) {
play_buzzer(1000, 5000);
alarm_hours = 0;
alarm_minutes = 0;
}
delay(10);
}
void select_mode() {
if (Compteur == 0)get_time();
else if (Compteur == 1)set_alarm();
else if (Compteur == 2)stopwatch();
else countdown();
}
void get_time() {
while (true) {
// looping button
boutonPoussoir.loop();
if (boutonPoussoir.isPressed()) {
lcd.clear();
prev_Compteur = -1;
flag = 1;
break;
}
current_time();
String current_date = "Date : " + String(day) + "/" + String(month) +
"/" + String(year);
String current_time = "Time : " + String(hour) + ":" + String(minute) +
":" + String(second);
lcd_print(0, 0, "Date and Time");
lcd_print(0, 1, current_date);
lcd_print(0, 2, current_time);
}
}
void set_alarm() {
lcd_print(0, 0, "Enter hours: ");
alarm_hours = set_value(0, 23);
lcd_print(0, 0, "Enter minutes: ");
alarm_minutes = set_value(0, 59);
lcd.clear();
lcd_print(0, 0, "Alarm is set for ");
lcd_print(0, 1, String(alarm_hours));
lcd_print(3, 1, "hours and ");
lcd_print(0, 2, String(alarm_minutes));
lcd_print(3, 2, "minutes ");
delay(5000);
}
void stopwatch() {
int stopwatch_hour, stopwatch_minute, stopwatch_second = 0;
int last_second = 0;
while (true) {
boutonPoussoir.loop();
if (boutonPoussoir.isPressed()) {
prev_Compteur = -1;
flag = 1;
delay(5000);
lcd.clear();
break;
}
if (abs(second - last_second) >= 1) {
last_second = second;
String stopwatch_time = String(stopwatch_hour) +
" : " + String(stopwatch_minute) +
" : " + String(stopwatch_second);
lcd.clear();
lcd_print(0, 0, "Stopwatch");
lcd_print(0, 1, String(stopwatch_time));
stopwatch_second++;
}
if (stopwatch_second > 59) {
stopwatch_second = 0;
stopwatch_minute++;
}
else if (stopwatch_minute > 59) {
stopwatch_minute = 0;
stopwatch_hour++;
}
else if (stopwatch_hour > 24) {
stopwatch_second, stopwatch_minute, stopwatch_hour = 0;
}
}
}
void countdown() {
int countdown_minutes = 0;
int countdown_seconds = 0;
lcd_print(0, 0, "Enter Minutes : ");
countdown_minutes = set_value(0, 59);
// setting seconds
lcd_print(0, 0, "Enter Seconds : ");
countdown_seconds = set_value(0, 59);
// start the stopwatch
while (countdown_minutes != 0 || countdown_seconds != 0) {
String t = String(countdown_minutes) + ":" + String(countdown_seconds);
lcd.clear();
lcd_print(0, 0, "Countdown Timer");
lcd_print(0, 1, t);
if (countdown_seconds == 0) {
if (countdown_minutes != 0) {
countdown_seconds = 59;
countdown_minutes--;
}
}
countdown_seconds--;
delay(1000);
}
lcd.clear();
lcd_print(0, 0, "Countdown over");
play_buzzer(200, 3000);
}
void lcd_print(int x, int y, String message) {
lcd.setCursor(x, y);
lcd.print(message);
}
void current_time() {
// toje data time
DateTime current = rtc.now();
year = current.year();
month = current.month();
day = current.day();
hour = current.hour();
minute = current.minute();
second = current.second();
}
int set_value(int min_val, int max_val) {
int value = 0;
int last_Compteur = -1;
Compteur = 0;
while (true) {
boutonPoussoir.loop();
if (boutonPoussoir.isPressed())
break;
Compteur = constrain(Compteur, min_val, max_val);
if (last_Compteur != Compteur) {
lcd_print(0, 1, " ");
lcd_print(0, 1, String(Compteur));
last_Compteur = Compteur;
}
}
value = Compteur;
Compteur = 0;
last_Compteur = -1;
return value;
}
void play_buzzer(int frequency, int duration) {
tone(buzzer_pin, frequency);
delay(duration);
noTone(buzzer_pin);
}
// fonction pour centrer le texte à afficher sur lcd.============
void lcdPrintCenter(String text, int ligne) {
int len = text.length();// longeur de la variable text
// positionne le curseur au centre de la ligne choisie et
// soustrait la longeur du text à afficher
lcd.setCursor((20 - len) / 2, ligne);
lcd.print(text); // affiche le text centré
}
void displayMainMenu(DateTime now) {
// Imprimer la date sur l'écran LCD
sprintf(LaDate,
"%8s %02d:%02d:%4d", // Formatage
Jour[now.dayOfTheWeek()], // Jour de la semaine
now.day(), // le jour
now.month(), // le mois
now.year()); // l'année
lcd.setCursor(0, 1); lcd.print(LaDate); // affiche la date
// Imprimer l'heure sur l'écran LCD
sprintf(Horloge,
"%02d:%02d:%02d / %02d:%02d", // formattage
now.hour(), // heures
now.minute(), // minutes
now.second()); // secondes
// AlarmHeure, // alarme heure
// alarmMinute); // alarme minute
lcd.setCursor(0, 0); lcd.print(Horloge); // affiche l'heure
/*
dtostrf(Cel, 5, 2, tC); // Converti float"Cel" en Chaine de caractères.
// pour afficher la température en degré Celcius
lcd.setCursor(0, 2); lcd.print("Temp: ");
lcd.print(String(tC) + (char)223 + "C ");
// pour afficher l'humidité
dtostrf(Hum, 5, 1, H); // Converti float"Far" en Chaine de caractères.
lcd.setCursor(0, 3); lcd.print("Humidity:" + String(H) + "% ");
// Afficher l'état de l'alarme
if (AlarmOn) {
lcd.setCursor(19, 0);
lcd.write(byte(0)); // Alarme icône activée (cloche)
} else {
lcd.setCursor(19, 0);
lcd.print(" "); // Alarme icône désactivé (cloche)
}
*/
}