Modifications

Sauter à la navigation Sauter à la recherche
3 336 octets ajoutés ,  8 février 2018 à 19:14
Ligne 2 : Ligne 2 :     
== Librairie Arduino ==
 
== Librairie Arduino ==
N'importe quel micro-controleur 5V supportant I2C peut facilement utiliser le DS1307. Cette page montrera comment l'utiliser avec un Arduino puisqu'il s'agit d'un micro-controleur vraiment très populaire.
+
La RTC est un périphérique I2C, ce qui signifie qu'il ne faut que 2 fils pour communiquer avec la RTC. Ces deux fils sont utilisés pour fixer l'heure ou l'extraire de la RTC. Sur un Arduino UNO, les broches I2C sont également raccordées sur les broches analogiques analogique A4 et A5.
   −
Pour la librairie RTC, AdaFruit à utilisé un dérivé (fork) de l'excellente librairie RTC produit par JeeLab - [http://github.com/adafruit/RTClib téléchargement de RTClib ici].
+
N'importe quel microcontrôleur 5V supportant I2C peut facilement utiliser la RTC '''DS1307''' ou RTC '''PCF8523'''. Cette page montrera comment utiliser ces RTC avec Arduino (l'un des microcontrôleur très populaire).
   −
[http://github.com/adafruit/RTClib RTCLib] est une librairie permettant de lire l'heure du DS1307 mais aussi de la modifier :-) . Cette librairie initialement écrite par JeeLab à été modifiée par AdaFruit pour répondre à ses besoin... il est donc préférable d'utiliser la librairie proposée ci-dessus pour assurer une totale compatibilité.
+
Pour la librairie RTC, AdaFruit à utilisé un dérivé (fork) de l'excellente librairie RTC produit par JeeLab - [https://github.com/adafruit/RTClib téléchargement également disponible sur GitHub].
   −
Télécharger l'archive Zip en cliquant sur le lient Download Source (en haut à droite) et renommer le répertoire décompressé "RTClib" pour ensuite [[[[Installation d'un librairie Arduino|l'installer dans le répertoire des librairie Arduino ]] (dans un répertoire nommé RTCLib).
+
{{download-box|Téléchargez La bibliothèque RTC|https://github.com/adafruit/RTClib/archive/master.zip}}
 +
 
 +
[http://github.com/adafruit/RTClib RTCLib] est une librairie permettant de lire l'heure du '''DS1307''' ou '''PCF8523''' mais aussi de la modifier :-) .
 +
 
 +
Télécharger l'archive Zip en cliquant sur le lient Download Source (en haut à droite) et renommer le répertoire décompressé "RTClib" pour ensuite [[Installation d'un librairie Arduino|l'installer dans le répertoire des librairie Arduino ]] (dans un répertoire nommé {{fname|repertoire_des_croquis_arduino/libraries/RTCLib/}} ).
 +
 
 +
Vérifiez que le répertoire RTClib contient les fichiers RTClib.cpp et RTClib.h
    
== Branchement ==
 
== Branchement ==
Il y a seulement 5 broches/pins à raccorder: 5V GND SCL SDA SQW.
+
Que vous utilisez une horloge DS1307 ou PCF8523 les raccordements sont identiques.
 +
 
 +
Il y a seulement 5 broches/pins à raccorder: 5V, GND, SCL, SDA, SQW.
    
* '''5V''' est utilisé pour alimenter le circuit intégré du RTC quand vous avez besoin de dialoguer avec lui (par exemple: pour demander l'heure). S'il n'y a pas d'alimentation 5V alors le C.I. passe en mode veille et utilise la pile bouton comme alimentation de secour.
 
* '''5V''' est utilisé pour alimenter le circuit intégré du RTC quand vous avez besoin de dialoguer avec lui (par exemple: pour demander l'heure). S'il n'y a pas d'alimentation 5V alors le C.I. passe en mode veille et utilise la pile bouton comme alimentation de secour.
Ligne 17 : Ligne 25 :  
* '''SCL''' est le signal d'horloge (clock) du bus I2C - il est nécessaire pour dialoguer avec le RTC.
 
* '''SCL''' est le signal d'horloge (clock) du bus I2C - il est nécessaire pour dialoguer avec le RTC.
 
* '''SDA''' est le signal de donnée (data) du bis I2C - il est également nécessaire pour dialoguer avec le RTC
 
* '''SDA''' est le signal de donnée (data) du bis I2C - il est également nécessaire pour dialoguer avec le RTC
 +
 +
Sur une RTC DS1307:
 
* '''SQW''' est une broche optionnel. Sortie d'une onde carrée (square-wave output) que vous pouvez obtenir du module RTC si vous l'avez configuré pour qu'il le produise. La plupart des utilisateur n'ont pas besoin de cette broche et ne l'utilise pas.
 
* '''SQW''' est une broche optionnel. Sortie d'une onde carrée (square-wave output) que vous pouvez obtenir du module RTC si vous l'avez configuré pour qu'il le produise. La plupart des utilisateur n'ont pas besoin de cette broche et ne l'utilise pas.
   −
[[Fichier:ADF-RTC-DS1307-USE-01.jpg]]
+
{{ADFImage|ADF-RTC-DS1307-USE-01.jpg}}
    
Truc et astuce:
 
Truc et astuce:
Ligne 26 : Ligne 36 :  
* Placer la broche analogique 2 (digitale 16) sur OUTPUT et niveau logique LOW (bas)
 
* Placer la broche analogique 2 (digitale 16) sur OUTPUT et niveau logique LOW (bas)
   −
[[Fichier:ADF-RTC-DS1307-USE-02.jpg]]
+
{{ADFImage|ADF-RTC-DS1307-USE-02.jpg}}
    
== Premier test RTC ==
 
== Premier test RTC ==
Ligne 36 : Ligne 46 :  
Donc, pour commencer, retirez la pile du son emplacement pendant qu'Arduino n'est pas alimenté (ou raccordé via USB). Attendez 3 secondes et ensuite, replacez la pile. Cela fait une remise-à-zéro (reset) du circuit RTC.  
 
Donc, pour commencer, retirez la pile du son emplacement pendant qu'Arduino n'est pas alimenté (ou raccordé via USB). Attendez 3 secondes et ensuite, replacez la pile. Cela fait une remise-à-zéro (reset) du circuit RTC.  
   −
Maintenant ouvrez le sketch suivant sur votre Arduino (il est disponible dans Examples->RTClib->ds1307) et téléchargez le sur votre Arduino avec breakout DS1307 branché OU votre shield Datalogger raccordé.
+
Maintenant ouvrez le sketch suivant sur votre Arduino.
 +
 
 +
L'exemple à charger dépend de l'horloge RTC présent sur la carte:
 +
* Horloge à base de DS1307: '''Examples -> RTClib -> ds1307'''
 +
* Horloge à base de PCF8523: '''Examples -> RTClib -> pcf8523'''
 +
 
 +
{{ADFImage|ADF-RTC-DS1307-UTILISER-10.png}}
 +
 
 +
Puis compilez et téléchargez le sur votre Arduino avec breakout RTC branché OU votre shield Datalogger raccordé.
 +
 
 +
{{ambox|text=Vérifiez le nom du composant RTC Si vous avez un problème pour faire fonctionner l'exemple! Les puces RTC PCF8523 et DS1307 RTC ne sont pas identiques et ont des exemples séparés! }}
   −
<nowiki>// fonctions Date et heure en utilisant  
+
<syntaxhighlight lang="C">
 +
// fonctions Date et heure en utilisant  
 
// le RTC DS1307 RTC via bus I2C et librairie Wire
 
// le RTC DS1307 RTC via bus I2C et librairie Wire
   Ligne 44 : Ligne 65 :  
#include "RTClib.h"
 
#include "RTClib.h"
    +
# Utiliser la classe RTC_DS1307 ou RTC_PCF8523 en
 +
# fonction du module RTC utilisé
 
RTC_DS1307 RTC;
 
RTC_DS1307 RTC;
   Ligne 102 : Ligne 125 :  
     delay(3000);
 
     delay(3000);
 
}
 
}
</nowiki>
+
</syntaxhighlight>
    
Démarrer le moniteur série et assurez vous qu'il soit bien configuré sur un débit de 57600 bauds.
 
Démarrer le moniteur série et assurez vous qu'il soit bien configuré sur un débit de 57600 bauds.
Ligne 108 : Ligne 131 :  
Vous devriez voir les messages suivants:  
 
Vous devriez voir les messages suivants:  
   −
[[Fichier:ADF-RTC-DS1307-USE-03.jpg]]
+
{{ADFImage|ADF-RTC-DS1307-USE-03.jpg}}
    
A chaque fois que le composant RTC perd toutes ses sources d'alimentation (incluant donc la pile de secours) l'heure repasse à 0:0:0 et ne recommence pas à compter les secondes (c'est à l'arrêt).  
 
A chaque fois que le composant RTC perd toutes ses sources d'alimentation (incluant donc la pile de secours) l'heure repasse à 0:0:0 et ne recommence pas à compter les secondes (c'est à l'arrêt).  
Ligne 128 : Ligne 151 :  
Ensuite, ouvrez le moniteur série pour constater que l'heure est bien initialisée.  
 
Ensuite, ouvrez le moniteur série pour constater que l'heure est bien initialisée.  
   −
[[Fichier:ADF-RTC-DS1307-USE-04.jpg]]
+
{{ADFImage|ADF-RTC-DS1307-USE-04.jpg}}
    
A partir de maintenant, vous n'aurez plus besoin d'initialiser le temps. La pile devrait suffire pour maintenir la date et l'heure pendant 5 ans ou plus.
 
A partir de maintenant, vous n'aurez plus besoin d'initialiser le temps. La pile devrait suffire pour maintenir la date et l'heure pendant 5 ans ou plus.
Ligne 154 : Ligne 177 :  
Il n'y a qu'une seule façon d'obtenir l'heure avec RTCLib, c'est d'appeler '''now()''', une fonction qui retourne un objet DateTime qui contient/décrit l'année (''year''), le mois (''month''), le jour (''day''), l'heure (''hour''), les minutes (''minute'') et secondes (''second'') au moment de l'appel de '''now()'''.
 
Il n'y a qu'une seule façon d'obtenir l'heure avec RTCLib, c'est d'appeler '''now()''', une fonction qui retourne un objet DateTime qui contient/décrit l'année (''year''), le mois (''month''), le jour (''day''), l'heure (''hour''), les minutes (''minute'') et secondes (''second'') au moment de l'appel de '''now()'''.
   −
'''Truc et astuce:'''
+
=== Ne pas tomber dans le piège de simplicité ===
 +
 
 +
Il existe des librairie RTC qui permettent d'obtenir les différentes informations par l'intermédiaire de différentes fonctions "plus directes". Vous pouvez donc faire des appels comme '''RTC.year()''' et '''RTC.hour()''' pour obtenir l'année courant et l'heure courante.
   −
Il existe des librairie RTC qui permettent d'obtenir les différentes informations par l'intermédiaire de différentes fonctions "plus directes". Vous pouvez donc faire des appels comme '''RTC.year()''' ('''année''') et '''RTC.hour()''' ('''heure''') to get the current year and hour. However, there's one problem where if you happen to ask for the minute right at '''3:14:59''' just before the next minute rolls over, and then the second right after the minute rolls over (so at '''3:15:00''') you'll see the time as '''3:14:00''' which is a minute off. If you did it the other way around you could get '''3:15:59''' - so one minute off in the other direction.
+
Cependant, il y a un problème si vous êtes sur le point de demander les minutes juste au moment où il est '''3:14:59''' et que la prochaines minute prend place. Donc vous lisez les minutes (soit 14 pour 3:14:59), le RTC égraine la prochaine seconde et il est maintenant '''3:15:00''' et votre programme lit les secondes (soit 00 pour 3:15:00).  
   −
Because this is not an especially unlikely occurance - particularly if you're querying the time pretty often - we take a 'snapshot' of the time from the RTC all at once and then we can pull it apart into '''day()''' or '''second()''' as seen above. Its a tiny bit more effort but we think its worth it to avoid mistakes!
+
Résultat, le programme à lut 14 minutes et 0 secondes alors qu'il était 3:14:59... pire, si l'on interprète les deux valeurs obtenue il serait x:14:00 alors qu'il est en fait x:14:59. Il y a a donc une erreur d'une minute.  
   −
We can also get a 'timestamp' out of the DateTime object by calling '''get''' which counts the number of seconds (not counting leapseconds) since midnight, January 1st 2000
+
Et en utilisant les fonctions dans l'autre sens (lecture des secondes avant les minute), cette fois nous pourrions avoir une minute d'avance et obtenir '''3:15:59''' alors qu'il est 3:14:59.
   −
  <nowiki>    Serial.print(" since 2000 = ");
+
=== Utiliser l'approche cohérente ===
 +
 
 +
Pour poursuivre le point précédent, une mauvaise méthode d'acquisition du temps risque d'introduire des erreurs récurrentes dans votre projet... surtout si vous lisez souvent l'heure depuis le module RTC.
 +
 
 +
Une approche beaucoup plus fiable et offrant un résultat cohérent consiste a "capturer une copie de l'heure" du RTC en une seule opération. Ensuite, '''cette copie étant figée''', vous pouvez en extraire les différents éléments (jour, mois, minutes, secondes...) sans le risque de voir une incohérence apparaître.
 +
 
 +
C'est exactement ce qui à été fait dans l'exemple précédent lorsque nous avons exécuté les lignes suivantes:
 +
 
 +
<nowiki>    DateTime now = RTC.now(); // Faire un copie 'figée' de l'heure du RTC
 +
   
 +
    Serial.print(now.year(), DEC);  // Affichage ANNEE - extraire l'information de la copie figée
 +
    Serial.print('/');
 +
    Serial.print(now.month(), DEC);  // Affichage MOIS - extraire l'information de la copie figée
 +
    Serial.print('/');</nowiki>
 +
 
 +
Cela représente un peu plus d'effort mais cela nous met également à l'abri des erreurs :-) !
 +
 
 +
== Timestamp ==
 +
"Timestamp" est un terme fort répandu en informatique... nous le traduirions par "Horodatage".
 +
 
 +
Dans le monde informatique, 'TimeStamp' à surtout la particularité d'avoir une valeur unique (de préférence sous forme de valeur numerique) à/pour chaque instant.
 +
 
 +
Il est également possible d'obtenir un 'TimeStamp' depuis l'objet DateTime en appelant la fonction '''get'''. '''Get''' retourne le nombre de '''secondes''' écoulées (en totalité) depuis le premier janvier 2000 à minuit.
 +
 
 +
  <nowiki>    Serial.print(" depuis 1 jan. 2000 = ");
 
     Serial.print(now.get());
 
     Serial.print(now.get());
     Serial.print("s = ");
+
     Serial.print("secondes = ");
 
     Serial.print(now.get() / 86400L);
 
     Serial.print(now.get() / 86400L);
     Serial.println("d");</nowiki>
+
     Serial.println(" jours");</nowiki>
 +
 
 +
=== Evaluer le temps qui passe ===
 +
 
 +
Puisqu'il y a 60*60*24 = 86400 secondes dans un jours, nous pouvons facilement compter le nombre de jours (aussi).
 +
 
 +
Cela peut être particulièrement utile pour savoir combien de temps a passé:
 +
* entre les deux fois où un événement particulier s'est produit.
 +
* depuis la dernière fois que le avons interrogé un capteur (ou sous-système).
 +
 
 +
Rendant les chose plus facile dans de nombreux cas.
 +
 
 +
Par exemple, pour savoir si 5 minutes sont passées, il suffit d'attendre que la différence entre l'appel initial de '''get()''' et notre appel de vérification soit soit plus grand de 300 (=5 min * 60 secondes)... même pas besoin de vérifier les changements d'heures.
   −
Since there are 60*60*24 = 86400 seconds in a day, we can easily count days since then as well. This might be useful when you want to keep track of how much time has passed since the last query, making some math a lot easier (like checking if its been 5 minutes later, just see if '''get()''' has increased by 300, you dont have to worry about hour changes)
+
<nowiki>// Attendre 5 minutes pour envoyer un message.
 +
// Comme loop est exécuté constamment, le message sera envoyé toutes les 5 minutes
 +
function loop() {
 +
  DateTime depart = RTC.now();
 +
  DateTime maintenant = RTC.now();
 +
  while( (maintenant.get() - depart.get()) < 300 ) {
 +
    maintenant = RTC.now(); // Re-capturer l'heure
 +
  }
 +
  Serial.println( "5 minutes viennent de passer" );
 +
}</nowiki>
    
{{ADF-RTC-DS1307-TRAILER}}
 
{{ADF-RTC-DS1307-TRAILER}}
29 879

modifications

Menu de navigation