Skip to content

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.