Il est parfois utile que votre Arduino connaisse la date et l'heure. Par exemple, l'Arduino pourrait être à la base d'un système de mesures automatisé ("datalogging") qui consignera la date et l'heure de chaque mesure, ou encore d'une tâche devant être accomplie tous les jours à la même heure (sauf la fin de semaine), etc.
Comme son nom l'indique, une horloge temps réel ("Real Time Clock" ou RTC) est un circuit intégré dont la principale fonction consiste à mesurer le temps. Par exemple, il existe sur eBay des modules ("breakout") basés sur le circuit intégré DS1307 de Dallas/Maxim qui peuvent facilement être branchés à un Arduino (protocole i2c): chaque fois que l'Arduino a besoin de connaître la date ou l'heure, il n'a qu'à interroger le module RTC.
Mais pourquoi, dites-vous, ne pas simplement utiliser les fonctions de mesure de temps déjà incluses dans l'Arduino? Une instruction comme millis() retourne le temps écoulé depuis le dernier démarrage de l'Arduino, mais sera réinitialisée dès le prochain démarrage. De plus, millis() atteint sa limite maximale (et retourne à zéro) au bout d'une cinquantaine de jours.
Un module RTC est muni d'une petite pile qui peut durer plusieurs années (sauf le modèle que j'ai reçu, qui était muni d'une pile rechargeable LIR2032 à la place d'une CR2032: ces piles perdent leur charge en 1 mois environ...). Et leur utilisation est d'une incroyable simplicité.
4 fils suffisent pour brancher le module RTC à l'Arduino:
"Sda" : Arduino A4 (analog in)
"Scl": Arduino A5 (analog in)
"Gnd": Arduino GND
"Vcc": Arduino 5V ou 3V3
La librairie RTClib simplifie énormément la conception des sketches. La version la plus récente sur trouve ici (utilisez le bouton "ZIP" pour télécharger la totalité du dossier, que vous installez ensuite dans le répertoire "Librairies" de l'IDE Arduino).
Une fois la librairie installée, ouvrez simplement l'exemple "ds1307" (menu Fichier/Exemples/rtclib/ds1307) et installez-le dans l'Arduino; ouvrez le moniteur série et réglez sa fréquence à 57600 bauds: vous verrez alors défiler la date et l'heure (suivies de quelques informations moins utiles). Un coup d'oeil sur le sketch vous indiquera comment récupérer les informations voulues (jour, mois, année, etc.).
Si vous constatez que la date et l'heure retournées par votre module RTC sont incorrecte, exécutez à nouveau l'exemple "ds1307" après avoir "décommenté" la ligne "RTC.adjust(DateTime(__DATE__, __TIME__));": le ds1307 se réinitialisera en utilisant l'heure de votre ordinateur.
Voici finalement un sketch permettant de construire une horloge avec un Arduino, un module RTC et un afficheur LCD. Pour la façon de brancher l'afficheur LCD à l'Arduino, je vous réfère à cette précédente rubrique.
À lire également: une autre horloge à base d'Arduino, sauf que celle-ci affiche l'heure au moyen de deux galvanomètre à cadre mobile. Il existe aussi un billet concernant le modèle DS3231.
Yves Pelletier (Twitter: @ElectroAmateur)
Merci votre programme nous a permis d'avancer dans notre projet.
RépondreSupprimerThanks for this, just used this with a Nano. Works like a charm.
RépondreSupprimermerci pour le code bien jouer !!!!
RépondreSupprimerparfait, je l'ai adapté au lcd I2C, en revanche pour delay 100 plutôt que 1000, et suppression du lcd.clear, cela me semble plus doux
RépondreSupprimerbravo pour ce code
je suis un fervent de l'I2C
cordialement
eu j'ai un petit probleme lors de la compilation du programme, sa me met
RépondreSupprimercompilation terminated.
exit status 1
Erreur lors de la compilation.
Il faut valider le port com en USB si tu utilise l'usb et installer les drivers si ce n'est
Supprimerpas fait.
Le programme ne fonctionne pas, l'heure reste figée.
RépondreSupprimerLes secondes ne défilent pas.La date est bien affichée
Enlever la pile n'y change rien et le reset de la carte UNO ne fait rien également.
En ce qui concerne "ds1307" après avoir "décommenté" la ligne "RTC.adjust(DateTime(__DATE__, __TIME__));
Windows interdit de modifier le fichier, GNU linux également.
La procédure dest attibuts de fichiers dans la base de registes est complexe et incompréhensible.
Arduino uno LCD 20x4 relié en 4 bit via afficheur et I2C via le DS1307
Remettre la ligne RTC.adjust(DateTime(__DATE__, __TIME__)); dans le programme principal met effectivement a l'heure mais elle reste figée, et affiche dans la console la même chose dans la console "heure" et "date" en boucle.
Windows et Linux vous interdit de modifier le fichier d'un sketch Arduino?
SupprimerHa, je comprend: vous avez essayé de modifier directement le fichier d'exemple plutôt qu'en modifier une copie.
SupprimerRebonjour!
SupprimerOui, modifier directement le fichier est plus simple, et donc impossible, créer une copie pose des problèmes quand on appelle des bibliothèques du style : " #include " car il le logiciel ne retrouve pas les "librairies" quand elle sont crées et il y a une procédure qui n'est pas claire ou pas bien expliquée et en plus en anglais avec le point h et le .ino.
On devrait pouvoir modifier les programmes ou les librairies de manière simple et rapide.
Windows me dit: vous le pouvez pas modifier le fichier DS1307, il demande de faire une copie dans un autre emplacement, et quand on copie dans un autre emplacement, le programme principal ne fonctionne plus.
SupprimerLe clic droit avec la souris option propriétés sur le dossier ou le raccourci Arduino, ne résoud pas le problème des fichiers en lecture seule, le dossier se remet en lecture seule, quoi q'il arrive de manière automatique, donc l'utilisation des librairies est difficile, puisque l'on ne peut pas facilement en modifier le contenu directement sans trop réfléchir avec des grosses notions d'informatique pour la bidouille des fichiers.
À moins que l'IDE (ou la bibliothèque) ait été mal installé, il n'y a aucune raison que la bibliothèque ne soit pas trouvée suite à la copie d'un fichier d'exemple.
SupprimerJ'ai pu constater plusieurs fois des problemes de ce genre. Il ne faut pas copier le fichier exemple, mais avec l'exemple ouvert faire un copier/coller du texte dans un nouveau fichier... et la, pour moi cela fonctionne!
SupprimerBonjour.
RépondreSupprimerMerci pour ce petit tuto. J'ai pu mettre en route une horloge à base d'Arduino nano rapidement. Ma seule difficulté a été de trouver sur quelles broches du nano brancher le module RTC. Certains schémas sur le Net indiquent les broches D4 et D5 pour SDA et SCL.
J'ai vu que sur le module que je possède et qui le même que le votre, il y a de la mémoire EEPROM intégrée. Connaissez vous un tuto pour son utilisation ?
Merci d'avance.
Ce n'est pas en français mais il faut suivre à l'écran c'est très instructif "adress"
Supprimerhttps://www.youtube.com/watch?v=tNcL4zSCl-Q
Re Bonjour !
RépondreSupprimerMaintenant que le programme est compilé,
j'ai 2 possibilités :
soit j'ai ligne 1 de l'afficheur : 0:00:00
et ligne 2 : 1 janvier 2000
Si j'enlève la pile du module RTC :
ligne 1 de l'afficheur 165:165:165
Ligne 2 165 2165
Résultats incompréhensibles à la réalisation d'une horloge qui ne fonctionne pas que ce soit avec 4 bit ou en I2C pcf8574 !!
Help please.
bonjour j'ai eu un problème lors de la compilation
RépondreSupprimerexit status 1
Erreur lors de la compilation.
merci
salut, j'ai compiler le programme et voici le résultat
RépondreSupprimerLe croquis utilise 5 594 octets (17%) de l'espace de stockage de programmes. Le maximum est de 32 256 octets.
Les variables globales utilisent 450 octets (21%) de mémoire Le maximum est de 2 048 octets.
cela veut dire que c'est réussi
SupprimerBonjour,
RépondreSupprimerj'ai utilisé cet exemple pour monter mon projet.
jusque là pas de soucis puisque j'étais branché en usb sur mon PC.
En revanche je n'arrive pas à mémoriser l'heure, je m'explique :
tant que je suis branché en USB l'heure de mon programme est à l'heure du PC (après téléversement du programme).
si je débranche et que je rebranche quelques minutes plus tard, le programme reprends à l'heure ou l'alimentation a été coupée.
J'ai d'abord pensé à ma pile qui était HS et l'ai donc changé mais... rien n'y fait.
Je ne comprends pas ou ça cloche. Faut il décommenter une certaine partie du programme ?
Merci si quelqu'un a la réponse.
Il y a une pile valide insérée dans le module RTC?
SupprimerOui, une CR2023 3V.
SupprimerJ'ai essayé une autre méthode qui utilise uniquement la lib "Wire.h" et l'heure reste bien mémorisée après une coupure d'alimentation de l'arduino.
Du coup ça vient de mon code. J'aimerai garder la méthode ci-dessus et utiliser la lib "RTClib.h" ce qui évitera de remodeler mon programme déjà bien avancé..
Je vais continuer à creuser côté prog' maintenant que je sais que ce n'est pas la pile.
bonjour
RépondreSupprimersi le programme ne fonctionne pas ça peut être du a
une petite erreur
#include
et il faut écrire
#include "RTClib.h"
Pour une raison que j'ignore j'ai réussis à mémoriser l'heure après une coupure de l'alimentation avec l'exemple de cette page et avec une manipulation que j'avais déjà testée.. à savoir :
Supprimerrenseigner l'heure au module RTC en téléversant le programme avec la ligne de code :
"RTC.adjust(DateTime(__DATE__, __TIME__));"
puis en téléversant à nouveau le programme en mettant cette ligne de code en commentaire...
Merci à ceux qui ont répondu à ma question même si j'avais déjà la réponse..
Le programme est bon, mais dans le microcontrôleur ça ne m'affiche pas du tout la bonne date, ni la bonne heure. J'ai beau supprimer "RTC.adjust(DateTime(__DATE__, __TIME__));" ou la mettre en commentaire, ça ne marche pas.
SupprimerPuis soit rien ne s'affiche sur l'afficheur ou alors seulement des choses incompréhensible...
Bonjours j'ai un petit soucis car je voudrais afficher l'heure sur un écran LCD avec le module RTC 3231. Du coup j'ai changer la ligne 31 de votre programme par : RTC_DS3231 RTC;
RépondreSupprimerMais lorsque je compile le programme sur mon afficheur j'ai :
165:165:85
165 2165
Merci d'avance de votre réponse
Est-ce qu'on parle de la bibliothèque que j'utilise dans cet article? Les choix possibles sont DS1388, PCF8563
Supprimeret BQ32000.
Merci
RépondreSupprimerMeme quesstion pour unkow
Supprimercomment on fait car c'est marquer pareil pour moi
Bonjour,
RépondreSupprimerj'ai trouvé un lien pour mettre à jour l'heure et la date et ça fonctionne.
http://www.semageek.com/arduino-un-utilitaire-bien-pratique-pour-mettre-a-lheure-les-modules-rtc/
Merci beaucoup pour tes explications. elles m'ont grandement aidées.
RépondreSupprimerBonjour, j'ai essayé de lancer le programme exemple mais quand j'ouvre le moniteur série, je ne vois qu'une ligne qui continue du genre :
RépondreSupprimer"ò êâÿb‡+]B‡+]B‡+]BO93B†«]R JãÿR JãÿB JãÿÒ êâÿR êãÿW"
Qu'est ce qui pourrait faire que ça ne marche pas ? Merci d'avance pour votre réponse.
La vitesse de transmission a-t-elle été changée pour 57600 bauds dans le moniteur série?
SupprimerBonjour, merci pour ce tuto bien fait, il semble que la DS1307 et surtout le type de quartz utilisé rende jusqu'à 10mn par jour de retard sans coupure de l'alimentation, pouvez-vous confirmer et donner une solution à ce problème si il y en a une ? La DS3231 est-elle aussi concernée ? Merci.
RépondreSupprimerL'explication de Flavien Cardon est impecable : il faut compiler avec la mise a l'heure ( la fameuse ligne : "RTC.adjust(DateTime(__DATE__, __TIME__));")
RépondreSupprimerPuis la mettre en commentaire avec les signes : //
Merci beaucoup car j'ai galérer pour trouver et tu m'a eclairé !!! bergart.eric@gmail.com
Bonjour,
RépondreSupprimerpourriez vous faire un code qui fonctionne avec un afficheur 4digit 7segements s'il vous plait?
Bonjour,
RépondreSupprimerjuste une petite suggestion d'allègement du code. On peut retirer le switch case et le remplacer par quelque chose de ce style:
String mois[12]= {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"};
lcd.print(mois[now.month()-1]);
Ha oui, c'est beaucoup plus élégant de cette façon!
SupprimerBonjour j'ai une erreur de complilation je ne comprends pas d'où cela provient, pouvez vous m'aider svp ?
RépondreSupprimervoici l'erreur :
Arduino : 1.8.13 (Windows 7), Carte : "Arduino Nano, ATmega328P"
In file included from D:\Arduino Mes Prog\Horloge_RTC_DS1307_plus_afficheur_LCD\Horloge_RTC_DS1307_plus_afficheur_LCD.ino:28:0:
D:\Arduino Mes Prog\libraries\RTClib-master\src/RTClib.h:25:10: fatal error: Adafruit_I2CDevice.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1
Erreur de compilation pour la carte Arduino Nano
Impossible de trouver boards.txt dans C:\Users\Gerard\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6. Version pre-1.5 ?
Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.