(Änderungen am 26.03.2024 in orange)
Wie im Artikel DCF77-Generator (2017) beschrieben, ist der Empfang des DCF77-Signals (Stichwort "Atomuhr") nicht immer optimal. Zudem sind die Empfangsmodule ziemlich empfindlich bez. Versorgungsspannung. So ist eine Versorgung mittels Schaltnetzteilen praktisch ausgeschlossen. Das begrenzt die Möglichkeiten enorm, zumindest wenn der Empfänger nicht mindestens zwei Meter von der Uhr entfernt ist.
Auch ist es unter der Erde nicht immer möglich, ausreichende Signalstärke zu bekommen, wie bei mir in der Werkstatt im Keller. Im alten Beitrag war ein Raspberry Pi stellvertretend für den Hardware-Empfänger dafür zuständig, das DFC77-Zeitsignal künstlich aus der Internetzeit zu erzeugen, damit die Projekte auch im empfangsreduziertem Keller umgesetzt werden können. Aus der Internet-Zeit erstellt das Programm zuverlässig den Datenstrom für DCF77-Empfänger.
Nun ist ein Raspberry PI ein im Grunde ein kompletter Linux-Rechner, welcher für das Erzeugen eines DCF77-Datenstroms völlig überdimensioniert, zu teuer und auch recht wartungsintensiv ist (Updates, SD-Karten-Verschleiß usw.). Insbesondere wenn DFC77-Empfangsmodule in bestehenden Projekten ersetzt werden sollen, ist das ein nicht unerheblicher Aufwand, dieses mit Raspberry PIs zu tun.
Es kam der Wunsch auf, eine einfachere Lösung zu finden. Nach kurzer Recherche im Internet bin ich auf einen DCF77-Generator von Elektor gestoßen, der auf einem ESP8266-Controller basiert: Elektor-Magazin DCF77 Das Problem bei diesem Projekt ist, dass man eine Platine und weitere Bauteile braucht. Das kann man vermeiden indem man auf ein fertiges Wemos D1-Modul zurückgreift. Der Code stammt von Michael Margolis und ist Public Domain: DCF77-Emulator. Nach Anmeldung im Forum erscheint die ino-Datei zum Herunterladen für den Arduino-Compiler. Ihr findet den Code angepasst weiter unten im Link.
Der Code verbindet das Modul mit dem lokalen WLAN, holt per NTP die Internetzeit ab und stellt den DCF77-Datenstrom am D4-Ausgang zur Verfügung (GPIO2). GPIO2 ist auch der Pin, der die LED des Wemos - D1 -Mini versorgt. Sie blinkt mit dem Signal, allerdings invertiert also bei Low statt bei High. Man sieht es trotzdem gut.
Soweit funktioniert alles. Aber die Zugangsdaten zum WLAN müssen im C++ Code der ino-Datei hinterlegt und compiliert werden. Wäre es nicht schön, diese im EEProm des ESP8266 zu speichern und jedes Mal auszulesen, wenn eine Verbindung neu aufgebaut werden soll? Dann ist der Code unabhängig vom lokalen WLAN.
Das geht komfortabel mit der Library "WiFiManager" vom Programmierer "Tzapu" . Sie setzt den ESP8266 in den Access-Point-Modus und fragt die SSID und das WLAN-Passwort ab und verbindet den ESP anschließend und zukünftig mit diesen Daten mit dem WLAN, ganz ohne Variablen wie "SSID" oder "Password".
Installation von WiFiManager
Aktuell kam die Info zu mir, dass es manchmal Probleme mit WifiManager unter Windows 11 und/oder Arduino 2.x. beim Compilieren gibt. Bei einem Leser hat dies funktioniert:
- Arduino 1.8.13
- WifiManager 2.0.14 beta
- Time.zip (Bibliothek von der FEHM-Seite
- Boardmanager: Board "Generic ESP8266 Module"
In der Arduino-Umgebung wählst du
Werkzeuge - Bibliotheken verwalten
dann als Suchbegriff tzapu. Jetzt erscheint der Eintrag WiFiManager, den du installierst:
Im Arduino-Code musst du nur folgende Zeilen eingeben.
Einbinden der Library:
#include <WiFiManager.h>
Objekt erzeugen:
WiFiManager wifiManager;
Verbinden mit dem WLAN, wenn keine Daten vorhanden sind, starten eines Access-Points zum Erheben dieser Daten:
wifiManager.autoConnect("DCF77-Emulator"); //Creates an access-point on 192.168.4.1
Wenn WiFiManager (WFM) das erste Mal startet, ist im Eeprom des ESP noch nichts gespeichert. WFM merkt das und schält auf Access-Point um. Dort musst du deine WLAN-Zugangsdaten eingeben. WFM speichert diese dann im Eeprom. Beim nächsten Mal merkt der WFM, dass er funktionierende Zugangsdaten kennt und überspringt die Access-Point-Routine. Sollte der Zugang zum WLAN einmal nicht funktionieren, z.B. weil du z.B. die Zugangsdaten zum WLAN geändert hast, springt er wieder in den Access-Point-Mode.
Der WFM übernimmt die Verbindung mit dem WLAN komplett. Man muss nicht mehr SSID oder Password hart codieren, sondern kann sofort auf MQTT, Internetadressen usw. zugreifen. Sehr komfortabel!
So sieht das im Terminal des Arduino-Compilers aus, wenn der WFM keine funktionierenden WLAN-Zugangsdaten gespeichert hat. Er geht in den Access-Point-Mode:
Sofern gültige Zugangsdaten im Eeprom vorhanden sind sieht das so aus:
Access-Point-Mode
Wenn der WFM entschieden hat in den Access-Point-Mode zu schalten, erscheint ein neuer Access-Point in der Router-Liste. In meinem Fall "DCF77-Emulator":
wenn du dich mit diesem verbindest und anschließend im Browser die Adresse 192.168.4.1 eingibst, erscheint dessen Seite:
Du suchst dir das passende WLAN aus und gibst das Passwort ein, wählst "Save" und fertig. Der ESP speichert die Verbindungsdaten im Eeprom, verbindet sich sofort mit diesem WLAN und holt die Internet-Zeit im Netz ab.
Den Original-Public-Domain-Code habe ich angepasst. Folgende Änderungen habe ich vorgenommen:
- NTP-Server auf ptbtime3.ptb.de gesetzt
- Zugangsdaten mit WiFiManager verwaltet
- Löschen der WLAN-Daten wenn D2 (GPIO4) beim Start mit Ground verbunden ist. In diesem Fall blinkt die Wemos-Diode dauerhaft 3 mal pro Sekunde, bis die Versorgungsspannung getrennt wird und die Verbindung D2-Ground wieder aufgehoben worden ist. Danach sind die WiFi-Daten gelöscht und beim Wiedereinschalten geht der ESP in den Access-Point-Modus.
So sieht die Beschaltung des Wemos D1 Mini aus:
Der D1mini kann über den 3,3V-Pin direkt mit Spannung versorgt werden. Leider geht das mit dem 5V-Pin nicht, zumindest bei manchen D1minis (ist wohl abhängig vom Hersteller). Ich jedenfalls habe zwei vor Kurzem gegrillt, indem ich den 5V-Pin zur Versorgung herangezogen habe. Nach einer www-Recherche war klar - das war zu erwarten. Habt ihr keine 3.3V zur Verfügung, müsst ihr den D1mini über die USB-Buchse versorgen.
Ein Leser, Alois, hat mich aufgefordert, diese Erkenntnis für Andere hier zu hinterlegen. Ich überlege, das in meinem Menüpunkt "how to ..." zu thematisieren. Danke, Alois, für den Hinweis. Du hast völlig recht.
Im Betrieb:
Alois hat mir ein Bild von seiner Nixie-Uhr geschickt, die jetzt (wieder) läuft mit dem DCF77-Generator. Eine tolle Nixie-Uhr!!! Alles Gute, Alois. Super, dass es funktioniert hat. Mich freut sehr, dass ich etwas dazu beitragen konnte!
Quellcodes
Hier der Quellcode zum Anzeigen im Text-Format DCF77-Wemos-D1 Textformat
Und als .ino - Format für Arduino: DCF77-Wemos-D1 ino-Format
Selbstredend ist der von mir geänderte Code gemäß den Richtlinien ebenfalls Public Domain.