Ajouter une horloge à vos montages

Introduction :

Il est parfois nécessaire pour certains projets de disposer de la date et l’heure en temps réels par exemple pour enregistrer des relevés de température ou autres.

Pour cela on peut s’appuyer sur le WEB si le montage dispose d’une connexion à internet avec un Arduino Yun, un shield Ethernet ou un ESP8266 par exemple.

Mais si on ne dispose pas de connexion à internet, on peut alors utiliser une horloge temps réel RTC (Real Time Clock) avec l’Arduino. L’avantage de ces horloges est de conserver en permanence très, très longtemps … la date et l’heure exactes grâce à une pile CR2032 (3,3 V) même en cas de coupure de l’alimentation de l’Arduino. Il faut juste prévoir une initialisation avant l’utilisation de l’horloge RTC pour avoir la bonne date et la bonne heure…

On peut utiliser par exemple un des deux modèles très répandus d’horloge temps réels DS1302 ou DS1307. Ces deux horloges RTC utilisent des connexions et des protocoles séries différents :

  • Le DS1302 utilise une interface avec 3 connections non standards (I/O Data bidirectionnel, SCLK Serial Clock et Chip Select/ RST) ce qui ne permet pas d’utiliser la bibliothèque standard,
  • Le DS1307 utilise une interface I2C avec deux connections SDA (données) et SCL (clock).
On peut aussi utiliser par ailleurs la DS3231 qui est plus précise et moins dépendante des facteurs extérieurs comme la température. Elle utilise le protocole série I2C comme la DS1307. Le quartz est inclu dans la puce.

Dans cet article, nous allons utiliser la DS1302 dont la documentation de référence est disponible à l’adresse suivante : https://datasheets.maximintegrated.com/en/ds/DS1302.pdf

Montage

 Il est très simple, il suffit de relier comme indiqué ci-dessous les trois fils de communication de la DS1302 :
  • DS1302 patte CE (ou RST)            -> Arduino Digital 2
  • DS1302 patte DATA (données)    -> Arduino Digital 3
  • DS1302 patte CLK (horloge)        -> Arduino Digital 4

Il faut bien sûr par ailleurs relier les masses (GND) et les alimentations (VCC) de l’Arduino et du DS1302.

ds1302

Code

Nous allons écrire un programme permettant d’initialiser la date et l’heure puis de lire en continu ensuite la date et l’heure pour affichage dans la console série.

Pour ce programme, le plus simple est de s’appuyer sur une bibliothèque existante comme par exemple celle de Henning Karlsen utilisée dans cet article. Cette bibliothèque qui s’appelle DS1302 est disponible à l’adresse http://www.rinkydinkelectronics.com/library.php?id=5

Elle doit être téléchargée puis décompressée dans votre répertoire libraries, par exemple dans mon cas le répertoire C:\Users\PARAPLUIE\Documents\Arduino\libraries

J’ai ensuite modifié le fichier DS1302.cpp pour franciser les noms des mois qui sont en anglais dans le code de la bibliothèque.

Il faut ensuite relancer l’IDE Arduino pour prendre en compte cette nouvelle bibliothèque.

Le programme utilisé ci-dessous s’inspire de celui de Henning Karlsen :
// Nom script : phm_ds1302_serial_hard 
// Creation : Le 03 06 2016
// Description : Initialisation date/heure puis boucle affichage
// Inspiré du script suivant :
// DS1302_Serial_Hard (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// Les connections suivantes doivent être effectuées DS1302.
// DS1302 patte RST  -> Arduino Digital 2
// DS1302 patte DATA -> Arduino Digital 3
// DS1302 patte CLK  -> Arduino Digital 4

#include <DS1302.h>

// Init DS1302
DS1302 rtc(2, 3, 4);

// Init structure Time-data
Time t;

void setup()
{
  // Positionnement horloge a run-mode et desactive protection en ecriture
  rtc.halt(false);
  rtc.writeProtect(false);
  
  // Init connection serie
  Serial.begin(9600);

  // Initialisation de l'horloge
  // A mettre a jour avec les bones valeurs pour initialiser l horloge RTC DS1302
  rtc.setDOW(FRIDAY);        // Jour a FRIDAY
  rtc.setTime(19, 10, 0);    // Heure a 19:10:00 (format sur 24 heure)
  rtc.setDate(3, 6, 2016);   // Date  au 3 juin 2016
}

void loop()
{
  // recup donnees DS1302
  t = rtc.getTime();
  
  // Ecriture date sur console serie
  Serial.print("Jour : ");
  Serial.print(t.date, DEC);
  Serial.print(" - Mois : ");
  Serial.print(rtc.getMonthStr());
  Serial.print(" - Annee : ");
  Serial.print(t.year, DEC);
  Serial.println(" -");
  
  // Ecriture heure sur console serie
  Serial.print("C est le ");
  Serial.print(t.dow, DEC);
  Serial.print(" ieme jour de la semaine (avec lundi le premier), et il est ");
  Serial.print(t.hour, DEC);
  Serial.print(" heures, ");
  Serial.print(t.min, DEC);
  Serial.print(" minutes ");
  Serial.print(t.sec, DEC);
  Serial.println(" secondes.");

  // Affichage d un separateur
  Serial.println("------------------------------------------");
  
  // Attente d une seconde avant lecture suivante :)
  delay (1000);
}


 Résultats

Les résultats obtenus dans la console série sont les suivants :
 Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 0 secondes.
——————————————
Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 1 secondes.
——————————————
Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 2 secondes.
——————————————
Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 3 secondes.
——————————————
Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 4 secondes.
——————————————
Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 5 secondes.
——————————————
Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 6 secondes.
——————————————
Jour : 3 – Mois : Juin – Annee : 2016 –
C est le 5 ieme jour de la semaine (avec lundi le premier), et il est 19 heures, 10 minutes 7 secondes.
——————————————

 Conclusion

Pour aller plus loin et comprendre le fonctionnement interne de la DS1302, on peut se rendre à l’adresse suivante : http://playground.arduino.cc/Main/DS1302.
Publicités

8 réflexions au sujet de « Ajouter une horloge à vos montages »

  1. Salut, merci pour le tuto, j’ai tester le code, mais le moniteur m’affiche 1 seconde sur 2 :

    Jour : 3 – Mois : June – Annee : 2016 –
    519 heures, 10 minutes 5 secondes.
    ——————————————
    Jour : 0 – Mois : xxxxxxxxx – Annee : 2000 –
    00 heures, 0 minutes 0 secondes.
    ——————————————
    Jour : 3 – Mois : June – Annee : 2016 –
    519 heures, 10 minutes 7 secondes.
    ——————————————
    Jour : 0 – Mois : xxxxxxxxx – Annee : 2000 –
    00 heures, 0 minutes 0 secondes.
    ——————————————

    Une idée ?

    J'aime

  2. Je viens de trouver le problème :

    J’avais utiliser le pin 3 (alternatif si j’ai bien compris) pour CLK qui doit surement etre branché en continu.

    Donc ça venait des branchements.

    Si ça peut servir…

    J'aime

  3. Bonjour Max,

    Merci pour tes commentaires. Content de voir que tu as réussi à faire fonctionner ton montage.

    En ce qui concerne la patte A3 de l’Arduino, le A veut dire Analogique et pas Alternatif.

    A3 est en effet d’une entrée analogique et non pas numérique comme D3 qui restitue soit 0, soit 1 en lecture avec l’instruction DigitalRead.
    Alors que la lecture de la patte A3 restitue une valeur entre 0 et 1023 en fonction de la valeur de la tension présente sur la patte avec l’instruction AnalogRead.

    J'aime

  4. merci pour le tuto mais j’ai un soucis en l’exécutant…
    J’obtiens sur le moniteur série 7 fois la bonne date avec mise à l’heure correcte puis 8 fois une date de 2011 avec heure différentes puis de nouveau 7 fois heure et date de 2016 et ainsi de suite…..
    Avez-vous une idée pour debugger ça ?
    merci d’avance..
    ben

    J'aime

  5. Bonjour
    Je rencontre un problème de compilation
    ————–
    Utilisation de la bibliothèque DS1302 prise dans le dossier : C:\Program Files (x86)\Arduino\libraries\DS1302 (legacy)
    exit status 1
    Erreur de compilation pour la carte Arduino/Genuino Uno
    —————-
    j’ai bien suivi la procédure d’installation de la librairie
    elle se trouve bien dans le répertoire libraire je ne vois pas d’où vient le problème
    si qq as une recommandation !!
    merci d’avance

    J'aime

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s