Dans la première partie du blog, j'ai reconstruit et décrit le projet de notre client Hans-Ulrich Küster avec son affichage grand format de l'époque. Pour obtenir le plus grand affichage possible, il a superposé deux LED MAX7219 8x32 4 en 1 à matrice de points. Un horloge en temps réel RTC DS3231 I2C a servi d'horloge.
Dans cette partie, je voudrais montrer comment j'ai remplacé le micro contrôleur ATMEGA 328P par le micro contrôleur compatible WLAN d'Espressif. Pour ce faire, j'ai laissé le sketch en grande partie inchangé, mais les deux interfaces SPI et I2C sont sur des broches différentes de celles de la carte micro contrôleur avec ATMEGA. J'ai donc dû adapter légèrement le circuit et le croquis.
Matériel utilisé
Avec l'ESP8266, j'ai été confronté pendant plusieurs jours à un problème apparemment insoluble, car l'interface SPI présentée dans le schéma de brochage avec MOSI vers SD1, CS vers CMD et SCLK vers CLK ne fonctionnait tout simplement pas. Nous en reparlerons plus tard.
ESP32
C'était encore plus rapide avec l'ESP32. Voici la répartition des broches pour l'interface SPI :
// ou sck
// ou mosi
// ou ss
Et les connexions pour le RTC sur l'interface I2C :
// SDA à D21
// SCL à D22
Grâce à des tentatives précédentes, je savais que l'ESP32 ne connaît pas la variable LED_BUILTIN, j'ai donc ajouté la ligne après le message d'erreur correspondant au début du sketch.
int LED_BUILTIN = 2;
L'horloge en temps réel (alimentée par la batterie) connaissait encore l'heure des tentatives précédentes, j'ai donc téléchargé le sketch en même temps. Ce n'est que pour la synchronisation avec l'heure du PC que la variable doit être brièvement réglée sur syncOnFirstStart = true.
démarrage synconfirst = faux; // Synchroniser true avec PC, sinon false
Eureka. C'était rapide.
Voici le sketch à télécharger pour l'ESP32
ESP8266
Et maintenant ? Vous êtes encore bloqué sur le problème de l'ESP8266 ? Ou bien commencer par télécharger l'heure directement depuis un serveur NTP sur Internet ?
J'ai opté pour la solution rapide avec un exemple de sketch de la bibliothèque TimeLib.h. Avec le sketch d'exemple TimeNTP_ESP8266WiFi.ino, il m'a suffi d'insérer mon SSID WLAN et mon mot de passe pour que l'heure actuelle s'affiche dans le moniteur série.
L'autre problème ne s'était toujours pas résolu. Même pour télécharger le sketch, j'ai dû déconnecter le connecteur CS au CMD, sinon un message d'erreur s'affichait lors de l'établissement de la connexion. J'ai donc fait une recherche sur Internet concernant l'interface SPI de l'ESP8266. À ma grande surprise, j'ai vu une configuration de test avec le convertisseur analogique-numérique MCP3008, que je connaissais bien grâce au Raspberry Pi. Cependant, il était connecté aux broches qui avaient un H devant les abréviations connues dans le schéma de brochage, c'est-à-dire HSCLK=D5=GPIO14, HMISO=D6=GPIO12, HMOSI=D7=GPIO13 et HCS=D8=GPIO15. Donc sans plus attendre, DIN, CS et CLK de l'écran LED matriciel ont été connectés là, le sketch a été adapté, et voilà : ça a marché.
Voici les modifications apportées au croquis de M. Küster :
// pas nécessaire sur l'affichage
// SCL à D1 = GPIO5
// SDA à D2 = GPIO4
Et voici le croquis complet à télécharger.
Synchronisation avec le serveur NTP
L'idée d'utiliser le micro-contrôleur WLAN m'est venue parce que je pensais que le fait de télécharger deux fois le sketch pour synchroniser l'horloge en temps réel avec l'heure du système de l'ordinateur, une fois avec bool syncOnFirstStart = true ; une fois avec bool syncOnFirstStart = false ; avait besoin d'être amélioré et même l'horloge en temps réel DS3231, bien meilleure, n'affiche plus l'heure exacte après plusieurs semaines. J'ai donc voulu combiner le croquis de M. Küster avec le grand écran avec le croquis d'exemple pour l'heure NTP.
Essentiellement, le sketch pour le temps Internet est seulement "purgé" de la sortie dans le moniteur série et ensuite inséré dans le sketch de M. Küster. Et ensuite, bien sûr, la source de la synchronisation doit être modifiée. Ceci est fait à la ligne 159 :
Rtc.régler(Datéme(uint16_t(vous()), Uint8_t(Montroy()), Uint8_t(journée()), Uint8_t(heure()), Uint8_t(minute()), Uint8_t(seconde())));
// vieux: RTC.AdJust (DateTime (F (__ date__), F (__ temps__)));
Voici le téléchargement du sketch pour l'ESP8266 avec synchronisation de l'heure à partir du serveur NTP. Veuillez noter que vous devez entrer vos "informations d'identification WLAN", c'est-à-dire le SSID (nom) et le mot de passe, aux lignes 35 et 36. Et le passage de l'heure d'été à l'heure d'hiver se fait en commentant les lignes 40 et 41 respectivement.
Amusez-vous bien à le mettre en place. Si vous disposez d'une connexion Internet stable et d'une bonne réception Wi-Fi dans votre chambre, vous pouvez laisser de côté le RTC et synchroniser l'heure plus fréquemment avec le serveur NTP.
8 commentaires
Rolf Müller
Hat es jemand geschafft, da noch eine Sommerzeit-Regel einzufügen. Das Projekt ist ja sehr gut, aber das umstellen zwischen Sommer und Winterzeit ist ja echt nervig. Der NTP liefert doch auch das Datum.
Andreas Wolter
Die Projekte in diesem Blog dienen auch zur Inspiration für Erweiterungen. Wie man lesen kann, hat Bernd Albrecht Sie inspiriert. Versuchen Sie es selbst einmal und lassen Sie uns wissen, ob es funktioniert hat. Die Idee klingt interessant.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Steffen Mutter
Das ist ja ein tolles Projekt, insbesondere NTP sync ist wirklich eine tolle Idee.
Um die ‘ultimative’ Uhr zu bauen, so Bernd Albrecht Zeit und Muße verspürt, wäre die Digitale Anzeige in der Mitte, aber der Doppelpunkt als extra LEDs, die im Sekundentakt blinken. (Module sind m.E. trennbar)
Rund um die digitale Anzeige einen Ring mit 3×60 LEDs, um die Stunden (ist nur eine LED an, die alle 12 Minuten um eine LED weiter springt), Minuten und Sekunden anzuzeigen.
Wäre sicher ziemlich aufwändig zu realisieren, würde sich aber als Uhr in (m)einer Firma sicher sehr gut machen, zumal die dank NTP (sync jede Stunde) und RTC (wenn jemand das WLAN getötet hat) sehr genau geht…
Ruediger Ebert
Da mir die Anzeige zu hell war, habe ich ein Potentiometer zur Helligkeitsregelung angeschlossen.
Wer dies auch realisieren möchte, nachfolgende eine kurze Anleitung:
Potentiometer Anschluss zwischen 3.3V und 0V. Abgriff an Analog-Input des ESP8266 anschliessen.
Wert des Potis: 10K
Im Definitionsteil des Sketches folgende Zeilen hinzufügen:
const int analogInPin = A0; // ESP8266 Analog Pin ADC0 = A0
int brightnessPotValue = 0;
Zum Loop folgende Zeilen hinzufügen:
brightnessPotValue = analogRead(analogInPin);
int c = map(brightnessPotValue, 0, 1023, 0, 15);
uhr.control(MD_MAX72XX::INTENSITY, c);
Rüdiger
Ruediger Ebert
@ Bernd Albrecht: Danke :-)
Bernd Albrecht
@ Ruediger Ebert: Grundsätzlich ist die Internetzeit in Universal Time Coordinated (UTC) angegeben. Deshalb ist bei dem Sketch „Uhr_2_X_Anzeige_ESP8266_WLAN_NTP.ino“
in den Zeilen 38-41 die Korrektur für die jeweilige Zeitzone angegeben, zurzeit 2 Stunden für MESZ. Der Wert wird in der Variablen timeZone gespeichert. Die Korrektur wird in Zeile 98 addiert.
Schnellste Möglichkeit für die Anzeige in UTC:
Zeile 40 auskommentieren und eine weitere Zeile einfügen:
//const int timeZone = 2; // Central European Summer Time (MESZ)
const int timeZone = 0; // Universal Time Coordinated (UTC)
Nils Sappok
Vielen Dank für diesen – wie immer – exzellenten Beitrag!
Da möchte ich es gleich mal nach bauen….
Wie wäre es noch mit einer WS2812B 5050 RGB LED Matrix? Ich habe noch die 8×8 von Euch und zusätzlich gerade eines der flexiblen 8×32 Panels erhalten. Mit dem Uno läuft es problemlos, aber mit dem ESP32 NodeMCU habe ich es noch nicht geschafft. Obwohl es Beispiele im Netz ohne gibt, muss ich wohl einen Pegelwandler einsetzen.
Bleibt gesund! :)
Ruediger Ebert
Für ein Projekt benötige ich die Anzeige der Uhrzeit in UTC. Dies dies mit dem vorgestellten Projekt möglich?
Rüdiger