Arduino Zeitsynchronisation mit ESP8266 und NTP

Immer wieder ein leidiges Thema mit den Arduinos: wie stellt man vernünftig die Zeit ein? Bei meiner Wordclock habe ich einen DCF77 Empfänger verwendet, welcher mich aber auch einige Nerven gekostet hat. Die DCF Empfänger haben z.B. den Nachteil, dass sie sehr störanfällig sind und auch relativ lange für die Synchronisation benötigen (mindestens 2 Minuten).

Ganz von mir aus bin ich aber nicht auf die Idee gekommen, mich hier nach einer Alternative um zusehen. Ein Leser meines Blogs hatte mich angeschrieben und gefragt, ob ich nicht mit bereits mit dem Gedanken gespielt habe, ein serielles Wifi Modul zu verwenden. Danach habe ich mich etwas damit beschäftigt und auch Gefallen an den ESP8266 Modulen gefunden. Noch am selben Tage habe ich bei einem großen Online-Auktionshandel ( ;-) ) ein Modul für knapp 8€ mit Lieferung aus Deutschland bestellt. Zwei Tage später konnte ich bereits anfangen zu entwickeln!

Viel Arbeit wurde mir hierbei durch den Benutzer Tomer (*1) erspart. Dieser hat nämlich bereits eine alternative Firmware für das ESP8266 Modul geschrieben, welche NTP unterstützt. Die Firmware könnt ihr hier (*6) herunterladen. Diese Firmware akzeptiert zwei neue AT Befehle:

  1. AT+CIPNTP=<offset from GMT> -> Erstellt einen neuen NTP Request mit dem angegebenen GMT Offset
  2. AT+CIPNTP? -> Liefert die aktuelle Uhrzeit zurück

Ziemlich einfach, oder?

Um das ganze nun nutzen zu können habe ich eine kleine Arduino Library geschrieben. Diese findet ihr hier. Neben dem Code zur Zeitsynchronisation ist dort auch ein Beispiel-Sketch enthalten. Das Beispiel sendet abwechselnd einen NTP Request mit GMT+1/GMT+2 und liefert die Uhrzeit dann über die Pins 10 und 11 mit einer Baud von 38400 aus.

Stückliste

Vorbereitung ESP8266 Modul

Die Vorbereitung besteht eigentlich nur aus dem Aufspielen der neuen Firmware. Hierzu wird die neue Firmware und ein Tool namens esptool benötigt. Zum Flashen der neuen Firmware müssen zusätzlich GPIO0 auf LOW und GPIO2 auf HIGH gezogen werden. Sind die Vorbereitungen getroffen muss nur noch die neue Firmware hochgeladen werden. Unter Linux sieht der Befehl zum Flashen z.B. so aus:

./esptool.py --port /dev/ttyUSB0 --baud 9600 write_flash 0x00000 eagle.app.v6.flash.bin 0x40000 eagle.app.v6.irom0text.bin

Weitere Informationen zum Upload findet man hier.

Anschluss am Arduino UNO

Beim Anschluss des Moduls am Arduino ist es wichtig, die seriellen Pins 0,1 zu verwenden. D.h. ihr müsst euren Sketch entweder über die ISP Schnittstelle hochladen oder das Modul vor dem Hochladen kurz abklemmen. SoftwareSerial über andere Pins ist hier keine Alternative, da mit dieser Library nur eine Datenrate von 38400 Baud möglich ist.

ACHTUNG: Die ESP8266 Module sind nicht 5V tolerant. Bitte darauf achten, dass überall mit maximal 3,3V gearbeitet wird.

Fazit

Wie ihr seht, ist das alles kein Hexenwerk. Als nächstes werde ich meinen DCF77 Empfänger in der RGB Wordclock durch ein ESP8266 Modul austauschen und sehen, wie es sich in der Praxis bewährt.

Quellen

  1. http://www.esp8266.com/viewtopic.php?f=11&t=705
  2. http://www.mikrocontroller.net/articles/ESP8266
  3. https://nurdspace.nl/ESP8266
  4. https://github.com/TomerCo/ESP8266-AT
  5. https://github.com/esp8266/esp8266-wiki/wiki
  6. http://bit.ly/esp8266-ntp0-9-4
  7. https://github.com/bagges/esp8266_ntp
  8. https://github.com/themadinventor/esptool

18 Gedanken zu „Arduino Zeitsynchronisation mit ESP8266 und NTP“

  1. Die Firmware hab ich drauf, connected bin ich auch, aber die DNS Auflösung scheint zu scheitern.
    Wo kann man den benutzten DNS auslesen oder einstellen?
    AT+CIPNTP=2

    Sntp initializing TZ: GMT+02…
    Sntp initializing…
    pool.ntp.orgsntp_request: Waiting for server address to be resolved.
    sntp_dns_found: Failed to resolve server address resolved, trying next server

    Würde den ESP gerne auch in meiner Wortuhr einbauen.
    https://www.flickr.com/photos/eokgnah/sets/72157626846176659/

    grüße…
    eok

  2. Hallo,
    Habe versucht die Firmware auf den ESP zu Flaschen,
    Beim schreiben auf den Block „0X00000“ leuchtete die Blau LED dauern und ich musste einen Reset durchführen.
    habe beide Dateien geflasht aber nun tut sich nix mehr am modul und er reagiert auf keinen Befehl in keiner Baud.
    an was kann das liegen ? beim zurückflashen auf einen alten SW stand reagiert er wieder sauber.

    Danke
    Gruß Heiko

    1. Hi Heiko,

      dieses Problem hatte ich noch nicht, aber das schon Probleme beim ersten Block (0x000000) auftreten ist komisch. Stimmt deine Verkabelung und wird beim zurückflashen der alten SW auch sicher was geschrieben? Wenn du magst, kannst du mir eine Mail schreiben mit folgenden Infos. Vielleicht fällt mir noch was ein.

      * Welches Betriebssystem?
      * Welches ESP8266 Board (PCB oder Keramikantenne?)
      * Welche Tools nutzt du und welche Befehle führst du aus?

      Viele Grüße
      Markus

  3. Hallo Markus, habe Deine RGB Wordclock im Versuchsaufbau zum Laufen bekommen. Ist wirklich auch für einen Programmierlaien wie mich nicht schwer gewesen. Davor habe ich ein paar WC’s mit LED Matrix + Ansteuerplatine gebaut. War weitaus mehr Arbeit !
    Deine Variante möchte ich nun meinem Sohn zum 40. Geb. schenken. Probleme: 1. Er lebt in Moskau und da ist DCF 77 nur mit sehr viel Glück zu empfangen und 2. Er will die engl. Sprachvariante, damit auch russ. Kollegen mal die Zeit ablesen können. Das „Übersetzen“ ins englische müßte ich hinbekommen. Was mich aber sehr interessiert ist der komplette Sketch für die Deine RGB WC mit ESP8266 und NTP! Denn das bekomme ich nicht selbst hin. Kannst Du mir da helfen. Mir gefällt die Idee sehr gut. Alternativ kann ich natürlich einen Platine mit integrierten RTC 1302 bauen aber dann muß man wohl doch alle paar Monate die Uhr stellen.
    Viele Grüsse
    Burkhard

  4. Hi zusammen,

    danke für den prima Blog. Ich habe ihn als Aufhänger genommen meiner Wetterstationen basierend auf dem ESP01 und Arduino zeitgesteuert die Daten an mein NAS zu übertragen.

    nun hab ich aber nicht die Möglichkeit auf ntp.pool.org zu zugreifen. Deshalb habe ich einen lokalen NTP Server eingerichtet.

    Ich habe von Tomer das Github repository
    https://github.com/TomerCo/ESP8266-AT
    mit SDK 0.9.3 gefunden und analysiert und wisst ihr ob es ausreicht die sntp.c wie folgt anzupassen:
    #if SNTP_SERVER_DNS /* wil be set to 0 */
    #define SNTP_SERVER_ADDRESS „pool.ntp.org“ /* will be deleted or empty*/
    #else
    #define SNTP_SERVER_ADDRESS „213.161.194.93“ /* will be adapted to the local IP */
    #endif

    Leider habe ich bisher immer mit dem SDK 0.9.4 gearbeitet. Gibt es die Sourcen dazu irgendwo?

    Wenn ich falsch liege gibt es von eurer Seite noch alternative Lösungen?

    ich habe dazu auch schon auf den Blog von Tomer gefragt, aber noch kein Feedback bekommen:
    http://www.esp8266.com/viewtopic.php?f=11&t=705&start=30

    Viele Grüße
    weisslein

    1. Ich denke eigentlich dass es ausreichen sollte diese Zeilen zu ändern. Ich habe leider selbst damit noch nicht gearbeitet und auch nichts davon selbst kompilieren müssen. Probiers doch einfach mal aus, vielleicht ist es ja schon ausreichend.

      VG Markus

      1. hi Markus,

        in der Zwischenzeit konnte ich das SDK 0.9.4 nun herunterladen (von folgenden Link: http://bbs.espressif.com/viewforum.php?f=5&sid=f3047e294e7367864526fba661f5361f
        dort finden sich auch noch aktuellere). Weiterhin habe ich die Sourcen mit den Files von Tomer (AT commands mit NTP ext. für SDK 0.9.3) integriert, die updates für 0.9.4. berücksichtigt und abschließend die Toolchain für den Build eingerichtet.

        Bzgl. Aufbau Toolchain und des Builds habe ich mich an das Wiki gehalten: https://github.com/esp8266/esp8266-wiki/wiki/Toolchain
        Jedenfalls ist es mit der o.g. Anpassung in der sntp.c möglich das ESP-Modul ohne Interzugang jedoch mit NTP Sync zu verwenden.

        Gruß
        Jörg

  5. Ich hab zwei Fragen:

    Kann ich das Modul nicht direkt mit den 3,3V des Arduino verbinden; UND
    Hinter RX und TX hängen doch auch 5V, oder? Kommt das Modul damit klar?

    1. Du kannst das Modul zwar mit den 3,3V des Arduino versorgen, aber wenn du RX und TX verbindest wird es dir vermutlich RX und TX am ESP8266 zerschießen. Es gibt auch Arduinos bei denen man die Spannung zwischen 5V und 3,3V umschalten kann, mit diesen sollte das nicht passieren.
      Bei dem 5V Arduino benötigst du zusätzlich einen Logic Level Converter.

  6. Hallo,
    ich versuche dein Beispiel zum Laufen zu bringen, bekomme aber immer folgende Fehlermeldung:

    ‚esp8266_ntp‘ does not name a type

    Woran könnte es hier liegen?

    Lg
    Fatmax

    1. Das hört sich so an als wäre die Library nicht korrekt installiert. Hast du im Arduino Library Ordner ein Verzeichnis namens esp8266_ntp mit der .h und .cpp Datei von Github? Lg

  7. Ich habe es nun mit Hilfe des Beispiels hinbekommen mittels NTP-Funktion die Zeit abzufragen und dies für mein Projekt zu verwenden.
    Dabei haben sich aber noch 2 Fragen aufgetan:

    1.) Welcher Befehl ruft genau die erneute Sync mit dem NTP-Server auf? Wenn ich das Bsp. richtig verstanden habe, dann wir die Zeit am Anfang 1x vom Server abgerufen und dann jeweils von der 1x aktualisierten Arduino-Zeit weiter verwendet. Ich möchte aber in regelmäßigen Abständen einen neuen Sync der Arduino-Zeit machen.
    2.) Zur Überprüfung ob der ESP8266 noch eine Verbindung mittels Router zum Internet hat, suche ich eine Möglichkeit der Verbindungsüberprüfung. Der Befehl AT+PING=“www.google.at“ bringt mir nur Error als Rückmeldung, obwohl eine intakte Verbindung zum Router besteht und eine IP vorhanden ist.

    Lg
    Fatmax

    1. Hi Fatmax, du kannst mit setSyncProvider() eine Funktion hinterlegen die im Intervall (setSyncInterval) aufgerufen wird. Die übergebene Funktion muss dann die Zeit neu synchronisieren.
      Der AT+PING Befehl ist mir neu. Du könntest einfach versuchen eine Verbindung zu http://www.google.de auf Port 80 zu öffnen. Funktioniert der Verbindungsaufbau bist du noch Verbunden. VG

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.