Dernière mise à jour :
14/07/2026
Présentation
Non, cette horloge n'a pas de chiffre (sauf si on l'équipe de l'option affichage LCD).
Et non, malgré
son grand cercle
de 60 points lumineux, ce n'est pas une Gorgy...
Je
dois reconnaître que ce projet est le fruit d'une pensée rapide,
incongrue, inattendue et sans doute un poil surnaturelle, en tout cas
peu adapté à l'apprentissage de l'heure aux jeunes enfants.
Contrairement
à la célèbre Gorgy qui équipe nombre de studios d'enregistrement,
hopitaux, gares ou
écoles (mais pas que), on ne
trouve pas dans mon horloge 005 les 12 LED marquant les heures
associées aux 60 LED indiquant les minutes. Bizarre non ? Alors comment
indiquer les heures ? Tout simplement par un changement de couleur et
de luminosité des
LED ! Le petit plus ? L'utilisateur peut choisir
l'apparence générale : mode point (
point),
mode ruban (
bar)
ou mode plein (
full),
avec ou sans marquage des
12 divisions horaires et avec ou sans marquage des secondes. Choix
également de la manière dont apparaîssent les points
lumineux
pour les secondes, les minutes et les
heures... Envie d'en savoir plus ?
Avertissement
Ce projet a fait l'objet d'un dépôt de paternité auprès de Copyright
France.
Principe de fonctionnement
Avant
de foncer tête baissée sur le schéma, essayons de "visualiser" la
manière dont fonctionne cette horloge. Chacune des soixante LED peut
prendre
plusieurs couleurs (mais une seule à la fois s'il vous plaît, c'est
déjà assez compliqué comme ça) :
- couleur #1 (cl_H) : LED des heures (une ou
plusieurs LED, selon mode d'affichage choisi)
- couleur #2 (cl_M) : LED des
minutes (une ou plusieurs LED, selon mode d'affichage choisi)
- couleur #3 (cl_S) : LED des
secondes (une seule LED)
- couleur #4 (cl_HM) : LED
coincidence heures / minutes (une ou plusieurs LED, selon mode
d'affichage choisi) - Nota
1
- couleur #5 (cl_HS) : LED coincidence heures /
secondes (une seule LED)
- couleur #6 (cl_MS) : LED coincidence minutes / secondes
(une seule LED)
- couleur #7 (cl_MK) : LED marqueur d'heure (12 LED)
- couleur #8 (cl_BG) : LED "inactives" (couleur de
fond)
Nota 1
: la durée de coincidence heures/minutes étant longue (1 minute) la LED
qui affiche en même temps l'heure et les minutes peut (au choix de
l'utilisateur) rester fixe avec une couleur particulière,
ou clignoter alternativement entre "couleur heures" et
"couleur
minutes".
Quatre modes d'affichage sont possibles :
- Mode
Point (Point)
: 3 LED au maximum peuvent être allumées à un
instant donné : une
pour les heures, une pour les minutes et une pour les secondes (je suis
sûr qu'avant de lire ce dernier mot, vous l'aviez déjà deviné)
- Mode
Ruban 1 (Bar
1) : le nombre de LED allumées simultanément
dépend de l'heure
et des minutes en cours. Affichage ruban pour les minutes et
affichage point pour les heures.
- Mode Ruban 2
(Bar 2) :
le nombre de LED allumées simultanément
dépend de l'heure
et des minutes en cours. Affichage ruban pour les minutes et
affichage ruban pour les heures.
- Mode
Ruban plein
(Full) :
les 60 LED sont toujours allumées, les moins représentatives étant
moins lumineuses. Ce mode peut dans certains cas permettre de faciliter la lecture de nuit
(repérage plus aisé par référence aux 12 quartiers de minutes).
Pour
un affichage en mode "nuit", il est possible de désactiver le mouvement
des secondes. Le mode nuit peut être activé manuellement avec
un
interrupteur ou de manière automatique avec une LDR (résistance dont la
valeur ohmique dépend de la luminosité qui la frappe).
Schéma
Le circuit est piloté par un
"petit" PIC 8 bits de type 18F26K22, bon rapport qualité/prix et même
un poil luxueux dans cette application. Mais je l'aime bien ce circuit,
et puis il faut bien utiliser mon stock... de 1 pièce.
Choix des LED
J'ai
fait le choix d'utiliser 60 LED programmables WS2812 au détriment
de LED tricolores. Pour ces dernières, il
m'aurait fallu
ajouter de nombreux registres à décalage ou expandeurs
de ports. Gérer 180 sorties individuelles (avec tous les
fils que cela impliquait) me fatiguait d'avance. Avec les LED
programmables, 3 fils suffisent entre le circuit de commande et le
panneau de LED. Enfin... 4 fils en fait, car j'ai rencontré quelques
problèmes pour piloter la chaîne de 60 LED intelligentes en une seule
passe
et j'ai du me résoudre à piloter de manière séparée 2 groupes de 30
LED. Cela est d'autant plus étrange que le fabricant des WS2812 précise
dans son document technique (
datasheet)
qu'on peut chaîner jusqu'à 512 voire 1024 LED et que je pense avoir
respecté les délais du protocole (vérifications faite à l'oscilloscope
numérique). Serais-je tombé sur une mauvaise
série de LED ? Qu'importe, le surplus de travail que m'a
imposé la
gestion d'une seconde sortie de commande était supportable (pour
preuve, je suis encore en mesure de vous écrire). Pour poursuivre mes
tests, j'ai tout de même prévu les deux façons de faire : soit une
seule sortie de commande pilotant les 60 LED, soit 2 sorties
individuelles pilotant chacune 30 LED.
Transmission des données aux LED WS2812
Les
LED "intelligentes" WS2812 ne requièrent qu'un seul fil pour la
transmission des données. En l'absence d'un fil supplémentaire pour la
synchronisation des données, il n'existe qu'une seule
manière de distinguer les bits 0 des bits 1 : jouer sur la
durée des niveaux
logiques haut (1) et bas (0). Avec la LED WS2812, la distinction se
fait ainsi :
-
bit "0"
: durée niveau haut entre 0,20 us (200 ns) et 0,50 us (500 ns),
durée niveau bas entre 0,65 ms (650 ns) et 0,95 ms (950 ns)
-
bit "1"
: durée niveau haut entre 0,55 us (550 ns) et 0,85 us (850 ns),
durée niveau bas entre 0,45 ms (450 ns) et 0,75 ms (750 ns)
En prenant les valeurs extrêmes, nous avons une durée totale
pour un bit :
durée minimale bit "0" = 0,20 us (200 ns) + 0,65 ms (650 ns) =
0,85 ms (850 ns)
durée maximale bit "0" = 0,50 us (500 ns) + 0,95 ms (950 ns) = 1,45 ms
(1450 ns)
durée minimale bit "1" = 0,55 us (550 ns) + 0,45 ms (450 ns) = 1,00 ms
(1000 ns)
durée maximale bit "1" = 0,85 us (850 ns) + 0,75 ms
(750 ns) = 1,60 ms (1600 ns)
Le
bon sens impose d'utiliser une durée médiane entre valeurs minimum et
maximum spécifiées par le fabricant. J'ai pour cette raison adopté les
valeurs suivantes :
-
T0H
= première partie du bit "0" à l'état haut : durée
0,35 us (±150 ns,
soit 200 ns min et 500 ns max) - valeur effective
0,375 us /
375 ns
-
T0L
= seconde partie du bit "0" à l'état bas : durée
0,80 us (±150 ns,
soit 650 ns min et 950 ns max) - valeur effective
0,812 us /
812 ns
-
T0 =
durée totale du bit "0" = 0,35 us (350 ns) + 0,80 us (800 ns) =
1,15 us (1150
ns)
-
T1H =
première partie du bit "1" à l'état haut : durée
0,70 us (±150 ns,
soit 550 ns min et 850 ns max) - valeur effective
0,688 us /
688 ns
-
T1L
= seconde partie du bit "1" à l'état bas : durée
0,60 us (±150 ns,
soit 450 ns min et 750 ns max) - valeur effective
0,562 us /
562 ns
-
T1 =
durée totale du bit "1" = 0,70 us (700 ns) + 0,60 us (600 ns) =
1,30 us (1300 ns)
Remarque
: les valeurs effectives sont celles pouvant être obtenues dans la
pratique. Pour une fréquence d'horloge Fosc de 64 MHz (période
d'horloge Tosc de 15,625 ns). Le temps minimal d'une
instruction
(nop) est en effet de 62,5 ns (Tosc * 4) et pour cette raison, il est
impossible d'obtenir une précision temporelle inférieure à 62 ns.
Sur mon prototype, le
temps requis pour transmettre les données aux 60 LED (soit 60
* 24 bits) est de 1,7 ms. L'opération
de mise à jour complète des 60 LED étant effectuée toutes les secondes
et nécessitant moins de 2 ms, le temps restant pour
gérer sans stress les autres tâches confiées au
microcontrôleur (environ 998 ms) est amplement suffisant.
Sauvegarde de l'heure en cas d'absence secteur
Le circuit consommant une intensité de courant trop élevée
(principalement à cause des LED intelligentes) on peut
difficilement envisager une alimentation par pile, raison pour
laquelle une alimentation secteur a été prévue. Le problème
est celui qu'on connait bien avec tous les radio-réveils de base sans
pile de sauvegarde (ou pile présente, mais usée) : quand le secteur
disparaît, l'heure en cours disparaît aussi et on doit la régler à
nouveau quand le secteur revient.
Pour contrer ce problème et éviter une reconfiguration
manuelle (qui n'est tout de même pas insurmontable), il existe plusieurs solutions :
- sauvegarder l'heure dans une horloge temps réel (RTC =
Real Time Clock)
externe ou interne au PIC
- récupérer l'heure par Internet (protocole NTP,
Network Time Protocol)
Ici, la première solution a été retenue, avec une horloge RTC
externe de type PCF8583 (ou PCF8563) pouvant dialoguer sur un bus I2C et doté d'une alimentation de sauvegarde individuelle
(pile bouton CR2032). Cette option résulte du choix du PIC18F qui ne possède ni module RTC interne ni ressources
mémoire suffisantes pour intégrer une couche réseau.
Remarques :
- Au
départ et dans le but d'économiser de l'énergie, j'avais pensé
n'interroger l'horloge temps réel qu'une fois par minute ou même une
fois par heure pour resynchronisation régulière de l'heure,
l'incrémentation des secondes pouvant s'opérer avec un timer interne au
PIC. Cette idée toute légitime n'apporte toutefois pas grand bénéfice
dans le cas présent, puisqu'on doit le plus gros de la consommation
électrique à l'ensemble des LED WS2812 et non aux échanges de données
sur le bus I2C.
- Une version avec couche
réseau et NTP pourrait apparaître dans un futur proche, moyennant
l'utilisation d'un PIC un peu plus "élaboré" (horloge 005b ?).
- Le PCF8583 est obsolète, mais on le trouve encore facilement chez plusieurs revendeurs.
Réglages / configuration
Cette horloge offre de multiples réglages, comme indiqué
ci-après :
- réglage initial de l'heure - c'est la moindre des choses !
- mode d'affichage : point, ruban (1), ruban (2) ou plein
- affichage ou non des marqueurs d'heure (toutes les 5 minutes)
- affichage ou non du défilement des secondes
- choix des couleurs pour chaque mode d'affichage (8 couleurs pour chacun des 4 modes)
- activation/désactivation du mode Nuit
Pour
choisir un paramètre à modifier, presser le bouton SW1/SetNext ou
SWSetPrev
autant de fois que nécessaire jusqu'à l'affichage du paramètre en
question. Presser ensuite la touche Up ou la touche Down pou/r pouvoir
modifier
la valeur du paramètre sélectionné. Pour modifier la valeur du
paramètre actuellement sélectionné, presser le bouton SW3/Up ou
SW4/Down. Après modification de la valeur d'un
paramètre, sa sauvegarde est automatique si on presse le bouton
SW1/SetNext. Pour annuler une modification et rappeler la précédente
valeur, presser le bouton SW2/SetPrev.
Pour choisir le mode d'affichage (point, ruban ou plein), presser autant de fois que nécessaire le bouton SW5/Disp.
Réglage date / heure (Date / Time)
La date n'est affichée que sur l'écran LCD, qui reste optionnel.

Réglage du mode d'affichage
Le mode d'affichage peut être défini par navigation dans le menu LCD ou
par simple pression du bouton-poussoir SW5/Disp (ce dernier est bien
sûr plus pratique à l'usage, mais en opérant par le menu LCD, on peut
au besoin économiser un composant).
Réglage des couleurs de LED
Ajustable individuellement pour chaque mode d'affichage. Les copies
d'écran qui suivent se réfèrent au mode d'affichage "Point".
h = heures ; m = minutes ; s = secondes ; hm = heures/minutes
coincidentes ; hs = heures/secondes coincidentes ;
ms = minutes/secondes coincidentes ; bg = inactivité ; mk =
marqueur
En
cas de coincidence heures/minutes (par exemple 01h05, 03h15 ou
encore 07h35), la couleur de la LED concernée peut être d'une couleur
différente ou alterner entre couleur heures et couleur minutes. Si la
couleur choisie est le noir (RVB = 000-000-000), alors le mode
alternance est automatiquement activé pendant toute la durée de la
minute en cours. Si la couleur choisie est différente du noir (RVB
<> 000-000-000) alors l'affichage se fait avec la couleur
sélectionnée pendant toute la durée de la minute en cours.
D'une
manière générale, la couleur de la LED coincidence heures /
secondes sera la même que celle adoptée pour les
secondes. Il
en sera de même pour la couleur de la LED coincidence minutes /
secondes. Le fait de pouvoir choisir une couleur différente durant une
seconde est une forme de luxe qu'on peut se permettre. Par les temps
qui courent, cela peut faire du bien.
Ecran LCD : visible ou caché ?
Dans
la mesure où l'écran LCD permet la configuration de l'horloge, on
imagine mal pouvoir s'en passer. Mais cet écran peut très bien
être caché et ne servir à rien d'autre qu'à la configuration générale.
En d'autres termes, à vous de décider si cet écran doit ou non être
placé au centre des 60 LED une fois que tout est configuré et fonctionne comme attendu.
Programmation PIC et option Tx/Rx
De
manière totalement optionnelle, le PIC peut recevoir (Rx) ou émettre
(Tx) des données horaires ou des alarmes. Comme les broches du PIC
réservées pour les fonctions Tx et Rx du module UART interne au PIC
sont "partagées" avec les broches de programmation PGC et PGD, j'ai
ajouté deux cavaliers (JP1 et JP2) permettant de passer manuellement du
mode "programmation ICSP" au mode "transmission Tx/Rx".
Pour l'heure, les fonctions Tx et Rx ne sont pas implémentées.
Prototype
J'ai acquis deux ensembles de LED WS2812 "60 points" :
- un premier ensemble composé de 4 quarts de cerches (15 LED chacun)
- un second ensemble composé d'un cercle unique de 60 LED.
Mais
avant de faire travailler ces jolis anneaux de 60 points lumineux, j'ai
effectué les premiers tests avec un nombre inférieur de LED...
Barre de 8 points et anneau de 24 points (tests préliminaires)
Mes
premiers tests ont été réalisés avec un module rectiligne de 8 LED
WS2812, puis ensuite avec un module circulaire de 24 LED WS2812.
Pourquoi pas directement avec un anneau de 60 LED ? Uniquement pour une
question de consommation électrique. Ne sachant pas si mon code
logiciel était correct, il n'était pas improbable qu'une partie ou la
totalité des LED s'allument "plein feu". Etant en pleine période
de canicule, inutile d'ajouter des calories dans la pièce quand on peut
l'éviter...
J'ai
bien fait de limiter le nombre de LED pour les tests préliminaires. Mon
code comportait plusieurs erreurs et si les LED s'allumaient
au bon endroit, ce n'était ni avec la bonne couleur ni avec la bonne
luminosité. Eclairage éblouissant (pas terrible pour une horloge,
surtout la nuit) et consommation électrique excessive. J'ai vite trouvé
l'erreur : simple inversion de l'ordre des bits dans l'envoi des trames
de données
(envoi des bits de poids faible en premier alors qu'il fallait
envoyer les bits de poids fort en premier) et en plus, mauvais ordre
RGB.
Remarque
: circuit de sauvegarde de l'heure PCF8583 pas implanté pour ces
premiers tests, j'ai utilisé un des timers du PIC configuré à 1 ms
pour cadencer l'ensemble (demi-seconde et seconde).
Tout est donc OK désormais pour couleurs et luminosité, voici maintenant la suite des tests avec anneaux de 60 LED.
Anneau de 60 points
Avec
ce module unique de 60 points, seule la
commande 1 sortie (L00)
est exploitable si on ne veut pas couper le cercle en deux (c'est
peut-être faisable, mais je ne prendrai pas le risque de le faire). Les
photos qui suivent montre quelques exemples d'affichage en mode point
ou ruban, éclairement fort ou faible.
Cela fonctionne comme attendu, après débogage suite problèmes rencontrés avec les premiers tests décrits ci-devant.
La
seule chose qui me chagrine est le degré de luminosité trop élevé des
LED, même quand toutes les valeurs R, G et B sont à leur valeur
minimales (valeur de 1 sur échelle de 255 niveaux). Certes, ces LED qui
réclament une tension de 5 V peuvent être sous-alimentées. Le PIC, l'horloge PCF8583 et
les LED WS2812 fonctionnent correctement sous une tension de 3,3 V
et la consommation globale s'en trouve réduite, ce qui est très bien.
Malheureusement, mon afficheur LCD, qui répond encore aux commandes,
présente en revanche un affichage très difficile à lire sous cette très faible tension, même
après réajustement du réglage du contraste qui s'avère dans tous les
cas nécessaire.
Bien
entendu, si l'écran LCD n'est pas désiré ou si on se permet une
alimentation temporaire de 5 V le temps de la mise au point et des
réglages, alors le
point négatif évoqué ci-devant n'est plus critique du tout. Dans ce
cas, il suffit de prévoir une alimentation générale dont la tension de
sortie peut être ajustée entre 3,3 V et 5 V... rien d'insurmontable.
Anneau de 4 x 15 points
Les
4 quarts de cercles sont soit chainés 2 à 2 (une première chaine de 30 points pour les
LED00 à LED29 et une seconde chaine de 30 points pour les LED30 à LED59) soit chainés en un seul bloc de 60 points.
Les
quatre quarts de cercles disposent de points de connexion à
l'arrière, entrée des données d'un côté et sortie des données
de
l'autre :
Les quatre portions de cercles peuvent être raccordées au module de commande de deux façons différentes :
- soit 1 sortie de commande (L00) pilotant les 60 LED
- soit 2 sorties de commande individuelles (L00 et L30) pilotant chacune 30 LED
Pour mes tests, j'ai opéré en un seul bloc de 60 points et cela fonctionne bien.
Le rendu est similaire à celui obtenu avec le premier anneau de 60 LED, ce qui ne me surprend pas trop...
La troisième photo ci-devant met en évidence la faible différence de
diamètre entre les deux anneaux de 60 LED que j'ai testés, ces diamètres sont majoritairement imposés par
la
taille des LED elles-mêmes et du circuit imprimé qui les supportent. En voyant cette photo, je ne peux
m'empêcher de penser qu'il me faudra un jour regarder ce que donnerait
la mise en service des deux anneaux de 60 LED. Dans ce domaine, tout
est permis, n'est-ce pas ? Mais avant, il me faudra bien sûr trouver un
support ou un cadre pour positionner l'anneau de 60 points lumineux, en
vue d'un rendu plus esthétique que ne l'est ce prototype volant.
Les quatrième
et cinquième photos quant à elles montrent le rendu obtenu avec
les LED
recouvertes par un élément translucide (ici une feuille de papier
calque, cause du flou). On peut constater deux choses sur ces photos :
premièrement, il est possible d'afficher les marques des
heures sur les parties pleines
(rubans) des heures et des minutes, ce qui, il faut bien le dire, rend
moins confus la lecture des minutes. Deuxièmement, la philosophie
d'affichage heures/minutes est un peu particulière dans ce mode de
fonctionnement, puisque la place des deux rubans lumineux heures et
minutes
dépend de "l'ordre" des deux unités HH et MM (position LED max heure
inférieure ou
supérieure à position LED max minutes, par exemple 02h17 - heures avant
minutes - ou 07h14 - minutes avant heures). C'est bien sûr un mode de
visualisation
horaire peu commun, l'idée est justement de sortir des sentiers battus.
Quand on n'est pas habitué, quelques lectures de l'horloge à quelques
minutes d'intervale suffit pour comprendre le fonctionnement de la
bête.
Circuit imprimé
Réalisé en double face sur un PCB de 1 dm².
L'ensemble
des composants requis (processeur et horloge RTC) est regroupé sur la partie supérieure du PCB. La partie
inférieure est réservée au placement d'un module d'affichage LCD
de type 2x20 caractères ou 4x20 caractères (dont seules les deux
premières lignes sont utilisées). Pour une réalisation finale
"professionnelle" avec l'option écran LCD, il conviendait de fabriquer
deux circuits imprimés : un premier pour le module de commande (fixé à
l'arrière) et un second pour l'afficheur LCD seul (placé devant au
centre des 60 LED).
Logiciel du PIC
Pro - Version complète non
disponible en libre service.
Free - Une version allégée
LE (couleurs et luminosités non ajustables) sera prochainement mise à disposition en libre service.
Historique
14/07/2026
- Ajout photos prototype testé avec les deux anneaux de 60 LED (modèle 1 bloc unique 60 LED et modèle 4 quarts de cercle).
12/07/2026
- Ajout photos prototype (tests préliminaires réalisés avec succès, suite au prochain numéro).
-
[PCB] Ajout liaisons alim rétroéclairage broches 15 et 16 de
l'afficheur LCD, que j'avais oubliées (ajoutées en fils volants sur mon
proto).
28/06/2026
- Ajout dessin de circuit imprimé (PCB).
08/03/2026
- Première mise à disposition.