#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C de l'afficheur, 16 colonnes et 2 lignes
// Tableau de chaînes de caractères pour mapper les jours de la semaine
const char* joursSemaine[] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
void setup() {
lcd.init(); // Initialise l'afficheur
lcd.backlight(); // Allume le rétroéclairage
lcd.setCursor(0, 0);
//rtc.writeSqwPinMode(DS1307_OFF); // Désactive la sortie de la broche SQW pour économiser de l'énergie
if (!rtc.begin()) {
lcd.print("RTC introuvable !");
while (1);
}
// Si l'horloge RTC DS1307 a été réinitialisée, ajuste l'heure à la date/heure de compilation
if (rtc.now().year() < 2000) {
lcd.print("RTC a perdu l'heure !");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Désactive la sortie de la broche SQW pour économiser de l'énergie
Wire.beginTransmission(0x68); // Adresse I2C de la RTC DS1307
Wire.write(0x07); // Adresse du registre de contrôle
Wire.write(0x00); // Écriture de 0 pour désactiver la sortie de la broche SQW
Wire.endTransmission();
}
void loop() {
DateTime now = rtc.now();
// Affiche la date au format "jour de la semaine, jour mois année"
lcd.setCursor(0, 0);
lcd.print(joursSemaine[now.dayOfTheWeek()]);
lcd.print(", ");
// Formate le jour avec deux chiffres
char jour[3];
sprintf(jour, "%02d", now.day());
lcd.print(jour);
lcd.print('/');
// Formate le mois avec deux chiffres
char mois[3];
sprintf(mois, "%02d", now.month());
lcd.print(mois);
lcd.print('/');
lcd.print(now.year(), DEC);
// Affiche l'heure
lcd.setCursor(0, 1);
lcd.print(" ");
if (now.hour() < 10) lcd.print('0');
lcd.print(now.hour(), DEC);
lcd.print(':');
if (now.minute() < 10) lcd.print('0');
lcd.print(now.minute(), DEC);
lcd.print(':');
if (now.second() < 10) lcd.print('0');
lcd.print(now.second(), DEC);
//delay(1000); // Attends une seconde avant de mettre à jour l'affichage
}