Une Horloge Approximative

Une horloge pilotée Wi-Fi donne une heure tributaire de votre interprétation !

        Majestueuse avec son profil d'usine à grande cheminée ! En plus de lampe d'ambiance originale, la cheminée, va donner l'heure... par le nombre de pixels allumés et ...plus les minutes passent, plus la colonne va virer du bleu au rouge. Tout les quarts et demies heure, un clin d'oeil vert rappelle que le temps passe  trop vite. Cette horloge est alimentée par USB ou bloc secteur, et se synchronise au Wi-Fi de la maison; donc elle est toujours tip-top  ! C'est à vous que revient l'interprétation de l'heure et si vous arrivez en retard, c'est que vous avez mal interprété la couleur. Rassurez-vous, un LCD donne les vraies informations en texte net et précis, simplement en caressant la face droite du mur de l'usine ... Et si vous la trouvez éblouissante au propre comme au figuré, la même imposition de la main en réduit l'éclairement !

Wifi clock vue       

 

          Avec son double affichage, par led ou avec un afficheur LCD deux lignes 16 caractères, on a le choix entre une valeur interprétée ou une lecture précise. Cette dernière donne les informations recueillies sur le Wi-Fi qui flotte dans toute la maison, et qui, après synchronisation sur la boxe, va extraire la date et l'heure pour l'afficher pendant une minute sur le LCD et nous renseigner sur la véracité de la connexion . Donc, on ne peut plus précis en low coast . Et cerise sur le gâteau, la mise à l'heure sur les changements Eté / Hiver se fait de manière transparente sans l'intervention de l'homme : merci qui ? hein ?

Le rétro-éclairage s'éteint au bout d'une minute, mais peut être réanimé  par une simple imposition de la main sur la face droite du boitier 

         Mais le clou de cette dégoulinante est son afficheur à approximation par interprétation de la couleur ! Le nombre de led allumées indique l'heure en système 24h, séparées en groupe de six, pour une interprétation plus aisée ... Pour lire les minutes, le barreau de led vire progressivement du bleu au rouge et repasse au bleu au passage de chaque heure, tout en allumant une led supplémentaire  ... Le but est de faire le rapport entre les deux couleurs pour y supposer les minutes écoulées. Un passage au vert pendant une seconde se produit tout les quarts d'heure pour attirer l'attention et se recentrer sur l'à peu près ...

        L'intensité lumineuse est atténuable en plusieurs paliers pour ne pas 'tirer' les yeux au cas où la luminosité ambiante est relativement faible. Pour réduire l'éclairement des pixels, il suffit juste de laisser la main sur la face droite de l'usine et toutes les secondes, la lumière baissera d'un cran .... Une coupure de courant ramène systématiquement le réglage au maximum ... Je suis en train de me poser la question pour savoir si je dois mémoriser la dernière valeur en EEPROM ou si je la laisse à faire en exercice pédagogique à qui serait intéressé par cette option ...

 

 

 

 

       

Quelques  détails sur les composants et les étapes de la réalisation :

Le tube afficheur:

        C'est un vieux tube fluorescent de 28 cm sur lequel j'ai coupé un bout à la mini-disqueuse ( lunettes, masque et gants de protection), puis nettoyé de sa poudre fluo ( lunettes, masque et gants de protection), ensuite j'ai glissé les 3 bâtons de pixels chaînables avec huit leds rvb 5050 ws2812. de chez Aliexpress ( 0,46€ pièce ) . Après que le tout soit assemblé, câblé et testé, j'ai coulé une résine d'inclusion transparente pour maintenir l'ensemble et garantir le plus bel effet .

Wifi clock pix

Le gros avantage de ces barreaux de leds, c'est la facilité avec laquelle on les met en service; déjà ils sont chaînables les uns aux bouts des autres, avec trois connexions à effectuer: la masse, le 5volts d'alimentation et la borne de commande série sur laquelle on va envoyer des trames qui donneront le numéro de la pixel à piloter ( de 0 à xxx suivant le Nb de barres montées), et une dose de Rouge, Vert, Bleu pour chacune... Et il n'y a même pas à réfléchir, une librairie de chez Adafruit se charge du travail.  . 

Wifi clock tube

L'afficheur classique :

        Un affichage à led rétro-éclairé est monté sur cette horloge et s'allume pendant 1 minute à la mise sous tension ... Il peut être ré-allumé à souhait simplement en passant la main sur le mur droit de l'usine. Dessus, en plus des données du jours, date, mois, année on peut lire, sur la ligne inférieure, les heures, minutes et secondes extraites des trames Wi-Fi . Mais c'est pas tout ! ça c'est quand tout va bien; si ce n'est pas le cas, un message vous dit que la connexion avec la boxe n'a pas aboutie, et c'est là que ça se gâte  !

Wifi clock lcd 1

 

 

 

 

 

 

Sur cet afficheur, qui a besoin de16 lignes sur sa connectique pour le pilotage, j'ai du me résoudre à passer en bus I2C afin de réduire le nombre d'entrées/sorties sur microcontrôleur. Un circuit dédié (Carte d'interface série IIC I2C TWI SPI) existe pour une bouchée de pain sur le site indiqué en lien ... En plus ce montage permet de placer l'afficheur où bon nous semble et ce, sans être limité à un seul type; le circuit admet aussi bien les 2x16 que les 4x20 caractères . Et comble de bonheur, un potentiomètre inclus, permet le réglage du contraste. Et tout ça, toujours sans se soucier de la gestion, car là aussi, une librairie toute faite est disponible .

Wifi clock lcd drv

Le bouton sensitif :

      Décidément, cette horloge est un concentré de technologie révolutionnaire ! Même pas de bouton saillant, avec une plaque de nez qui crée un trou moche; là, le bouton est de type capacitif, qui est sensible à quelques millimètres, qui présente l'avantage d'être anti rebond d'office, qui va s'affranchir de la résistance de Pull-Up ou Pull-Dwn, et qui inclus également si on le souhaite une fonction mémorisation (bi-stable). Et ce n'est pas cher du tout, toujours sur le même site en lien ... 

Wifi clock btn

 

 

 

 

 

Ce bouton n'a pas besoin de librairie ni de programmation; Il a le mérite d'avoir une led qui s'allume lorsque sa sortie passe à l'état logique haut et deux pads à straper  si l'on veut passer de fugitif à bistable ... Deux lignes d'alimentation, large en tolérance car la plage est de 2,5 à 5,5 volts DC et une sortie niveau TTL . J'ai même eu le malheur d'inverser l'alimentation, lors des essais et ça ne l'a pas claqué ! 

Donc ce bouton sur mon horloge va servir, à travers le plastique du boitier à régler la luminosité des pixels et/ou à ré-allumer le rétroéclairage du LCD simplement en approchant la main de la face droite de 'l'usine' . 

Wifi clock btn1

 

La bête à tout faire :

     Eh bien non, là je n'ai pas utilisé d'Arduino, mais un ESP32 ! Normal, il me faut une connexion Wi-Fi ! Le gros avantage, c'est que l'on peut développer le programme de l'ESP32 sur l'IDE de Arduino... il suffit juste d'ajouter le gestionnaire de cartes adéquat . Personnellement j'ai pris celui-ci : https://dl.espressif.com/dl/package_esp32_index.json ça ne m'a posé aucun problème d'élaboration et de téléversement, tant soit peu que l'on ait les bons drivers de ports en fonction de la provenance des circuits ! Mes circuits, c'est du pas cher Chinois et le driver CP210x m'a donné entière satisfaction . Un site à lire et a creuser un peu, même pour la culture, c'est le site du couple Maria & Ruiz Santo; on y apprend plein de choses et plus encore ...

Wifi clock esp

 

 

 

 

 

 

 

Le circuit ESP32 intégre une antenne et les composants RF, un amplificateur de puissance pour la communication,  et des amplificateurs à faible bruit, filtres, pour la réception. Et un module de gestion de l'alimentation VCCà 5 volts DC, un régulateur et une sortie 3,3 volts. Cette carte inclue des puces Wi-Fi et Bluetooth à double mode de 2.4 GHz par la technologie TSMC 40nm à faible puissance, Les datasheets montrent également la multitude de bus et GPIO disponibles pour si peu de coût ! 

Wifi clock ar

 

Les Fichiers pour la réalisation :

Tout est dans le zip ci-dessous 

Wifi clock ledWifi clock led (249.35 Ko)

Un coup d'oeil sur le schéma et le programme :

Wifi clock led sch

      Tout simple le schéma ! Si l'on commence par l'alimentation sur les bornes JP1 / JP2  on arrive tout de suite sur un électrochimique (C2 470µF) qui a pour but de supprimer les transitoires véhiculées par le câble, si la source n'est pas des plus propre .Cette source, c'est du 5 volts, issu de n'importe quel dispositif USB capable de sortir 1 ampère minimum: en effet il y a des leds et si l'on fait la multiplication, on voit que ça consomme lorsqu'il est 23 heures avec éclairage maximum ! Ce 5 volts est distribué sur tous les composants utilisés qui n'ont besoin que d'une seule et même tension . Un ESP32 DevKitV4 assure toutes les fonctions de gestion des différents périphériques qui lui sont raccordés . Le nombre d'entrées / sorties est relativement réduit grâce à l'utilisation du bus I2c sur l'afficheur et One Wire sur les barreaux de pixels.... Une seule entrée en digitale (SWI) pour les informations du bouton: Pas de résistance de pull down car nous sommes sur une sortie TTL côté bouton. Le bus I2C va se promener sur le driver de LCD qui se charge d'extraire les signaux pour piloter en parallèle les IOs de l'afficheur (ça simplifie bien le câblage) . Côté barreaux de pixels, on retrouve un électrochimique (C1 ) de 100µF pour raffermir l'alimentation et sur la ligne des datas une résistance (R1) de 470 Ohms pour garantir une impédance minimum par rapport à la sortie de l'ESP32 ! Cette résistance est impérative en cas d'utilisation d'une alimentation spécialement dédiée pour les barres de leds . Ces dernières sont montées en série; la sortie de l'une se soude sur l'entrée de la suivante et ainsi de suite ...  24 heures => 3 barrettes de 8 pixels ! 

 

      Tout simple le logiciel ! On commence par appeler les librairies dont on a besoin; le gros avantage de l'Open Source, c'est que l'on a pas à réinventer le fil à couper le beurre chaque fois . C'es procédures ont déjà été utilisées donc pourquoi ne pas les mettre sur un serveur à disposition des autres passionnés ? Puis c'est la déclaration des variables. N'oublions pas de renseigner l' Id de votre boxe Wi-Fi et son Mot de passe ... Ne pas oublier également de régler l'offset GMT suivant le pays où l'on habite .Ainsi que l'heure d'été ou d'hiver, si l'on subit ces changements bis-annuels ; Il s'en suit deux lignes pour la déclaration du type d'afficheur (adresse I2C, Nb de caractères et Nb de lignes ) et déclaration des NeoPixels ( Nombre, données et format des données ). Vient ensuite un sous-programme de l'affichage sur LCD, avec l'état du Wi-Fi, extraction des heures, minutes, secondes et conversion en données numériques , suivi de l'affichage sur le LCD  du calendrier et heure . Un autre sous-programme va s'occuper de la gestion des pixels et des 'puissances' des couleurs avec la prise en compte de l'état du bouton, pour réallumage du rétro-éclairage ou diminution de l'éblouissement !

Le Setup vient ensuite pour la connexion Wi Fi, l'initialisation du LCD et des barreaux NeoPixels. Et enfin la boucle, advitam éternam, toutes les secondes, qui éteindra le LCD au bout d'une minute en n'oubliant pas d'aller faire les mises à jour dans les sous-programmes l 

Les détails du sketch :

#include <WiFi.h> // Accès Wi-Fi
#include "time.h"  // Gestion du temps
#include <LiquidCrystal_I2C.h> // Interface I2C <=> LCD
#include <Adafruit_NeoPixel.h> // Pilotage des barres de led CJMCU_2812-8 

#define DATA      4  //Sortie de commande du barreau de pixels 
#define NUMPIXELS 24 //Declaration du nombre de pixels

int SWI = 2;  //Entrée du bouton de commande
int Green, Red, Blue; //Variables des couleurs
int multi = 1; //Multiplicateur de luminosité
int bkLight; //Variables de rétroéclairage


const char* ssid       = "Lzzzzzzzzzzzzzz"; // Id de la box
const char* password   = "xxxxxxxxxxxxxxxxxxxxxxx"; // Mot de passe Box

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600; //Réglage de l'offset en fonction du méridien (Offset x 3600)

const int   daylightOffset_sec = 3600; //Commutation heure d'été (3600) et heure d'hiver (0)

byte Pix_hour; // Variables des heures
byte Pix_min; // Variables des minutes
int Pix_sec; // Variables des secondes

LiquidCrystal_I2C lcd(0x27,16,2);  // Adresse du LCD 0x27 16 caractères 2 lignes

Adafruit_NeoPixel pixels(NUMPIXELS, DATA, NEO_GRB + NEO_KHZ800); // Format des données envoyées à la berre de led

void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    lcd.println("Failed to obtain time");
    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 de la date et heure sur le LCD
  lcd.setCursor(0,0);
  lcd.print(&timeinfo, "%A");
  lcd.setCursor(3,0);
  lcd.print(&timeinfo, " %d %B");
  lcd.setCursor(11,0);
  lcd.print(&timeinfo, " %Y");
  lcd.setCursor(1,1);
  lcd.print(&timeinfo, "   %H:%M:%S");

  }

void pixelDisplay()
{
  // Calcul des valeurs Bleues / Rouges / Verts en fonction des minutes 
  Red = (Pix_min * 4)/multi; 
  Blue = (240 / multi) - Red;
  Green = 0;

  // Flash vert aux quart d'heure
  if (((Pix_min == 15) and (Pix_sec < 2)) or ((Pix_min == 30)and (Pix_sec < 2)) or ((Pix_min == 45)and (Pix_sec < 2))) {
    Red =0;
    Blue = 0;
    Green = 200;
  }
  
  // Remise à zero des pixels à Minuit
  if ((Pix_hour == 0) and (Pix_min ==0)) {
    pixels.clear();
  }
  
  // Calcul du nombre de leds allumées égale au nombre d'heures 
  for(int i=0;i<Pix_hour;i++){
  pixels.setPixelColor(i, pixels.Color(Red,Green,Blue));
    pixels.show();
  }
  // Allumage rétro éclairage si appui sur le bouton et réglage de la violence de l'éclairage
    if (digitalRead(SWI)==1){
    lcd.backlight();
    bkLight = 0 ;
    multi++;
      if (multi > 4) {
        multi == 1;
      }
    delay (1000);
  }
}

void setup()
{
  //connection au WiFi
  lcd.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      lcd.print(".");
  }
  lcd.println(" CONNECTED");
  
  //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);

  // Declaration du bouton de commande en entrée
  pinMode(SWI, INPUT); 

  // initialise le lcd
  lcd.init();                       
  lcd.backlight();

  // initialise la barre de led
  pixels.begin();
}

void loop()
{
  delay(1000);
  printLocalTime();
  pixelDisplay();
  bkLight ++;
  if (bkLight > 60 ){
    lcd.noBacklight();   
  }

}

      Tout simple la mise en boite ! J'ai voulu donner l'aspect d'une usine (à gaz) avec une grande cheminée ... Les trois parties sont déssinées avec Design Spark Mechanical (On ne change pas une équipe qui gagne) ; un fond qui supporte le circuit imprimé; la boite avec le toit en dents de scies (j'aurais dû les faire en volume, ça aurait été plus réaliste ) , qui fixe le LCD + son driver et un cache qui rompt la monotonie de la couleur, qui affine le contour et qui cache les têtes de vis de fixation. Dans le zip ci dessus, les fichiers originaux sont joints, ainsi que les fichiers STL ... reste à les adapter en G-Code pour les imprimer en 3D.Wifi clock boxav

 

        En conclusion, n'allez pas dire que la précision de cette lampe d'ambiance qui donne l'heure, laisse à désirer ... c'est juste votre interprétation de la couleur qui n'a pas la finesse requise pour évaluer les dixièmes de secondes ... mais ça fait beau quand même et c'est moins bruyant qu'un clocher !

 

Ajouter un commentaire