MicroPython: pilote pour l'horloge RTC PCF8523

Bonjour à tous,

Ayant pour idée de réaliser une petite horloge avec la PYBStick et une matrice en CharliePlexing. C'est que je n'aime pas la lumière durant la nuit mais désire parfois savoir quelle heure il est! Tapoter sur un reveil qui s'allume faiblement pendant 10 secondes ferait mon bonheur... et si cela ne coûtait pas trop cher ce serait vraiment cool.

Seulement voila, toutes les plateformes MicroPython ne sont pas sur le même pied face à l'horloge temps réel (dite RTC).
  • Certaines n'ont pas de RTC
  • D'autres ont des RTC avec une dérive de plusieurs secondes par jours
  • Les plateformes les plus chères dispose d'une RTC bien calibrée.

PCF8523 - Horloge temps réel

Le PCF8523 de NXP est très populaire. Il est maintenant très facile d'en trouver sous forme de Breakout.
Adafruit AdaLogger FeatherWing (PCF8523) et PiRTC (PCF8523)

Je me suis donc mis en tête de faire un backport du pilote PCF8523 CircuitPython vers MicroPython.

J'ai par ailleurs apporté des améliorations puisque le PCF8523 dispose d'une option de gestion d'alarme, répétitive ou non, avec statut alarme logiciel ou matériel (broche d'interruption).
Cette section du pilote à été entièrement réécrite pour pouvoir exploiter pleinement la fonctionnalité d'alarme.

Activer la broche d'interruption sur Alarme permet d'activer un microcontrôleur a intervalle régulier (toutes les heures, tous les jours, tous les lundi, tous les samedi, ...). De quoi permettre la mise en place de projets de collectes de données fonctionnant seul sur de très lonnngues périodes.

Bancher

N'ayant qu'un Adafruit AdaLogger FeatherWing dans mon matériel perso, c'est ce dernier que j'ai utilisé pour tester la bibliothèque.

Tester

La lecture de l'heure sur la RTC est trivial:
from machine import I2C
from pcf8523 import PCF8523
import time

# PYBStick - S3=sda, S5scl
i2c = I2C(1)
rtc = PCF8523( i2c )
_time = rtc.datetime
print( "Time: %s secs" % _time )
# Transformer en annee, mois, jour, heure, min, .... )
_tuple =
time.localtime(_time)
print( "Year: %s, month: %s, day: %s, hour: %s, min: %s, sec: %s, weekday: %s, yearday: %s" % _tuple ) # 0 = Lundi ... 6 = Dimanche days = ['lundi','mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimancge' ] weekday = time.localtime(_time)[6] print( 'Day of week: %s' % days[weekday] )
y

Tester l'alarme

Le plus intéressant c'est encore la gestion de l'alarme.
L'exemple ci-dessous, place une alarme toutes les heures... la minute choisie est justement l'heure de démarrage du script + 1minutes (pour ne pas devoir attendre)
from machine import I2C
from pcf8523 import PCF8523
import time

# PYBStick - S3=sda, S5=scl
i2c = I2C(1)
rtc = PCF8523( i2c )
now = rtc.datetime
# Calculer l'alarme 1 minute dans le future
alarm_time = now + 60
alarm_tuple = time.localtime(alarm_time) # année, mois, jour, heure, min, sec, jour_de_le_semaine, jour_de_l_annee
alarm_minutes = alarm_tuple[4]

# Activer l'alarme pour déclenchement toutes les heures et <alarm_min>
rtc.alarm_weekday( enable=False )
rtc.alarm_day    ( enable=False )
rtc.alarm_hour   ( enable=False )
rtc.alarm_min( alarm_minutes, True )

# Attendre les alarmes et afficher un message
counter = 0
while True:
	counter += 1
	print('Test alarme, pass %i' % counter )
	if rtc.alarm_status:              # Vérifier le statut de l'alarme
		print( "Alarm catched!")  # Alarme capturee
		print( "Tuuut Tuuut Tuuut Tuuut Tuuut Tuuut")
		print( "Reset alarm status ")
		rtc.alarm_status = False  # désactive l'alarme
	time.sleep( 10 )                  # attendre 10 secondes

Ressource

Envie d'en savoir plus? Voyez le dépôt du pilote MicroPython pour le PCF8523 ainsi que nos autres dépôts.
MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible. 

SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Aucun commentaire