L'arduino n'a pas vraiment d'horloge embarquée. De plus, l'heure se perd en cas de coupure de courant ou de reset (upload). On pourrait prévoir une alimentation de secours (pour l'arduino uniquement). La précision de l'horloge logicielle (à programmer soi-même en utilisant la minuterie du processeur) est d'environ 30 secondes par jour.
Pour l'horloge RTC (Real Time CLock), on peut utiliser un DS1307 ou un DS3231. La seconde horloge a un petit espace mémoire en plus pour stocker l'heure d'alarme, mais ce n'est pas strictement nécessaire car nous pouvons également stocker l'heure d'alarme dans l'EEPROM du processeur.
Attention, les modules qu'on trouve pour quelques € sur ebay ont une précision toute relative. Il n'est pas rare qu'un module avance ou retarde d'une minute par semaine. Comme l'erreur reste relativement stable, il est aisément possible de corriger l'erreur.
- Si le module retarde d'une minute par semaine, on ajoute (via le logiciel) 9 secondes chaque fois que l'horloge passe à 23:59. On stocke directement la nouvelle valeur dans le module RTC
- Si le module avance de 50 secondes par semaine, on retire 7 secondes par jour, on stocke la valeur dans le module et on met le processeur en sleep pendant 8 secondes pour éviter qu'il ne retire à nouveau 7 secondes à l'infini
Nous ne devons stocker que 3 octets pour l'alarme: l'heure et les minutes, ainsi que l'alarme enclenchée ou non. L'enregistrement dans l'EEPROM se fait quand on quitte le mode ALARM et uniquement si les données ont été modifiées.
Il y a 4 fils qui vont de l'horloge à l'arduino: ma masse, le 5V, SDA et SCL (data et clock pour la communication sérielle). Il est nécessaire d'ajouter une librairie pour assurer la communication entre l'arduino et l'horloge RTC.
La librairie détermine quels ports de communication utiliser et aucune librairie ne permet de modifier ces paramètres (par un #DEFINE, comme dans mon application). Il faudra donc adapter ton programme pour tenir compte de ces spécificités. Certaines librairies utilisent deux lignes numériques, d'autres utilisent deux lignes analogiques. Comme j'ai besoin de plus de lignes numériques, j'ai choisi une routine qui utilise deux lignes analogiques.
Attention, les fichiers à inclure doivent se trouver dans un sous-répertoire du répertoire "libraries" qui a comme nom le nom du fichier, mais sans le .h (donc par exemple répertoire RTClib). Attention, Unix tient compte des minuscules et majuscules!
L'horloge nécessite une petite pile bouton pour continuer à fonctionner en cas de coupure de courant. Une telle pile peut avoir une durée de vie de 5 ans.
Il peut y avoir des problèmes quand on utilise des instructions écrites pour une certaine librairie avec une autre librairie. Le nom des instructions est souvent le même, mais le fonctionnement peut être différent. Les instruction spécifiques commencent par le préfixe rtc., par exemple rtc.setHours(h);
Pour savoir quelles routines utiliser, il faut rechercher les routines à utiliser en se basant sur le nom de la puce utilisée, généralement DS1307. Certaines librairies ne contiennent que les fonctions de base, d'autres sont plus étendues. Certaines librairies nécessitent l'inclusion de la librairie pour accéder aux fonctions I2C (wire.h), d'autres contiennent déjà les fonctions nécessaires.
Les routines mises à la disposition sur le site d'arduino même concernent l'arduino zero, un module qui dispose d'une horloge intégrée. Dans les exemples j'utilise l'arduino uno.
Le protocole de communication utilisé est I2C, un protocole qui existe déjà depuis les années 1980 et qui est complètement stabilisé.
Le module montré dispose en plus de l'horloge DS1307Z d'une mémoire EEPROM 24C32 qui n'est pas utilisée dans notre système. Cette mémoire n'est pas alimentée par la pile, c'est une mémoire non-volatile. Le protocole I2C permet l'interconnection d'un très grand nombre de puces compatibles. Chaque puce a une adresse propre pour éviter les problèmes de communication.
Le circuit complet (module RTC et pile) coûte moins de 2€ sur ebay.
On trouve également des modules temps réel dans les thermostats électroniques, pour garder l'heure exacte et les températures en cas de coupure de courant. Si tu as de la chance, le module a la forme d'un petit circuit enfichable et c'est à toi de rechercher quelle est la masse, le 5V, la ligne SDA et SCL. Le cristal est ici le petit bloc noir en haut à gauche.
La puce utilisés n'est parfois pas compatible: elle a également une fonction de mémoire. Dans certains cas, la pile lithium CR2032 est remplacée par un petit accu lithium LIR2035. La capacité de l'accu est limitée à 50mAh (en comparaison de la capacité de 240mAh d'une pile), mais l'accu est rechargé quand le circuit est branché sur le 5V.
|