L'heure et la date du Wi-Fi
Encore une Horloge ?
Etant né dans le Pays Horloger, je prends la suite de mes ancêtres, qui passaient l'hiver à construire ou réparer des horloges, puisqu'il y avait bien moins à faire dans les champs ! Et voilà la présentation de la petite dernière, qui extrait l'heure du Wi-Fi qui rôde dans toute la maison et l'écrit sur un afficheur de 4 digits de 64 leds chacun ... Mais ce n'est pas tout : toutes les minutes, elle marque aussi le jour et la date avec la précision du réseau... J'ai enfermé tous les composants et circuits électroniques dans une trousse d'écolier pour un design original de pendule de bureau bon marché et qui complète la simplicité de l'ensemble. Un autre gros avantage, c'est que les identifiants et mots de passe Wi-Fi sont écrits dans une carte micro SD, ce qui facilite la transportabilité et le changement de réseau. Un cavalier enfichable permet la correction éventuelle de la commutation heure d'été / hiver lorsque celle-ci n'est pas faite à date simultanée par le serveur.
Examinons le matériel embarqué :

La simplicité parle d'elle même ! Penchons nous sur le schéma ...
Le Schéma :

Le 5 volts d'alimentation est issu de n'importe quelle source USB ou d'un chargeur secteur de téléphone (on en a tous plein les tiroirs ) et arrive sur l'électro chimique C1 ( 33µF/16v) pour requinquer cette tension qui va d'une par sur la borne VBus du micro contrôleur et sur les pins VCC et GND de l'afficheur. Un condensateur (C2) pour le blocage des transitoires est monté vers les lignes d'alimentation du display pour nettoyer le courant . Le circuit qui supporte l'ESP32-S2 Mini met à notre disposition un petit régulateur qui fournit le 3,3 volts au micro et au support de la carte SD pour alimenter celle-ci . Le vrai bus SPI du microcontrôleur s'en va dialoguer avec la carte SD ( MOSI, MISO, CS-SD, CLK-SD) en version complète. Un autre bus est fabriqué pour piloter l'afficheur avec l'information de validation CS, une information de synchronisation CLK, et les données sur le DataIN . Le côté malin de ces afficheurs, c'est que l'on peut les prolonger en reportant les informations sur le suivant, ainsi que le DataOut sur le DataIn ... Les datasheets du MAX7219 nous expliquent très bien cela au cas où l'on serait intéressé par une prolongation de la barre d'affichage . Il n'y a rien d'autre, le reste c'est le logiciel qui s'en charge .
Le circuit imprimé:

Un grand circuit imprimé, malgré le peu de composants qu'il y a dessus. Comme il va servir de support lors de la mise en boîte, il doit dépasser les dimensions de l'afficheur. Il est réalisé sous Eagle et peut être fait par les méthodes traditionnelles à la portée de l'amateur, donc en simple face, avec un seul strap pour la continuité des masses. Le plan de masse a été volontairement interrompu sous l'antenne Wi-Fi de la platine ESP32, afin de ne pas changer la directivité ou le gain par du blindage. Le connecteur de l'afficheur est une barrette sécable femelle, coudée à 90°, soudée sur les pads côté pistes: il sert de support de ce côté et deux vis avec de petites entretoises de l'autre . Pas de difficulté pour ce câblage où tous les autres éléments sont soudés en traversant. Le lecteur de carte SD est interfacé avec des connecteurs sécables "tulipe" et des doubles pins mâle/mâle. Même montage pour le support du circuit de l'ESP32-S2, mais de par sa configuration quadruples rangées, il faut y aller avec soins et précision (Je me suis demandé si je n'allais pas souder seulement les broches utilisées ).
L'Âme de l'Horloge : le software ...
Avec les nombreux commentaires en ligne, tout est déjà décrit pas à pas
/***********************************************************************
* Programe d'horloge synchonisée Wi-Fi avec afficheurs 4 digits de *
* 8 fois 8 leds pilotées par MAX7219 asservis à un ESP32-S2 mini et *
* identification par lecture d'une SD-Card pour la transportabilité... *
* Pour en savoir plus: https://amazing-vacuum-tubes.com *
***********************************************************************/
#include <WiFi.h> // Accès Wi-Fi
#include "time.h" // Gestion du temps
#include <MAX72198by32Disp.h> // Gestion Afficheur
#include "MAX7219_Letters.h" // Et pour les lettres
#include "SD.h" // ainsi que la carte SD
// Connexion des I/Os
#define SD_CS 12
#define SPI_MOSI 11
#define SPI_MISO 9
#define SPI_SCK 7
// Declaration des variables
String ssid ; // Variables didentification de la box
String password ; // Variables du mot de passe de la box
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600; // GMT + locale ATTENTION MODIF SI AUTRE QUE LA FRANCE
int daylightOffset_sec ; // Hiver / ete
byte Pix_hour; // Variables des heures
byte Pix_min; // Variables des minutes
int Pix_sec; // Variables des secondes
int Pix_date; // Variables de la date
int Pix_day; // Variables du jour
int unit_Hour; // Variables des unites d'heures
int dix_Hour; // Variables des dizaines d'heures
int unit_Minut; // Variables des unites de minutes
int dix_Minut; // Variables des dizaines de minutes
int dix_Date; // Variables des dizaines de jour
int unit_Date; // Variables des unités de jours
int Jumper = 16; // Commutateur heure d'été / hiver
MAX72198by32Disp disp(38, 39, 40); // Connection de l'afficheur Din,CS,CLK
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
return;
}
//Affectation en variable numérique de l'extraction aux heures, minutes et secondes
Pix_hour = timeinfo.tm_hour;
Pix_min = timeinfo.tm_min;
Pix_sec = timeinfo.tm_sec;
//Affichage après mise en forme de l'heure
disp.Number(4, dix_Hour);
disp.Numberdp(3, unit_Hour);
disp.Number(2, dix_Minut);
disp.Number(1, unit_Minut);
}
void printLocalDate()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
return;
}
//Affectation en variable numérique du jour (1à7) et de la date (1 a 31)
Pix_date = timeinfo.tm_mday;
Pix_day = timeinfo.tm_wday;
// Mise en forme des unités et dizaines de jours
dix_Date = Pix_date /10;
unit_Date = Pix_date - (dix_Date * 10);
//Affichage sur les digits 1 & 2
disp.Number(2, dix_Date);
disp.Number(1, unit_Date);
//Affectation des deux premières lettres du jour (1 = Lu, 2 = Ma....)
//et affichage sur les digits 3 & 4
switch (Pix_day) {
case 0:
disp.Letter(4, D);
disp.Letter(3, i);
break;
case 1:
disp.Letter(4, L);
disp.Letter(3, u);
break;
case 2:
disp.Letter(4, M);
disp.Letter(3, a);
break;
case 3:
disp.Letter(4, M);
disp.Letter(3, e);
break;
case 4:
disp.Letter(4, J);
disp.Letter(3, e);
break;
case 5:
disp.Letter(4, V);
disp.Letter(3, e);
break;
case 6:
disp.Letter(4, S);
disp.Letter(3, a);
break;
}
delay(4000);
}
void setup()
{
// Topographie de la carte SD
pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
// Initialiser la carte SD
if (!SD.begin(SD_CS)) {
return;
}
// Lecture de l'identifiant
File ssidFile = SD.open("/ssid.txt");
// Vérifier si le fichier est ouvert
if (ssidFile) {
// Lire le contenu du fichier
String data = ssidFile.readString();
ssid = data;
// Fermer le fichier
ssidFile.close();
}
// Lecture du Mot de passe
File passwordFile = SD.open("/password.txt");
// Vérifier si le fichier est ouvert
if (passwordFile) {
// Lire le contenu du fichier
String data = passwordFile.readString();
password = data;
// Fermer le fichier
passwordFile.close();
}
// Lecture de la position du jumper été/hiver
pinMode (Jumper, INPUT_PULLUP);
digitalRead (Jumper );
if (Jumper, LOW) {
daylightOffset_sec = 3600;
} else {
daylightOffset_sec = 0;
}
//connection au WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
// initialisation afficheur
disp.Initialize(0);
delay(1000);
disp.Clear();
// afichage de l'état de la conexion WiFi (CxOk)
disp.Letter(1, k);
disp.Letter(2, O);
disp.Letter(3, x);
disp.Letter(4, C);
delay(1500);
//initialisation et emule le temps
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//deconnection WiFi car le temps est trop long
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
return;
}
// Mise en forme de l'heure & minute dizaines et unités
dix_Hour = Pix_hour /10;
unit_Hour = Pix_hour - (dix_Hour * 10);
dix_Minut = Pix_min /10;
unit_Minut = Pix_min - (dix_Minut * 10);
dix_Date = Pix_date /10;
unit_Date = Pix_date - (dix_Date * 10);
// Si les seconde sont a plus de 56 affichage du mot "Date"
if (Pix_sec > 56 ){
disp.Letter(1, e);
disp.Letter(2, t);
disp.Letter(3, a);
disp.Letter(4, D);
delay(1500);
// et on serend au sous programme d'affichage de la date
printLocalDate();
}
// on boucle sur le sous programme de l'affichage de l'heure & minutes
printLocalTime();
delay(1000);
}
Un point particulier qui m'a fait galérer un peu, c'est le chargement dans l'ESP32-S2 mini ! Une fois déclaré dans l'IDE et le port com validé, il faut maintenir le bouton "Boot" enfoncé, appuyer brièvement le bouton "Reset", relâcher le bouton "Boot" puis cliquer sur "téléverser" pour autoriser la programmation ... Une erreur que j'ai faite également, c'est sur les jours, qui sont livrés de 0 à 6 dans le timeinfo.tm_wday et ma fonction Switch....Case je l'avais faite de 1 à 7, ce qui me donnait un manque dans le cas du "Dimanche".
La carte SD contient quand à elle, deux fichiers texte (.txt) appelés respectivement 'ssid.txt' avec une chaîne de caractères de ce genre: Freebox-ABCD02 et l'autre 'password.txt': ABCdefGHIjkLmn2XBL25 . Ceci permet au programme de lire l'identifiant et le mot de passe pour l'accès à la connexion sur la box . C'est un gros avantage pour la 'transportabilité' de l'horloge , où il y a juste à changer le contenu de ces fichiers, suivant l'endroit, pour se connecter au Wi-Fi disponible .
La mise en boîte:
Je pensais mettre ma pendule sous cloche, mais en passant chez Action, ma femme me montre un fourre-tout kaki souple, et me suggère de l'insérer dedans ... VGI (very good idea ) ! J'ai donc imprimé en 3D, deux flasques pour prendre en sandwich le couvercle de la trousse après l'avoir découpé aux dimensions adéquates. 4 vis/écrous ferment l'ensemble dont deux sont suffisamment longues pour venir prendre le circuit imprimé. Les deux pièces sont bien sûr dans le fichier ci-joint, pour ne pas avoir à refaire le monde si vous choisissez la même option. Un boîtier simple mais du plus bel effet sur un bureau . Quelle créativité et vision ma tendre épouse !
L'ensemble des fichiers dans le zip ci-dessous :
Wifi clock 4x8x8 (7.01 Mo)

Ajouter un commentaire
Français
English