Les Dominos donnent l'heure ...
L'heure du Wi-Fi affichée comme les dominos !
Bizarre, bizarre ce mode d'affichage de l'heure qui ressemble aux points qu'il y a sur les dominos . Elle est belle, elle donne l'heure, elle change de couleur, voici une pendule qui va rendre jaloux le coq de Nougaro... Et il n'y a même pas à s'en occuper; une fois qu'elle a trouvée le Wi-Fi de la maison, elle reste tip-top à la seconde comme disent les Suisses devant leur coucou, et ad vitam eternam comme disaient les Romains devant leur cadran solaire. Pour ceux qui suivent mes publications, elle est issue de la conjugaison de mes deux derniers postes, à savoir "Les Dés Gagnants" et" Une Horloge Approximative " qui sont la combinaison d'un affichage par panneau de 64 pixels sur la base des trois couleurs fondamentales (Rouge, Vert, Bleu) se mélangeant à l'infini (ou presque) pour générer une multitude de teintes, et l'extraction des chaînes Heures, Minutes dans une trame Wi-Fi ...
Pour changer, on commence par le matériel :
La famille de panneaux lumineux WS2812 de 8x8 est une source de lumière à LED intelligente, dont le circuit de commande et la puce RVB sont intégrés dans le package des composants. Il comprend un latch des données sur le port numérique et assure simplement la gestion de la couleur et de la lumière, pixel par pixel. Le protocole de transfert de données utilise une seule ligne de communication.
Une résistance CMS 1206 de 470 ohms pour la transmission des datas sur le bus .C'est une préconisation constructeur afin de garantir que la tension des données sur le bus 1 fil, référencée à la masse, ne soit jamais supérieure à celle de l'alimentation ... on peu prendre un composant traversant pour vider un peu les fonds de tiroirs, mais une CMS de 1206 ou autre, fait aussi bien l'affaire.
Une résistance CMS 1206 de 1 Mégohm pour l'option (non montée pour moi) du réglage automatique de luminosité afin de faire une variation potentiométrique avec une LDR sur une entrée analogique du microcontrôleur ... Mon système logiciel, évoqué dans le sketch ci-dessous, fonctionne bien mieux !
Deux condensateurs électrochimiques de 220 µF / 16 ou 25 volts : Un est placé au plus près des lignes d'alimentation du pavé de pixel, pour absorber les transitoires engendrées par des appels de courants dues à l'allumage de plusieurs leds , ou à leur extinction (pour analogie avec l'hydraulique => un anti coup de bélier) .
Le deuxième est sur le 5 volts en entrée, et sert à nettoyer et retaper l'alimentation de l'ensemble, au cas où c'est une prise USB qui s'affranchie de cette tâche.
Le dernier composant, et le plus important, est un circuit ESP32 - 38 broches ! Un 32 pins est largement suffisant, mais j'ai pris ce que j'avais ! On peut le remplacer, même si le soft reste le même, ça va imposer une reprise du circuit imprimé car l'ordre des connexions n'est pas identique . Ce circuit ESP32 intègre déjà antenne RF, ainsi qu'un amplificateur de puissance, amplificateur à faible bruit, des filtres, et le module de gestion de l'alimentation. Avec une très petite surface de circuit imprimé, cette carte utilise des puces Wi-Fi et Bluetooth à double modes en 2.4 GHz par la technologie TSMC 40nm de faible puissance, qui avec les meilleures propriétés RF , en fait un produit sûr, fiable et évolutif dans une variété d'applications.
C'est tout ! il n'y a que çà ! Eh bien on va pouvoir jeter un coup d'oeil au schéma ....
Le Schéma :
Pas de surprise sur le schéma... L'alimentation arrive directement sur un condensateur électrochimique de 220 à 470 µF / 16 à 25 volts (C2) qui est là comme tampon, pour "redynamiser" ce qui vient de la source, puis elle est appliquée directement sur les bornes 5V et GND de l' ESP32, ainsi que sur le panneau de pixels, avec C1 de 100µF qui va supprimer les transitoires de commutations afin que les éléments ne se perturbent pas entre eux ... La sortie de commande 'One Wire' des DATAs passe par une résistance (R1) de 470 Ohms avant d'aller sur l'entrée Din de l'afficheur; les trames envoyées par le micro contrôleur doivent être calibrées dans le temps en fonction de la rapidité d'exécution des pas, par le cadencement du quartz horloge du pavé qui a la charge de gérer tout ça ... Une ligne dans le programme s'en charge, grâce à la souplesse de la bibliothèque Adafruit prévue en complément de fonction ...
Sur le schéma, j'ai également inclus la possibilité de faire un réglage automatique de la luminosité par une LDR ... ça ne sert à rien, car l'artifice logiciel que j'ai utilisé est beaucoup plus efficace ! J'ai également prévu une entrée pour un bouton capacitif mais je ne l'ai pas utilisée... Je l'ai mise au cas où l'on désire étendre les fonctions de l'affichage comme par exemple changer les couleurs de l'éclairage (Moi, je les aime toutes !).
Le Circuit Imprimé :
A la vue de la simplicité du schéma, il n'est pas du tout obligatoire; J'en ai fais un pour immobiliser les composants, mais si on le souhaite, on peut souder les fils et le peu d'accastillage directement sur les trous ou les pins de ESP32 ... C'est un (très) simple face sur lequel j'ai ajouté des connecteurs JST XH2.54 pour donner un aspect et permettre le raccordement ou la séparation facilement. Je n'ai soudé que les pins utilisées, et les quatre coins du circuit ESP; ce n'est pas que pour les économies, c'est surtout, si un jour je dois le remplacer comme il n'est pas sur support, il sera plus facile à ôter .
Une erreur que j'ai faite et qui est flagrante sur le tracé du circuit : J'ai prolongé le plan de masse, jusque sous l'antenne WiFi .... Grrrrr ! ça réduit la portée, lors de la synchronisation et ça en fait une antenne directive dans une direction qui n'a rien a voir avec l'endroit où se trouve la boxe ! errare humanum est ! mais je ne recommencerai pas, promis...
Le Logiciel ou sketch :
Largement commenté tout au long de son déroulement, je l'ai bien entendu élaboré avec l'IDE Arduino tellement souple et facile à utiliser ! On commence bien sûr par les déclarations des variables, sans oublier de renseigner le SSID et le mot de passe de la box, ainsi que le format des données envoyées au panneau d'affichage.
Ne pas oublier également de régler l'offset GMT suivant le pays où l'on habite :
const long gmtOffset_sec = 3600; //Réglage de l'offset en fonction du méridien (Offset x 3600)
Ainsi que l'heure d'été ou d'hiver, si l'on subit ces changements bis-annuels :
const int daylightOffset_sec = 3600; //Commutation heure d'été (3600) et heure d'hiver (0)
Puis vient le sous programme d'extraction de l'heure dans la trame WiFi :
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
return;
}
//Affectation en variable numérique de l'extraction aux heures, minutes
HR = timeinfo.tm_hour;
MN = timeinfo.tm_min;
}
Puis la fabrication du dé, qui suivant ce qu'il devra afficher, on décale sur le panneau par la variable 'dice' qui va s'ajouter à l'emplacement de chaque pixel :
void setPixel (){
// Fabrication d'un dé en fonction des pixels et du chiffre à afficher
switch (tDigit) {
case 1:
pixels.setPixelColor((9 + dice), pixels.Color(Green,Red,Blue));
break;
case 2:
pixels.setPixelColor((2 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((16 + dice), pixels.Color(Green,Red,Blue));
break;
case 3:
pixels.setPixelColor((2 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((16 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((9 + dice), pixels.Color(Green,Red,Blue));
break;
...../.....
case 9:
pixels.setPixelColor((1 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((17 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((2 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((0 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((18 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((16 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((10 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((9 + dice), pixels.Color(Green,Red,Blue));
pixels.setPixelColor((8 + dice), pixels.Color(Green,Red,Blue));
break;
}
}
Ensuite vient le setup avec l'initialisation des séquences , pour arriver à la boucle principale, avec la création des dizaines d'heures, en divisant par dix le nombre entier des heures, puis des unités d'heures en soustrayant de l'heure, les dizaines d'heures, et conservant cette différence. Même chose pour les minutes !
void loop() {
printLocalTime();
//Calcul de séparation des unités et dizaines
DH = HR / 10;
UH = HR - (DH * 10);
DM = MN / 10;
UM = MN - (DM * 10);
Vient après l'attribution de la chrominance pour le fun et la beauté , avec une correction de la luminance par la variable 'light' qui va atténuer les brillances quand les chiffres sont forts (ex.: 6, 7, 8, 9, ) pour obtenir un équilibre et empêcher l'éblouissement .
//Limitation de la surbrillance
if ((UH > 5) or (UM > 5) or ((DM + DH) > 5)) {
light = 2;
}
else {
light = 5;
}
Green = UH * light;
Red = UM * light;
Blue = (DM + DH)* light;
pixels.clear();
Pour ceux qui se souviennent de ce que j'avais fait pour les dés gagnants, là j'ai réduit au maximum la création des points, simplement en appelant 4 fois le même sous programme et en lui affectant la valeur à traiter (dizaines d'heures, unités heures ...etc ) :
// Affectation des valeurs des dizaine, unité d'heure et minute pour créer les dés
for ( int i = 1; i<=4;i++ ){
if (i = 1){
dice = 0;
tDigit = DM;
setPixel ();
}
if (i = 2){
dice = 5;
tDigit = DH;
setPixel ();
}
if (i = 3){
dice = 40;
tDigit = UM;
setPixel ();
}
if (i = 4){
dice = 45;
tDigit = UH;
// i= 0;
setPixel ();
}
delay(10);
}
Et pour finir, je fais clignoter à 0,5 Hz les deux leds du milieu pour simuler les secondes ... J'ai choisi cette fréquence pour limiter l'agressivité d'un clignotement trop rapide ! Voilà ce qu'il en est du programme; Dans ma grande générosité je l'ai mis dans le zip ci-dessous ....
La réalisation mécanique :
J'ai repris ce que j'avais fait pour les Dés, à savoir un boîtier en 3 parties: un corp avec sa face avant translucide en macrolon, bien ajustée aux dimensions pour assurer l'étanchéité, un fond emboitable et vissé, et un pied de support légèrement incliné vers l'arrière ! Merci l'imprimante 3D, le logiciel DesignSpark Mechanical, et Repetier Host ...
Avant de faire la coulée de résine, j'ai disposé un ruban adhésif tout autour du plan de joint; puis à l'intérieur j'ai plaqué et centré le panneau de leds, ainsi que deus vis de 3x30 mm, têtes contre l'afficheur, a l'entraxe du circuit imprimé, et le tout fermement maintenu par un petit serre-joint .... J'ai préparé suffisamment de résine mais avec très peu de durcisseur pour ne pas la rendre cassante ou jaunissante avec le temps ... Une fois que c'est bien mélangé, on peut couler avec un maximum de précautions en versant jusqu'à recouvrir de 5 mm les têtes des vis . On laisse ensuite polymériser plusieurs dizaines d'heures afin que la résine acquiert sa dureté ...
Les fichiers de réalisation mécanique sont également dans le zip plus bas ...
Les fichiers pour la réalisation :
Les fichiers pour la réalisation sont dans les trois répertoires du zip ci-dessous :
- un répertoire Box où l'on trouve le boitier et le pied dans un format STL pour une impression directe ou rsdoc pour personnalisation avec designspark mechanical .
- un autre répertoire contient les fichiers de réalisation du circuit imprimé sous Eagle Autodesk ... vu la taille du circuit, la version gratuite proposée sur le site est largement opérationnelle .
- le dernier, c'est le sketch pour être téléversé par l'IDE Arduino ... Je n'ai pas joins les bibliothèques car elles sont téléchargeables sur les sites habituelles: Arduino, Adafruit, etc et ce pour limiter la place perdue chez mon hébergeur ...
Wifi clock pannel (263.52 Ko)
Et pour conclure :
Elle est belle, elle est belle, elle est belle et je l'aime ! Bravo Nanard
Ajouter un commentaire