Module Temps réel (RTC) I2C¶
Description¶
Module heure temps réel à communication I2C
Info
Le module fournit également une mesure de la température !
Pour comprendre¶
Sur la plupart des cartes à micro-contrôleurs, il n'y a pas d'horloge Temps Réel (Real Time Clock ou RTC). On dispose généralement de fonctions de comptage des millisecondes ou des microsecondes écoulées depuis la mise sous tension, ce genre de chose, mais pas la date ni l'heure.
De plus, il est nécessaire que l'heure une fois réglée soit mémorisée même hors tension, ce qui impose l'utilisation d'une micropile.
Une module RTC fourni les 2 :
- le comptage de l'heure
- la pile de mémorisation
Le module¶
Le brochage¶
Très simple et logique :
- les broches I2C SDA (bidirectionnelle) et SCL (horloge I2C)
- le V+ qui peut être 3.3V ou 5V (alim du DS3232 de 2.8V à 5.5V)
- le 0V
Montage type¶
On connecte :
- SDA sur SDA I2C0 (GP16)
- SCL sur SSCL I2C0 (GP17)
- 0V sur 0V
- V+ sur 3.3V
Librairie Micropython¶
Librairie ici avec exemples : https://github.com/peterhinch/micropython-samples/tree/master/DS3231
Avec le Pi Pico, il faut utiliser la librairie "multiplateforme" : ds3231_port.py
J'ai légèrement modifié la librairie pour que la fonction savetime()
supporte une valeur passée en paramètre
La classe RTC qui fournit des fonctions intéressantes n'est pas disponible sur le Pi Pico (Février 2021). Pas indispensable pour la librairie.
Truc pour synchroniser heure pc et pico¶
Il faut au moins une synchro entre les 2 au même moment ce qui peut aussi se faire manuellement en faisant simultanément dans un python pc et micropython repl :
import utime
utime.time()-1609459200
et sur le pc :
import time
int(time.time())-1609459200+3600 # 3600 = 1 heure de décalage
Une fois qu'on a la valeur pc et la pico, on fait sur le pico :
utime.localtime(utime.time()+delta_pc-delta_pico)
par exemple :
utime.localtime(utime.time()+5680247-4564)
Il en résulte :
(2021, 3, 7, 18, 0, 26, 6, 66)
Débrouillage dans l'interpréteur¶
>>> from ds3231_port import DS3231
Warning: machine module does not support the RTC.
>>> from machine import Pin, I2C
>>> i2c=I2C(0,sda=Pin(16), scl=Pin(17))
>>> ds3231 = DS3231(i2c)
>>> ds3231.get_time()
(1901, 9, 12, 21, 36, 22, 4, 0)
>>> import utime
>>> utime.localtime()
(2021, 1, 1, 0, 5, 37, 4, 1)
>>> utime.time()-1609459200
562
>>> utime.localtime(utime.time()+7205969-562)
(2021, 3, 25, 9, 40, 13, 3, 84)
>>> ds3231.save_time()
>>> ds3231.get_time()
(2021, 1, 1, 0, 12, 0, 4, 0)
>>> ds3231.get_temperature()
12.25
>>> utime.localtime()
(2021, 1, 1, 0, 14, 2, 4, 1)
>>> ds3231.save_time(utime.localtime(utime.time()+7205969-562))
# ds3231.save_time(utime.localtime(utime.time()+delta_pc-delta_pico))
>>> ds3231.get_time()
(2021, 3, 25, 9, 54, 38, 3, 0)
Le test intéressant ensuite est de débrancher / rebrancher et vérifier que la RTC est toujours àl'heure.
>>> from ds3231_port import DS3231
Warning: machine module does not support the RTC.
>>> from machine import Pin, I2C
>>> i2c=I2C(0,sda=Pin(16), scl=Pin(17))
>>> ds3231 = DS3231(i2c)
>>> ds3231.get_time()
(2021, 3, 25, 9, 58, 9, 3, 0)
Nickel ! La RTC fonctionne normalement et le truc de "mise à l'heure" est ici efficace.
Code d'exemple¶
Une fois que le module est à l'heure, l'intérêt est surtout d'utiliser l'heure et la date ainsi fournie.
En fait partir de get_time() :
>>> ds3231.get_time()
(2021, 3, 25, 10, 1, 28, 3, 0)
>>> annee,mois,jour,heure,minute,seconde=0,1,2,3,4,5
>>> ds3231.get_time()[annee]
2021
>>> ds3231.get_time()[jour]
25
>>> ds3231.get_time()[mois]
3
On peut alors facilement réaliser réveil, horloge, etc.
Info
Le module restera à priori à l'heure même si il n'est plus utilisé pendant un certain temps, etc. C'est le principe de la pile sur le module qui sauvegarde l'heure même hors utilisation.