Time et RTC

Ce que l'on va faire ici

Ici, nous allons voir comment utiliser le RTC de la pyboard.

ATTENTION : bien que l'on parle de RTC (Horloge Temps Réel), celle-ci se réinitialise et repasse à une valeur par défaut (1er Janvier 2014 dans mon cas) dès que la carte est mise hors tension. Par contre, un reset ne réinitialise pas la RTC.

La RTC de la pyboard suppose une initialisation : je vous propose ici un petit script qui permet de le faire à partir du à partir duquel on programme la carte. Une alternative possible est l'accès à un serveur ntp si la carte a un accès réseau. Une autre alternative est de récupérer l'heure à partir d'un module GPS utilisé avec la carte si on est dans ce cas.

Classe RTC

Le module pyboard dispose d'une classe RTC qui donne accès à l'horloge temps réel de la carte. La doc est ici : http://docs.micropython.org/en/latest/pyboard/library/pyb.RTC.html

Module time

Micropython intègre également une version allégée du module time, module généraliste qui donne accès aux informations de temps du système. Voir la doc ici :

Exemple

Voici un petit script qui teste çà :

import pyb
import time

# sur la pyboard, on dispose de RTC qui permet mémorisation date une fois réglé et tant que alim. 

rtc=pyb.RTC() # création objet RTC

# utilisation des fonctions de l'objet RTC
print (rtc.datetime()) # (year, month, day, weekday, hours, minutes, seconds, subseconds)

#rtc.datetime((2017,9,22,4,18,39,4,0))
#print(rtc.datetime())

while True :
    print (str(rtc.datetime()[4]),':',str(rtc.datetime()[5]),':',str(rtc.datetime()[6]))) # affiche hh:mm:ss 
    pyb.delay(1000)

### Option 2 : le module time fournit des fonctions "générales" concernant le temps mais ne permet pas de régler date/heure
print (time.localtime())

Mettre à jour automatiquement l'heure de la pyboard à partir du système

Trouvant assez peu pratique le fait de devoir fixer manuellement, j'ai eu envie de pouvoir mettre facilement la pyboard à l'heure du système sur lequel on travaille. C'est ici qu'intervient le fameux script pyboard.py : ce script que l'on utilise pour envoyer un script depuis le système vers la carte, permet en fait à partir d'un code Python exécuté sur le système d'envoyer des instructions à l'interpréteur micropython. C'est tout simplement "énorme" cette possibilité...

Bref, du coup ici, j'ai écrit un code Python "classique" exécuté sur le système qui utilise le module datetime pour obtenir l'heure courante du système et l'utilise pour configurer la RTC de la carte avec la valeur obtenue... That's it !

Et Geany est ici notre ami car il permet de configurer 2 commande construction différentes : il suffit donc ici d'en définir une pour Python3 et une pour micropython. Ici, on utilisera la commande Python3 du coup.

ATTENTION : CE CODE EST UN CODE PYTHON "CLASSIQUE", pas un code micropython

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# script pour initialiser la RTC de la pyboard - à exécuter en Python 3
# par X. HINAULT - 2017 - www.mon-fablab.fr 

import pyboard 

from datetime import datetime

print(datetime.now())

# construction de la chaine initialisation datetime à partir système
#(year, month, day, weekday, hours, minutes, seconds, subseconds) 
dt=(str(datetime.now().year)+','
+str(datetime.now().month)+','
+str(datetime.now().day)+','
+str(datetime.now().weekday())+','
+str(datetime.now().hour)+','
+str(datetime.now().minute)+','
+str(datetime.now().second)+','
+str(0)
)

print ('Date : ' + dt)
# voir aussi https://pypi.python.org/pypi/ntplib/

pyb = pyboard.Pyboard('/dev/ttyACM3') # port de connexion 

pyb.enter_raw_repl()

""" # test
pyb.exec('from upyduino import *') # exec_ pour python2
pyb.exec('pinMode(0,OUTPUT)')
pyb.exec('digitalWrite(0, HIGH)')
"""

pyb.exec('import pyb') # exec
pyb.exec('rtc=pyb.RTC()') # exec
pyb.exec('rtc.datetime(('+dt+'))') # exec -dt est un tuple

pyb.exit_raw_repl()

Ce principe d'accès à l'interpréteur micropython à partir de Python système est en fait un mécanisme assez général qui sera intéressant à chaque fois que l'on aura besoin d'automatiser des tâches sur la carte micropython.