Faire une horloge simple avec circuitPython - Niveau facile

Dans ce mini projet, nous allons construire une horloge affichant l'heure sur un écran LED à 4 chiffres. Pour simplifier le montage sur breadboard, nous utiliserons une carte Adafruit itsyBitsy M0 Express sous circuitPython. Il est tout à fait possible d'utiliser ici une carte CPX également.

Cette carte très compacte (comparable à l'arduino nano) n'en est pas moins puissante. Elle est animée par le même processeur que la carte CircuitPlaygroundeXpress. Elle n'intègre cependant qu'un nombre minimum de composants (juste une LED Neopixel et un bouton reset). Tous les composants devront être connectés via les broches d'entrées-sorties, heureusement disponibles en quantité sur la carte (autant que sur une carte Arduino).

Pour faire court, on peut assimiler cette carte à une Arduino nano à la différence que la carte Adafruit peut se programmer avec CircuitPython. C'est une solution économique pour commencer à jouer avec circuitPython puisqu'elle ne coûte qu'une dizaine d'euros.

Nous utiliserons dans ce projet un module RTC (Real Time Clock) - permettant d'avoir une heure précise et de la conserver même lorsque le projet n'est plus alimenté - ainsi qu'un afficheur LED 7 segments à 4 chiffres pour avoir un affichage bien lumineux et lisible. Ces deux modules (RTC et écran) utilisent le bus i2c, bien connu de ceux qui ont l'habitude de travailler avec des cartes Arduino car il permet de connecter à l'aide de seulement deux fils une multitude de modules et capteurs.

Matériel nécessaire pour ce projet

  • Une plaquette de prototypage (breadboard)

  • Une carte fonctionnant sur CircuitPython (ici une itsyBitsy M0, disponible en france chez mouser.fr pour 10€).

  • Un module RTC DS3231 que l'on peut trouver autour d'un euro sur Aliexpress ou sur Amazon.

  • Un écran LED 7 segments HT16K33 i2c que l'on trouve pour 3 euros sur Aliexpress ou Amazon.

Ce sont des composants de base qui pourront resservir dans de nombreux projets dès qu'une horloge ou un affichage basique est requis.

MéthodeLe câblage

Pour réaliser ce projet, les branchements sont très simples : Il suffit de connecter la broche SDA de la carte avec le SDA de l'écran et le SDA du module RTC et de faire de même avec les broches SDL. Une bonne pratique est de mettre des résistance dites de pull-up sur SDA et SCL (2 résistances de 5 kohm connectées entre SDA et VCC et entre SCL et VCC).

Relier ensuite toutes les masses (GND) entre elles : la broche G de la carte est reliée à la broche GND du module RTC ainsi qu'au GND de l'afficheur.

Pour l'alimentation, attention ! La carte itsyBitsy (comme la CPX) ne tolère que 3,3V sur ses broches d'entrée sortie. Cela tombe bien car l'écran comme le module RTC s'accomodent aussi bien du 5V d'un arduino que du 3,3V des cartes Adafruit. Il faut donc faire attention de relier l'entrée VCC du module RTC et de l'écran à la broche 3V de la carte itsyBitsy.

Attention à l'effet de perspective :

  • sur la carte itsyBitsy, le fil rouge en bas à gauche est connecté sur 3V

  • le fil bleu en haut à gauche est connecté sur G et surtout pas sur USB ! ! !

  • sur l'écran, les 4 broches sont - de la gauche vers la droite - VCC (3V) / GND / SDA / SCL

Pour mieux voir le câblage, j'ai enlevé l'écran. Celui-ci se branche tout à droite sur les 4 emplacements indiqués en vert.

Cliquez sur l'image pour agrandir.

MéthodeLe code CircuitPython

Voici maintenant le programme utilisé. J'utilise une variable booléenne sep pour gérer le clignotement du séparateur : entre heure et minutes. L'effacement du ":" est un peu tordu : le ":" s'enlève quand on affiche un entier... sauf que 0001 ne f'affichera pas 00 01 mais 1 tout court. Il faut donc ajouter les 0 manquants éventuellement.

Le réglage de l'heure de départ est faite grâce à la ligne ds3231.datetime = ... avant la boucle while. Ceci n'est à faire qu'au premier lancement car ensuite, le module RTC conservera l'heure grâce à sa pile intégrée. Il suffira donc de commenter la ligne pour les prochains lancements.

1
import board
2
import busio
3
import time
4
import adafruit_ds3231
5
from adafruit_ht16k33 import segments
6
7
i2c = busio.I2C(board.SCL, board.SDA)
8
ds3231 = adafruit_ds3231.DS3231(i2c)
9
lcd = segments.Seg7x4(i2c)
10
11
lcd.fill(0)
12
sep=False  # Clignotement du separateur HH:MM
13
14
#ds3231.datetime = time.struct_time((2019, 2, 8, 19, 06, 0, 6, 1, -1))
15
while True:
16
    maintenant = ds3231.datetime
17
    heure = "{:02}".format(maintenant.tm_hour)
18
    minute = "{:02}".format(maintenant.tm_min)
19
    if sep:
20
        lcd.print(heure+":"+minute)
21
    # else:                     # version plus simple  
22
    #   lcd.fill(0)             # mais provoque un
23
    #   lcd.print(heure+minute) # leger clignotement
24
    else:    # Version plus tordue mais clignote moins
25
        lcd.print(int(heure+minute))
26
        # On ajoute les 0 qui ont disparu
27
        if heure=="00":
28
            lcd[0]="0"
29
            lcd[1]="0"
30
            if minute[0]=="0":
31
                lcd[2]="0"
32
        elif heure[0]=="0":
33
            lcd[0]="0"
34
    sep = not sep
35
    time.sleep(0.5)

ComplémentPour aller plus loin

Une fois que cette base fonctionne, il est possible d'enrichir ce projet de multiples façons pour le rendre plus intéressant, sans pour autant se ruiner en composants supplémentaires : juste quelques boutons poussoir ... et une breadboard plus large pour loger le tout.

Il y a suffisamment de broches sur l'itsyBitsy pour ajouter plein de boutons et autant de fonctionnalités !

En ajoutant deux boutons poussoirs, on peut ajouter une fonctionnalité de remise à l'heure : un bouton pour ajouter une heure, un bouton pour ajouter une minute. Il est intéressant de gérer les appuis longs pour faire un défilement plus ou moins rapide des minutes par exemple.

On peut même imaginer utiliser un seul bouton poussoir pour la mise à l'heure en utilisant des appuis longs, des doubles clics et faisant clignoter les heures ou les minutes sur l'affichage selon ce que l'on règle.

En ajoutant toujours plus de boutons, on peut imaginer de faire un chronomètre, compte à rebours, voire réveil en ajoutant un petit buzzer.

RemarqueLien avec le programme SNT et NSI

Nous avons construit ici une base menant à la réalisation d' un projet plus complexe et plus intéressant. Cela peut tout à fait s'inscrire dans le programme NSI de première, dans la partie Architectures matérielles / Interfaces Homme-Machine (IHM) ou dans le thème Informatique embarquée et objets connectés / réalisation d'une IHM simple du programme de SNT de seconde.