Techniquement, il n'y a rien de bien sorcier : une Arduino lit le temps sur une horloge externe et l'affiche sur une matrice de 8x6 LEDs colorées pour les heures, minutes, secondes et une barette de chiffres pour la date. Une dernière ligne de LEDs figure un balancier.

Lire l'heure

termine_expl.jpg

A première vue, la lecture de l'heure est assez mystérieuse ! Mais c'est plus simple qu'il n'y paraît, ça se lit à peu près comme sur un cadran d'horloge.

Les heures

Les 6 premières LEDs des deux premières lignes (les rouges) figurent les heures, de 1 à 12. Les deux dernières LEDs de chaque ligne affichent respectivement PM (jaunes) ou AM (bleues).

Les minutes et secondes

Les minutes sont affichées sur 2 lignes.

Les 6 premières LEDs des deux lignes (violettes) figurent les minutes x5. Les LEDs de droite (roses) figurent des minutes simples, de 1 à 4. Quand 4 LEDs roses sont allumées, à la cinquième elles disparaissent, une LED "x5" supplémentaire s'allume et le cycle recommence.

Les secondes se lisent exactement de la même manière, avec des LEDs vert foncé et vert clair.

Ainsi sur la photo, il est 10 h 23 min 42 s PM:

  • 10 LEDs rouges : 10h, LEDs jaunes : PM
  • 4 LEDs violettes et 3 LEDs roses : 4x5 + 3 = 23 minutes
  • 8 LEDs vert foncé + 2 vert clair = 8x5 +2 = 42 secondes
La date

La lecture de la date est moins mystérieuse, c'est juste jours mois années.

Le balancier

Dernière touche, la ligne de LEDs inférieure figure un "balancier" et fait l'aller-retour en 10 secondes, arrivant à une extrémité quand les secondes-unités sont pleines.

Le son

Pour donner un peu plus de vie à l'ensemble, j'y ai ajouté du son.

La sonnerie

Comme une comtoise, l'horloge sonne les heures (un coup par heure) et les demi-heures (un coup). En me basant sur ce tutoriel j'ai samplé mon horloge comtoise, converti l'enregistrement en mp3 à 16 kb/s à 8 kHz en 8 bits et enregistré le tout dans l'Arduino. Au début ça donnait un son affreusement aigrelet, jusqu'à ce que l'Arduino, au hasard d'un essai, décide de jouer l’enregistrement au ralenti, donnant un son bien plus grave et doux. C'était parfait!

Vous pouvez l’entendre sonner 8 heures :

Fichier audio intégré
Joyeux anniversaire !

Profitant de l'ajout du haut-parleur, j'ai intégré une routine qui joue la mélodie "Joyeux anniversaire" à 8h, 12h30 et 19h30 les jours d'anniversaire des membres de la famille.

Pour générer la mélodie je me suis basé sur ce tutoriel en convertissant le fichier de notes en notation française.

Le réglage

boutons.jpg.JPGLe réglage est fort simple : un bouton Mode (M) passe d'une unité à l'autre, les boutons + et - permettent de régler l'unité. Le réglage des secondes les remet simplement à zéro. L'unité sélectionnée n'est mise à jour que si elle a été modifiée, sinon elle est laissée telle quelle.

Le bouton "QuickFix" (QF) se contente de remettre les secondes à zéro en arrondissant à la minute la plus proche. Cela permet de corriger très simplement la dérive en recalant l'horloge sur une source externe (horloge parlante ou radiopilotée, tops de France Inter...)

La réalisation

L'horloge externe

Pour donner le temps à l'Arduino j'ai opté pour une horloge externe et non sur la fonction millis() de l'Arduino. Cette dernière se contente en effet de compter les millisecondes depuis le dernier reset de la carte, elle ne permet donc pas de conserver l'heure de manière fiable.

J'ai choisi le module ChronoDot, une horloge basée sur un circuit DS3231SN très précis car compensé pour les variations de température ce qui limite sa dérive à moins d'une minute par an. Elle est de plus dotée d'une pile qui conserve l'heure pendant 5 à 8 ans.

Il se connecte à l'Arduino sur les pins analogiques 4 et 5 (protocole I2C).

L'affichage

L'affichage est réalisé à l'aide de deux circuits MAX7219 qui pilotent la matrice de LEDs pour l'un et les 8 chiffres pour l'autre.

La matrice de LEDs

danslaboite.JPG

Pour s'intégrer au Mac Mini, il me fallait une matrice de LEDs sur mesure. Je l'ai donc faite moi-même.

Je me suis basé sur ce tutoriel relatif au circuit de pilotage MAX7219 qui montre comment connecter ce dernier ainsi que le schéma d'une matrice compatible d'une part, et cette page qui montre l'opération en photo d'autre part. J'ai juste mis les diodes à l'envers par rapport aux photos (inversion cathode - anode) pour correspondre au schéma du circuit MAX7219.

Un MAX7219 peut piloter une matrice de 8x8 LEDs maximum.

L'affichage numérique

Un affichage numérique n'est ni plus ni moins qu'une matrice de LEDs arrangée de manière à former des chiffres. Un MAX7219 peut en piloter jusqu'à 8, chaque chiffre utilisant 8 LEDs (7 pour le chiffre et un point).

afficheurs.jpg

Pour cela, il faut relier les afficheurs en série pin par pin en faisant attention à connecter les bons segments entre eux. Comme le laisse entrevoir la photo, ce n'est pas une mince affaire... Mieux vaut avoir des fils très souples et un fer à souder fin.

Les circuits de pilotage

max7219.JPG

Les deux MAX7219 sont montés en parallèle conformément au tutoriel ci-dessus.

L'alimentation de l'afficheur est assurée indépendamment de l'Arduino vu l'intensité nécessaire. J'ai opté pour un circuit L7805 qui donne du 5v régulé et est plus simple à câbler que le LM317 que j'utilise d'habitude.

La coloration de l'affichage

plakatrou.JPGMettre des LEDs de couleur et donc d'intensités différentes dans une même matrice n'est pas une très bonne idée. La coloration de l'affichage est donc faite par une plaque percée de trous sur laquelle sont collés des morceaux de plastique transparent. J'ai acheté des protège-cahiers et joué sur les épaisseurs, les mélanges... jusqu'à obtenir quelque chose d'esthétique et lisible.

L'intensité automatique

La nuit, l'ensemble est vraiment très brillant. Pour y remédier une photorésistance mesure la lumière ambiante et ajuste l'intensité en fonction.

Le haut-parleur

carte_son_p.jpgJ'avais dans mes stocks le haut parleur idéal pour l'opération : petit et assez plat, 8 ohms d'impédance et 5v de tension d'alimentation.

Le tout premier essai en suivant les instructions classiques, à savoir le haut-parleur connecté directement à un pin et à la masse de l'Arduino via une résistance de 100 ohms, donnait un son très très faible. J'ai rajouté un mini-amplificateur réalisé à l'aide d'un Mosfet, d'un potentiomètre pour régler le volume et d'un condensateur pour filtrer les craquements, le tout calibré strictement au pif. Le potentiomètre chauffe un peu mais il n'est sollicité au maximum que 12 secondes et une fois par heure, ce n'est donc pas gênant.

L'ampli est alimenté en 5v par son propre L7805. J'ai tenté de me brancher sur celui qui alimente les LEDs mais ça bloquait l'affichage de ces dernières.

Au final le son est beaucoup plus audible sans perdre de qualité.

afermer2-p.jpg

Voici tous les éléments connectés dans le boîtier, prêts à fonctionner!

L'alimentation

Compte tenu de la puissance demandée (dans les 500mW soit 2,5A) pas question d'alimenter ça par piles! L'alimentation est assurée par un transformateur 9V.

Derniers bugs

L'horloge a un souci récurrent d'affichage, sans doute à cause d'un parasitage auquel les MAX7219 semblent très sensibles. Il arrive que l'affichage de la matrice de LEDS disparaisse en tout ou partie, parfois à l'occasion d'une sonnerie. Je dois alors réinitialiser l'Arduino (ce qui fait que j'ai été bien inspiré de déporter le bouton reset à l'extérieur du boîtier).

J'ai notablement amoindri le phénomène en ajoutant un condensateur de 100µF au niveau de l'alimentation mais ce n'est pas encore totalement satisfaisant.

EDIT : j'ai finalement trouvé la source des problèmes ! Il s'agissait simplement d'un MAX7219 défectueux suite à une fausse manip. Je l'ai changé et tout est rentré dans l'ordre.

Le code

Comme celui-ci est assez long et comprend deux fichiers, je vous propose de le télécharger sous forme de fichier Zip.

Il fait appel aux librairies Chronodot, LedControl, Wire et Bounce (ces deux dernières sont incluses dans l'IDE Arduino).