// Description :// Displaying the current time, date and temperature on the 16×4 LCD screen and data logging to a microsd card
// Affichage de l’heure et la date actuelle ansi que la température sur l’écran LCD 16×4 et l’enregistrement des données sur une carte microSD.
// Inspired from this code : File => Examples => RTClib => ds3231 / inspiré de ce code : Fichier => Exemples => RTClib => ds3231
#include <Wire.h> // Include the Wire library for I2C communication // Inclure la bibliothèque Wire pour la communication I2C
#include <RTClib.h> // Include the RTClib library for the DS3231 module // Inclure la bibliothèque RTClib pour le module DS3231
#include <LiquidCrystal_I2C.h> // Include the LiquidCrystal_I2C library for the LCD screen // Inclure la bibliothèque LiquidCrystal_I2C pour l’écran LCD
#include <SD.h> // Include the SD library for the microSD card // Inclure la bibliothèque SD pour la carte microSD
File dataFile;
RTC_DS3231 rtc; // Initialize the rtc object for the DS3231 module // Initialiser l’objet rtc pour le module DS3231
LiquidCrystal_I2C lcd(0X27, 16, 4); // Initialize the lcd object for the LCD screen // Initialiser l’objet lcd pour l’écran LCD
const int chipSelect = 10; // Define the chip select pin for the microSD card // Définir le pin de sélection de la carte microSD
char daysOfTheWeek[7][12] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”};
byte char_temp[8]={B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110}; // for thermometer icon / pour l’icône du thermomètre
void setup() {
rtc.begin();
lcd.init(); // Initialize the LCD screen // Initialiser l’écran LCD
lcd.backlight(); // Activate the LCD screen backlight // Activer le rétroéclairage de l’écran LCD
lcd.createChar(0,char_temp);
if (! rtc.begin()) { // Check if the DS3231 module is connected and functional // Vérifier si le module DS3231 est connecté et fonctionnel
lcd.setCursor(0,1);
lcd.print(“DS3231 Error!”);
while (1);
}
if (!SD.begin(chipSelect)) { // Check if the microSD card is connected and functional // Vérifier si la carte microSD est connectée et fonctionnelle
lcd.setCursor(0,1);
lcd.print(“SD card error!”);
while (1);
}
if (rtc.lostPower()) { // Check if the main power supply of the DS3231 is removed // Vérifier si l’alimentation principale du DS3231 est coupée
lcd.setCursor(0,1);
lcd.print(“RTC has lost power!”);
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
if (SD.exists(“data.txt”)) // Check if the “data.txt” file exists // Vérifier si le fichier “data.txt” existe
{
SD.remove(“data.txt”); // If the file exists, remove it // Supprimer le fichier “data.txt” s’il existe
}
lcd.setCursor(0,1); // Move the LCD screen cursor to position 0,0 // Déplacer le curseur de l’écran LCD en position 0,0
lcd.print(” Welcome…”);
delay(3000);
lcd.clear();
}
void loop() {
DateTime now = rtc.now(); // Read current date and time from DS3231 module // Lire la date et l’heure actuelles depuis le module DS3231
float tempC = rtc.getTemperature(); // Read temperature from DS3231 module // Lire la température depuis le module DS3231
//——————————Date display – Affichage de la date—————————–//
lcd.setCursor(6,0);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.setCursor(0,1);
lcd.print(“Date:”);
lcd.setCursor(6,1);
if (now.day() <=9 )
{
lcd.print(“0”);
lcd.setCursor(7,1);
lcd.print(now.day(),DEC);
}
else {lcd.print(now.day(),DEC);}
lcd.setCursor(8,1);
lcd.print(“:”);
lcd.setCursor(9,1);
if (now.month() <=9 )
{
lcd.print(“0”);
lcd.setCursor(10,1);
lcd.print(now.month(),DEC);
}
else {lcd.print(now.month(),DEC);}
lcd.setCursor(11,1);
lcd.print(“:”);
lcd.setCursor(12,1);
lcd.print(now.year(),DEC);
//——————————Time dsiplay – Affichage du temps—————————–//
lcd.setCursor(0, 2);
lcd.print(“Time:”);
lcd.setCursor(6,2);
if (now.hour() <=9 )
{
lcd.print(“0”);
lcd.setCursor(7,2);
lcd.print(now.hour(),DEC);
}
else {lcd.print(now.hour(),DEC);}
lcd.setCursor(8,2);
lcd.print(“:”);
lcd.setCursor(9,2);
if (now.minute() <=9 )
{
lcd.print(“0”);
lcd.setCursor(10,2);
lcd.print(now.minute(),DEC);
}
else {lcd.print(now.minute(),DEC);}
lcd.setCursor(11,2);
lcd.print(“:”);
lcd.setCursor(12,2);
if (now.second() <=9 )
{
lcd.print(“0”);
lcd.setCursor(13,2);
lcd.print(now.second(),DEC);
}
else {lcd.print(now.second(),DEC);}
//—————————-Temperature display – Affichage de la température—————————//
lcd.setCursor(0,3);
lcd.print(“Temp:”);
lcd.setCursor(6,3);
lcd.print(rtc.getTemperature());
lcd.setCursor(11,3);
lcd.write((char)223);
lcd.setCursor(12,3);
lcd.print(“C”);
lcd.setCursor(15,3);
lcd.print(char(0));
// Open the file for saving data. // ouverture du fichier pour enregistrer les données
dataFile = SD.open(“data.txt”, FILE_WRITE);
// if the file is open, we save the data // si le fichier est ouvert, on enregistre les données
if (dataFile) {
dataFile.print(now.year(), DEC);
dataFile.print(‘/’);
dataFile.print(now.month(), DEC);
dataFile.print(‘/’);
dataFile.print(now.day(), DEC);
dataFile.print(‘,’);
dataFile.print(now.hour(), DEC);
dataFile.print(‘:’);
dataFile.print(now.minute(), DEC);
dataFile.print(‘:’);
dataFile.print(now.second(), DEC);
dataFile.print(‘,’);
dataFile.println(tempC);
dataFile.close();
} else {
lcd.setCursor(0,2);
lcd.print(“Recording error!”);
}
delay(1000);
}