Ce module permet de préserver, en temps réel, le passage du temps (année, mois, jour, heure, minute, seconde), grâce à une pile, entre les mises sous tension de l’Arduino.
Même hors tension du Arduino, le module RTC continuera de tenir compte du temps qui passe…
Il est piloté par une puce DS1307 de la compagnie Maxim.
Référence technique de la DS1307.
Référence: Wiki Grove
lib_deps = seeed-studio/Grove - RTC DS1307@^1.0.0
#include <Wire.h> #include "DS1307.h" #include "Streaming.h" DS1307 horloge; // Définir un objet de type DS1307 void setup() { Serial.begin(9600); Serial << "Debut du programme ...\n"; horloge.begin(); // 1 - Renseigner la date et l'heure // Note: À ne faire qu'une seule fois puis, // placer les lignes suivantes en commentaires horloge.fillByYMD(2025,02,26); horloge.fillByHMS(11,54,30); horloge.fillDayOfWeek(TUE); // 2 - Écrire le temps dans la puce RTC horloge.setTime(); // 3 - Lire le temps du RTC horloge.getTime(); // 4 - Afficher l'heure Serial << "Il est " << horloge.hour << ":" << horloge.minute << ":" << horloge.second << endl; } // setup void loop() {} // loop
#include <Wire.h> #include "DS1307.h" #include "Streaming.h" DS1307 clock; // Définir un objet de type DS1307 void setup() { Serial.begin(9600); Serial << "Debut du programme ...\n"; clock.begin(); /* clock.fillByYMD(2021,10,26); clock.fillByHMS(11,54,30); clock.fillDayOfWeek(TUE); clock.setTime(); //Écrire le temps dans la puce RTC */ } // setup void loop() { AfficherLeTemps(); } // loop // ============================================================= // Fonction: Afficher le temps dans la console série - version 1 // ============================================================= void AfficherLeTemps() { clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); Serial.print(clock.minute, DEC); Serial.print(":"); Serial.print(clock.second, DEC); Serial.print(" "); Serial.print(clock.month, DEC); Serial.print("/"); Serial.print(clock.dayOfMonth, DEC); Serial.print("/"); Serial.print(clock.year+2000, DEC); Serial.print(" "); String nomDuJour; switch (clock.dayOfWeek) { case MON: nomDuJour = "Lundi"; break; case TUE: nomDuJour = "Mardi"; break; case WED: nomDuJour = "Mercredi"; break; case THU: nomDuJour = "Jeudi"; break; case FRI: nomDuJour = "Vendredi"; break; case SAT: nomDuJour = "Samedi"; break; case SUN: nomDuJour = "Dimanche"; break; } Serial << nomDuJour << " le " << clock.dayOfMonth << endl; delay(1000); }
#include <Wire.h> #include "DS1307.h" #include "Streaming.h" DS1307 clock; // Définir un objet de type DS1307 // Variable utilisée par sprintf() char chaine[80]; char* NomDesJours[] = {"", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"}; void setup() { Serial.begin(9600); Serial << "Debut du programme ...\n"; clock.begin(); /* clock.fillByYMD(2021,10,26); clock.fillByHMS(11,54,30); clock.fillDayOfWeek(TUE); clock.setTime(); //Écrire le temps dans la puce RTC */ } // setup void loop() { AfficherLeTemps(); } // loop // ============================================================= // Fonction: Afficher le temps dans la console série - version 2 // ============================================================= void AfficherLeTemps() { clock.getTime(); // Remplacer les Serial.print par un sprintf() sprintf(chaine, "%02d:%02d:%02d %02d/%02d/%02d, ", clock.hour, clock.minute, clock.second, clock.month, clock.dayOfMonth, clock.year+2000 ); Serial << chaine; // Remplacer le switch par un tableau de char* Serial << NomDesJours[clock.dayOfWeek] << " le " << clock.dayOfMonth << endl; delay(1000); }
#include <Wire.h> #include "DS1307.h" #include "Streaming.h" DS1307 clock; // Définir un objet de type DS1307 // Variable utilisée par sprintf() char chaine[80]; char* NomDesJours[] = {"", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"}; void setup() { Serial.begin(9600); Serial << "Debut du programme ...\n"; clock.begin(); /* clock.fillByYMD(2021,10,26); clock.fillByHMS(11,54,30); clock.fillDayOfWeek(TUE); clock.setTime(); //Écrire le temps dans la puce RTC */ } // setup void loop() { Serial << AfficherLeTemps() << endl; delay(1000); } // loop // ============================================================= // Fonction: Forme une chaine représentant le temps courant - V3 // Retour: Un pointeur vers une chaine de caractères décrivant // le temps courant. // ============================================================= char* AfficherLeTemps() { clock.getTime(); sprintf(chaine, "%02d:%02d:%02d %02d/%02d/%02d, %s le %02d", clock.hour, clock.minute, clock.second, clock.month, clock.dayOfMonth, clock.year+2000, NomDesJours[clock.dayOfWeek], clock.dayOfMonth ); return chaine; } // AfficherLeTemps
Écrire un programme qui affiche l’heure et la date, à chaque seconde, à la position 0,0 du moniteur, en utilisant le format suivant:
Utiliser des séquences ANSI pour la couleur et le positionnement.
Il faut actualiser l’affichage à chaque seconde.
Idéalement, utiliser une méthode non bloquante pour l’affichage.
Rappel
#include "ANSI.h" ANSI ansi(&Serial); #define ANSI_ROUGE "\033[31m" #define ANSI_BLEU "\033[34m" #define ANSI_BLANC "\033[0m" #define CURSEUR_OFF "\033[?25l"
👉 Il faut renseigner un tableau pour le nom des jours et un pour le nom des mois.
NOTE: En C++, il n’est pas recommandé de définir un tableau de chaines de caractères en objet muable. Il est préférable de le définir ansi:
const char* tableau[] = {...}
À partir:
écrire un programme qui affiche l’heure en temps réel (HH:MM) sur le module 4-Digit.
Le symbole « : » du 4-Digit doit clignoter avec les secondes qui passent.
Idéalement, utiliser une méthode non bloquante pour le clignotement.
Astuces:
float heureDecimale = horloge.hour + float(horloge.minute) / 100 ; // Convertir les minutes en décimales et + heures. int heureInt = horloge.hour * 100 + horloge.minute; // Former un grand int avec les hr+min À chaque 500 ms, permuter l'affichage entre heureDecimale et heureInt: displayNum(heureDecimale,2); displayNum(heureInt); Gérer la permutation avec une variable de type boolean. Permuter la valeur de la variable boolean de cette façon: tick ^= true;
Autres astuces fonctionnelles avec Wokwi:
Utilisation des méthodes display() et point() de la classe TM1637
// Cette technique fonctionnera sur Wokwi ainsi qu'avec la librairie standard de la TM1637 affichage.point(true); // Allumer le : du 4 digit, au prochain affichage affichage.display(0, horloge.hour / 10); // Afficher sur le nombre de gauche, la dizaine de l'heure affichage.display(1, horloge.hour % 10); // Afficher sur le nombre de gauche+1, l'unité de l'heure affichage.point(false); // Éteindre le : du 4 digit, au prochain affichage
NOTE: Pour la session H25 – Ce labo permet d’ajouter deux (2) points bonis à la grille d’évaluation du cours.
Combiner les laboratoires 5 et 5.1 en un seul programme, avec affichages non bloquants, et y ajouter la fonctionnalité suivante:
Faire défiler le message;
sur l’écran LCD.
NOTE: La librairie propose une méthode pour faire défiler du texte à l’écran. Faites vos recherches.
NOTE IMPORTANTE: Les affichages, moniteur, LCD et 4Digit ne doivent pas bloquer le programme principal. La LED doit répondre instantanément au bouton.