mercredi 19 juin 2013

Une horloge pour votre Arduino (Real Time Clock)

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)

39 commentaires:

  1. Merci votre programme nous a permis d'avancer dans notre projet.

    RépondreSupprimer
  2. Thanks for this, just used this with a Nano. Works like a charm.

    RépondreSupprimer
  3. merci pour le code bien jouer !!!!

    RépondreSupprimer
  4. parfait, 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
    bravo pour ce code
    je suis un fervent de l'I2C
    cordialement

    RépondreSupprimer
  5. eu j'ai un petit probleme lors de la compilation du programme, sa me met


    compilation terminated.

    exit status 1
    Erreur lors de la compilation.

    RépondreSupprimer
    Réponses
    1. Il faut valider le port com en USB si tu utilise l'usb et installer les drivers si ce n'est
      pas fait.

      Supprimer
  6. Le programme ne fonctionne pas, l'heure reste figée.
    Les 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.

    RépondreSupprimer
    Réponses
    1. Windows et Linux vous interdit de modifier le fichier d'un sketch Arduino?

      Supprimer
    2. Ha, je comprend: vous avez essayé de modifier directement le fichier d'exemple plutôt qu'en modifier une copie.

      Supprimer
    3. Rebonjour!
      Oui, 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.

      Supprimer
    4. 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.
      Le 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.

      Supprimer
    5. À 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.

      Supprimer
    6. J'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!

      Supprimer
  7. Bonjour.
    Merci 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.

    RépondreSupprimer
    Réponses
    1. Ce n'est pas en français mais il faut suivre à l'écran c'est très instructif "adress"

      https://www.youtube.com/watch?v=tNcL4zSCl-Q

      Supprimer
  8. Re Bonjour !
    Maintenant 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.

    RépondreSupprimer
  9. bonjour j'ai eu un problème lors de la compilation
    exit status 1
    Erreur lors de la compilation.
    merci

    RépondreSupprimer
  10. salut, j'ai compiler le programme et voici le résultat
    Le 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.

    RépondreSupprimer
  11. Bonjour,

    j'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.

    RépondreSupprimer
    Réponses
    1. Il y a une pile valide insérée dans le module RTC?

      Supprimer
    2. Oui, une CR2023 3V.

      J'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.

      Supprimer
  12. bonjour
    si le programme ne fonctionne pas ça peut être du a
    une petite erreur
    #include
    et il faut écrire
    #include "RTClib.h"

    RépondreSupprimer
    Réponses
    1. 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 :

      renseigner 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..

      Supprimer
    2. 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.
      Puis soit rien ne s'affiche sur l'afficheur ou alors seulement des choses incompréhensible...

      Supprimer
  13. 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;
    Mais lorsque je compile le programme sur mon afficheur j'ai :
    165:165:85
    165 2165
    Merci d'avance de votre réponse

    RépondreSupprimer
    Réponses
    1. Est-ce qu'on parle de la bibliothèque que j'utilise dans cet article? Les choix possibles sont DS1388, PCF8563
      et BQ32000.

      Supprimer
  14. Réponses
    1. Meme quesstion pour unkow
      comment on fait car c'est marquer pareil pour moi

      Supprimer
  15. Bonjour,
    j'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/

    RépondreSupprimer
  16. Merci beaucoup pour tes explications. elles m'ont grandement aidées.

    RépondreSupprimer
  17. Bonjour, 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 :
    "ò êâÿ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.

    RépondreSupprimer
    Réponses
    1. La vitesse de transmission a-t-elle été changée pour 57600 bauds dans le moniteur série?

      Supprimer
  18. Bonjour, 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épondreSupprimer
  19. L'explication de Flavien Cardon est impecable : il faut compiler avec la mise a l'heure ( la fameuse ligne : "RTC.adjust(DateTime(__DATE__, __TIME__));")
    Puis 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

    RépondreSupprimer
  20. Bonjour,
    pourriez vous faire un code qui fonctionne avec un afficheur 4digit 7segements s'il vous plait?

    RépondreSupprimer
  21. Bonjour,
    juste 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]);

    RépondreSupprimer
  22. Bonjour j'ai une erreur de complilation je ne comprends pas d'où cela provient, pouvez vous m'aider svp ?
    voici 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.

    RépondreSupprimer