Electronique > Réalisations > Affichage / Mesure > Horloge 005 - Pro

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...

horloge_005_scr_001m  horloge_005_pcb_3d_top  horloge_005_scr_001n  horloge_005_scr_001o  horloge_005_scr_001p  

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) :
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 :

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.

electronique_horloge_005


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

   
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.

005_lcd_setdate_day 005_lcd_setdate_mth005_lcd_setdate_yer
horloge_005_lcd_settime_hrs horloge_005_lcd_settime_min horloge_005_lcd_settime_sec 
   
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).
 
horloge_005_lcd_setdispmode_point horloge_005_lcd_setdispmode_bar1 horloge_005_lcd_setdispmode_bar2 horloge_005_lcd_setdispmode_full
horloge_005_scr_002a horloge_005_scr_002b horloge_005_scr_002c horloge_005_scr_002d 

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
   
horloge_005_lcd_setcolor_point_bg horloge_005_lcd_setcolor_point_h horloge_005_lcd_setcolor_point_m horloge_005_lcd_setcolor_point_s
horloge_005_lcd_setcolor_point_mk horloge_005_lcd_setcolor_point_hm horloge_005_lcd_setcolor_point_hs horloge_005_lcd_setcolor_point_ms 
   
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...
   
horloge_005_proto_rm_001d horloge_005_proto_rm_001e horloge_005_proto_rm_001f horloge_005_proto_rm_001g horloge_005_proto_rm_001h horloge_005_proto_rm_001j
   
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.

horloge_005_proto_rm_001ma horloge_005_proto_rm_001mb horloge_005_proto_rm_001mc horloge_005_proto_rm_001md horloge_005_proto_rm_001me

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.
   
horloge_005_proto_rm_001a horloge_005_proto_rm_001b
   
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 :
   
horloge_005_proto_rm_001c horloge_005_proto_rm_001c2 horloge_005_proto_rm_001c3 
   
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.

horloge_005_proto_rm_001na horloge_005_proto_rm_001nc horloge_005_proto_rm_001nd

Le rendu est similaire à celui obtenu avec le premier anneau de 60 LED, ce qui ne me surprend pas trop...

horloge_005_proto_rm_001ne horloge_005_proto_rm_001nf horloge_005_proto_rm_001ng horloge_005_proto_rm_001nj horloge_005_proto_rm_001nk

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². 

horloge_005_pcb_components_top

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.