Tag 9: TCP Uhrzeit

Das Projekt des heutigen Tages benutzt die Funktionen des vorigen Tests, um selbständig Informationen aus einer Webseite zu beziehen. Konkret lädt das Programm die aktuelle Uhrzeit von einer speziell dafür konzipierten Seite und stellt damit die per Library realisierte interne Uhr des Controllers.

Hinter dem heutigen Türchen befindet sich erneut ein Widerstand mit 1 kΩ. Für den morgigen Versuch werden alle drei Widerstände benötigt.

Das Programm: Day9_TCPAutoTime

Während das gestrige Programm noch größtenteils per Hand bedient werden musste, arbeitet das heutige Programm weitgehend autonom. Völlig selbständig verbindet sich der Controller mit der Webseite:

http://chronic.herokuapp.com/

Über die URL können verschiedene Zeitsysteme und Umstellungen abgerufen werden. Die aktuelle, in Deutschland im Winter gültige Zeit, wird durch die URL

http://chronic.herokuapp.com/utc/in-one-hour

abgefragt. Deswegen steht im Aufruf der Funktion getTime als zweiter Parameter „utc/in-one-hour“. Ausgehend von der UTC (koordinierte Weltzeit) müssten Sie im Sommer den Aufruf ändern zu „utc/in-two-hours“. Nach demselben System können Sie auch alle anderen Zeitzonen behandeln.

Ausgabe der Uhrzeit über den Seriellen Monitor

Ausgabe der Uhrzeit über den Seriellen Monitor

Die ermittelte Zeit wird nun an die Time-Library von Michael Margolis übergeben (Quelle: http://www.pjrc.com/teensy/td_libs_Time.html). Aus praktischen Gründen ist eine Kopie der von mir verwendeten Time-Library-Version im Sketchordner enthalten. Diese muss in den libraries-Ordner Ihres Sketchbook-Ordners kopiert werden. Im Hintergrund wird nun permanent die neue Uhrzeit berechnet und  jede Sekunde im Terminal ausgegeben. Sie könnten nun auf einfache Weise einen Wecker oder eine andere zeitgesteuerte Anwendung programmieren.

71 Kommentare

  1. nickjan

    Hallo zusammen,

    ich würde gerne eine Digital-Uhr bauen, die immer die aktuelle Uhrzeit abfragt und diese dann mittels 30 LEDs anzeigt. Ist das mit dem Nano ESP überhaut möglich? Gibt es da eventuell schon Ansätze? Freue mich auf Anregungen und eventuell auch Dateien.

    Mfg Janick :)

  2. MM

    Bei mir taucht folgener Fehler auf kann mir jemand helfen???
    Fehler:
    compilation terminated.

    Bibliothek SoftwareSerial in Version 1.0 im Ordner: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial wird verwendet
    exit status 1
    Fehler beim Kompilieren.

  3. Bernd

    Fehler beim kompilieren

    1. Tim

      Hast du die Library schon hinzugefügt?

  4. EinCeller

    Hallo zusammen,

    da wir ja den Zeitserver in Grund und Boden gefahren haben, hier eine Frage an die versammelte Fachschaft:

    hat schon mal jemand den Zeitserver einer Fritzbox ausgelesen? Die Dinger saugen sich ja selbst die Zeit aus dem Netz und bieten diese ins Intranet an… Eine Idee, wie man an diese Zeit mit dem Arduino drankommt?

    Grüße aus CElle

    1. Klaus

      Ohne das jetzt ausprobiert zu haben, würde ich mal pauschal sagen, per NTP-Protokoll. Muss man vermutlich im Router aktivieren.

      1. Rainer

        Hallo,

        im Forum unter User Projekte gibt es ein Programm zum Auslesen des NTP Servers der Telekom über UDP, das lässt sich sicherlich an die Fritzbox anpassen.

        Viel Erfolg,
        Rainer

        1. EinCeller

          Eigentlich ist die Lösung so einfach, dass man überhaupt nicht drauf kommt… Die Adresse des Zeitservers in der FritzBox erreicht man……… über fritz.box….

          Nehmt also das Beispiel hier und setzt die IP Eurer Fritzbox ein (bei alternativer Programmierung geht dann auch „fritz.box“ als Name) und es sollte gehen, wenn denn in der FB-Konfig unter Netzwerkeinstellungen den Schalter „FRITZ!Box als Zeitserver im Heimnetz bereitstellen“ angehakt hat und eine NTP-Quelle eingetragen ist.

          Grundsätzliche Frage an die Runde:

          die Zeitserver liefern nur die UTC und man addiert (subtrahiert) die eigene Zeitzone drauf…

          Aber: wie bekomme ich eine automatische Sommer-Winterzeitumstellung hin?

          Grüße aus CElle

          1. Rianer

            Hallo,

            völlig richtig, die Sommerzeit erhält man nur, wenn UTC+2 ( in Deutschland ) an den NTP Server als Zeitzone übergeben wird.

            Bei meinem Speedport von der Telekom funktioniert das Auslesen nicht auf Anhieb, daher der etwas universellerer Ansatz mit dem NTP Server der Telekom

            Wenn man in der Google Suche die Stichworte „arduino sommerzeit“ eingibt, kommen ein Reihe von Beiträgen, wie man den Zeitpunkt der Umstellung von UTC+1 auf UTC+2 bestimmen kann,
            Der User „jurs“ hat das mit wengen Zeilen Code gelöst, klappt zufriedenstellend !

            Gruß,

            Rainer

  5. Dominik Sigmund

    Leider ist die Webseite down, die die Zeit liefert…

  6. Tom

    Also ein bisschen schade finde ich schon, dass

    a) nichtmal im Nebensatz auf das Installieren der Lib hingewiesen wird.

    b) im Quellcode eine falsche URL steht
    „/utc/in+one+hours“
    statt richtig
    „/utc/in-one-hour“

    1. Eule

      Danke!!! Eigentlich stellt sich hier die Frage, wieso das bei so vielen mit einer falschen Webseite funktioniert hat.

      1. EinCeller

        Siehe die Antwort vom Raabinator Mittwoch, der 9. Dezember 2015 um 20:50

        Grüße aus CElle

  7. Stefanie

    Hallo liebe alle,

    Bekomm ich die Zeit schon Standort spezifisch bzw. wo würde ich das einstellen können, denn die ausgegebene Zeit ist fast 10 min früher ;)?

  8. gilo

    Mit Arudino 1.6.5 IDE klappt alles prima. Mit der 1.6.6 (auf einem anderen Rechner) allerdings bekomme ich „deprecated“ Fehlermeldungen aus der Time-Library, d.h. die Syntax ist irgednwie geändert worden. Gibt’s da eine „neue“ Lib oder irgendwelche Einstellungen in der IDE ? oder habe ich „irgendwo“ noch einen zu alte library mir einfangen ?

    1. Raabinator

      „deprecated“ ist kein Fehler. Es ist eine Information vom Compiler an den Programmierer „hey, du machst da was, was ich in einer zukünftigen Version vielleicht nicht mehr unterstützen werde“.
      Solange nur diese Meldung kommt, funktioniert es noch. Anderenfalls wäre es z.B. ein „Syntax Error“.

      1. gilo

        schon klar, deprecated … aber es bleibt halt das blöde Gefühl, dass entweder die Installation „schief“ gegangen ist (falsche lib an flascher stelle ?) oder man halt schon zu Beginn von hoffentlich vielen Projekten auf einem (halb)-toten Gleis unterwegs zu sein. Insofern würde ich schon der Sache auf den Grund gehen wollen …

        1. jz

          Das ist ein „mismatch“ in der Andruino IDE 1.6.6:
          Der Compiler ist schon kritischer, aber die Libraries sind noch nicht angepasst, insbesondere die Stream Klasse.

          Da mir die Warnungen verleidet sind, verwende ich:

          #include

          class SoftwareSerialFix : public SoftwareSerial
          {
          public:
          SoftwareSerialFix(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false) : SoftwareSerial(receivePin, transmitPin, inverse_logic){};
          bool find(const char *target) {return SoftwareSerial::find((char*) target);};
          bool findUntil(const char *target, const char *terminator) {return SoftwareSerial::findUntil((char*) target, (char*) terminator);};
          };

          SoftwareSerialFix esp8266(11, 12); // RX, TX

          1. jz

            Bitte die Kommentarfunktion verbessern, oder eine Anleitung, wie man einfach die „Pfeillinks“ Klammer durchbringt. Danke.

  9. damian

    Arduino: 1.6.6 (Windows 10), Board: „Arduino Nano, ATmega328“

    C:\Users\Damian\Desktop\Day9_TCPAutoTime\Day9_TCPAutoTime.ino:18:18: fatal error: Time.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Error compiling.

    This report would have more information with
    „Show verbose output during compilation“
    enabled in File > Preferences.

    1. fk (Beitrag Autor)

      Hi,
      hast du die Library richtig eingefügt?

      1. damian

        Was ist die libray? wo mus ich die eingeben

        1. fk (Beitrag Autor)

          In dem Download Ordner von heute befindet sich ein Ordner librarys.

          1. doc

            UND WO MUSS ICH SIE WIE EINFÜGEN?

  10. Andreas

    Nun hat der Fernsehabend begonnen und das Programm funktioniert mit und ohne „s“ ;-). Sehr lehrreich der Tag 9: im IoT ist eine stabile Internetverbindung überlebenswichtig und nichts geht über eine gute Fehlerbehandlung. Was macht eigentlich die Funktion GetTCP in dem Sketch?

    1. fk (Beitrag Autor)

      Hi,
      GetTCP ist noch ein Überbleibsel aus der Entwicklung. Allerdings kann man die Funktion gut für eigene Entwicklungen verwenden. Über sie kann man Webseiten schnell aufrufen.

  11. Schlork

    Bei mir hängt er sich manchmal (nicht immer) nach 5-10 Sekunden auf:

    20:17:10
    20:17:11
    20:17:12
    20:17:13
    20:17:14
    2÷:17:15

    Keine Ahnung, wo das Prozentzeichen herkommt. Das ist ja eine einfache String-Operation String(hour()). Sieht daher so aus, als käme von der hour()-Methode nix Vernünftiges zurück. Hat das jemand auch?

  12. Andreas

    Also dass ich keine Zeit bekomme, weil der Server überlastet ist, ist mir schon klar – aber ich bekomme noch davor zwei Fehlermeldungen: ESP SEND ERROR: die hier noch nicht beschrieben wurden. Das sieht bei mir so aus:

    WLAN Connected
    My IP is:

    AT+CIFSR

    +CIFSR:STAIP,“192.168.0.114″
    +CIFSR:STAMAC,“18:fe:34:a4:67:0d“

    OK

    ESP SEND ERROR: AT+CIPSTART=“TCP“,“chronic.herokuapp.com“,80
    ESP SEND ERROR: AT+CIPSEND=62
    00:00:12
    00:00:13
    00:00:14
    usw.

    Kann mir da wer weiterhelfen?

    Danke, Andreas

    1. fk (Beitrag Autor)

      Hi,
      die beiden Fehlermeldungen kommen höchst wahrscheinlich von dir erkannten Problem. Das Modul kann keine Verbindung zur Seite herstellen und gibt deswegen Error zurück.

    2. LustigePerson

      Ich bekomme ebenfalls den ESP SEND ERROR.
      Irgendeine Idee woran das liegen kann?

  13. HottytoScotty

    Der Link in dem Quellcode ist Falsch http://chronic.herokuapp.com/utc/in-one-hour
    anstatt
    http://chronic.herokuapp.com/utc/in-one-hours

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    1. Klaus

      Nein, ich habe ihn nicht geändert und er läuft. Da muss irgendwas bei Dir falsch gelaufen sein.

    2. Raabinator

      Nicht unbedingt.
      Alles ab utc… wird interpretiert und eine passende Antwort generiert.

      Wenn man die Seite direkt mit http://chronic.herokuapp.com/
      aufruft kann man unten verschiedene Sachen ausprobieren. Unter ‚Chronic documentation‘ gibt’s eine Beschreibung. Da wird erwähnt, dass auch Schreibfehler berücksichtigt werden … schlaues Ding.

  14. NoName

    Eine Frage an den Autor. Bleiben die Fragen und Antworten im Forum auch nach dem 24. online? Ich habe schon am 2. Tag resigniert, weil ich zu viel Zeit dran sitzen musste, bis was funktionierte. Wenn ich nun aber in den Weihnachtsferien die Aufgaben nachhole, habe ich keine Möglichkeit mehr nachzufragen, bzw. ´nach den Fehlerlösungen zu suchen.

    1. fk (Beitrag Autor)

      Hi,
      ja die Webseite inklusive Forum, Kommentaren etc bliebt. Also kann man den Kalender auch später machen oder bei allgemeinen Problemen mit dem Board während späteren, eigenen Projekten hier Hilfe und Tipps suchen.

      1. NoName

        super! Dankeschön!

  15. MC

    Heute läuft’s bei mir leider auch nicht ganz rund. Und zwar stimmt die Zeitanzeige im seriellen Monitor nicht (siehe Abbildung).
    Kann es daran liegen, dass die Webseite überlastet ist? Oder was könnte sonst für ein Fehler vorliegen?

    1. Klaus

      Exakt, die Überlastung ist dran schuld. Es gibt einfach einen Timeout. Die Uhrzeit des Mikrocontrollers wird nicht gestellt und fängt bei 0 Uhr an.

    2. Raabinator

      Verlängere in der Funktion getTime() vor der Zeile
      if (esp8266.find(„+IPD“))
      den Timeout mit
      esp8266.setTimeout(60000);
      auf eine Minute.
      Dann müsste es klappen. Ich habe bis 30 Sekunden Reaktionszeit gemessen.

      1. Raabinator

        Ok … manchmal reicht auch eine Minute nicht aus.
        Armer kleiner Server…

        1. MC

          Hallo Raabinator,
          vielen Dank für Deinen Tipp, damit geht’s!

      2. Hartmut

        Es ist das erste mal, dass ein Sketch auch bei mir nicht auf Anhieb funktioniert hat. Ich habe an der gleichen Stelle einen Timeout mit 20s eingebaut. Damit gings bei jedem zweiten Mal.

      3. Christoph

        Schreibe ich das unter

        esp8266.println(getRequest);

        mit oder ohne Leerzeile?

        1. Raabinator

          Ja. Leerzeilen sind dem Compiler egal.
          Find() muss einfach länger auf die Antwort warten.

      4. Fidixx

        Danke der Timeout hat geholfen :)

      5. RICI

        Danke für den Tip mit 60000 gehts, es besser.

  16. Aironout

    Hallo Zusammen,

    bei mir bricht er immer ab mit etlichen Fehlermeldungen wie diese:

    libraries\Time\Time.cpp.o: In function `breakTime(unsigned long, tmElements_t&)‘:

    C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Time/Time.cpp:151: multiple definition of `setSyncInterval(unsigned long)‘

    sketch\Time.cpp.o:sketch/Time.cpp:151: first defined here

    collect2.exe: error: ld returned 1 exit status

    exit status 1
    Fehler beim Kompilieren.

    Ich habe das Verzeichnis „Time“ in das „…\avr\libraries“ Verzeichnis kopiert, ohne das gibt’s eine andere Fehlermeldung, also finden muss er’s eigentlich.

    Kann sich da jemand einen Reim drauf machen?
    Vielen Dank,
    Aironout

    1. Aironout

      Hm… Ich habe die Warnung von Albert Einstein, „Die Definition von Wahnsinn ist, immer wieder das Gleiche zu tun und andere Ergebnisse zu erwarten.“ in den Wind geschlagen und nochmal das ZIP-File runtergeladen, nochmal kopiert, nochmal die Library kopiert, Sketcher gestartet, Programm kompiliert und hochgeladen und siehe da – jetzt geht’s. Keine Ahnung, was da beim ersten Mal schief gelaufen ist.
      Naja, Einstein kannte eben den Conrad-Adventskalender nicht…;P

      Danke,
      Aironout

    2. Martin Klein

      Man muss das Verzeichnis „libraries“ aus dem heruntergeladenen Sketch Ordner in das Verzeichnis
      „C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries“
      VERSCHIEBEN und nicht kopieren. Sonst findet er beim kompilieren die Definitionen doppelt und daher die Fehlermeldungen.

      1. Peter

        Danke, das war genau die Information die in der Beschreibung gefehlt hat.

    3. Martin Klein

      VERSCHIEBEN und nicht kopieren – dann klappts !

  17. Markus

    Day9_TCPAutoTime.ino:18:18: fatal error: Time.h: No such file or directory
    compilation terminated.
    Fehler beim Kompilieren.

    Was habe ich falsch gemacht???

    1. Noob

      Weiß nicht, ob Du es schon gesehen hast, aber ich werde einfach mal eien User mit Namen „Tanja“ zitieren:

      In dem heutigen Download Day9_TCPAutoTime.zip findest du den Ordner „libraries“ Darin den Ordner „Time“. Den Ordner „Time“ musst du in deinen Ordner „libraries“ kopieren.
      Bei Windows ist das: Dokumente -> Arduino -> libraries Dieser Ordner bleibt auch nach einer Deinstallation der Arduino IDE erhalten, ist daher besser als: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries

    2. Noob

      Zur Fehlermeldung: Soweit ich das verstehe, will das Programm letztendlich auf eine „time“-Library zugreifen. Das sieht der Arduino beim Compilen auch selber, und wenn diese Bibliothek nicht existiert, würde das Programm ohnehin nicht laufen… daher bricht er ds Compilen ab und schickt dir eine unleserliche Fehlermeldung.

      ===========
      Disclaimer: Dieser Account wird wahrscheinlich nicht auf Antworten reagieren.

  18. Vamish

    Bei mir wird nicht die Uhrzeit angezeigt sondern es zählt die Zeit hoch was muss ich machen ?

    1. Tanja

      Bei mir auch. Die Seite chronic.herokuapp.com ist zur Zeit nur mit langer Ladezeit mit einem Browser erreichbar.

      1. McElch

        Bei mir zählts auch nur von Null an rauf!?

  19. johannes

    welche datei muss wohin kopiert werden
    bei mir wird immer eine fehlermeldung mit „include time.h“ angezeigt
    danke im vorraus

    1. Tanja

      In dem heutigen Download Day9_TCPAutoTime.zip findest du den Ordner „libraries“ Darin den Ordner „Time“. Den Ordner „Time“ musst du in deinen Ordner „libraries“ kopieren.
      Bei Windows ist das: Dokumente -> Arduino -> libraries Dieser Ordner bleibt auch nach einer Deinstallation der Arduino IDE erhalten, ist daher besser als: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries

      1. Johannes

        danke ich dachte man muss es in den ordner kopieren in dem auch das programm von heute ist

  20. General Overnight

    Warum einfach, wenn es auch kompliziert geht? Für die Abfrage der Zeit stehen im Internet diverse Protokolle zur Verfügung. Im einfachsten Fall fragt man per UDP den daytime Service auf Port 13 ab, dafür brauchen lediglich zwei Pakete über’s Netz gehen, eine Abfrage eine Antwort. Für eine exakte Zeitsynchronisation gibt es NTP-Server.

    1. Rainer

      Hallo,

      gibt es für den NTP-Server auch ein Beispiel, welches man auf dem Arduino nachvollziehen kann ?
      Das Bessere ist immer der Feind des Guten, exakt und/oder einfach wären m.E. hier das Bessere !

      Gruß, Rainer

      1. Rainer

        Ich antworte mir mal selbst, erst lesen und dann fragen wäre besser gewesen !

        In der Time Library gibt es Beispiele, eines davon bezieht sich auf den NTP Server.

        Ein erster Blick auf den Code zeigt, dass das Ethernet Shield vorausgesetzt wird.
        Ich müsste also nur das Ganze auf UDP über das WLAN Module umschreiben. Wie man UDP Verbindungen herstellt, haben wir ja bereits gelernt !

        Das Wochenende kommt, ich packe das dann mal an !

        Rainer

  21. Klaus

    Nicht wundern, wenn das Programm derzeit nicht läuft. Wir fahren wohl alle gemeinsam gerade eine DDOS-Attacke. Bei diesem Angriff versucht man einen Server durch viele Zugriffe von verschiedenen Rechnern lahm zu legen. Derzeit sind Reaktionszeiten von über 1 Minute zu erwarten. Darauf ist der Sketch nicht ausgelegt.

  22. UW

    Guten Morgen,

    spannendes Problem heute: Der include Befehl für Time.h in Zeile 18 sorgt für Programmabbruch. Ich konnte es lösen, indem ich über Datei/Voreinstellungen den Sketchbook-Speicherort genau auf das Verzeichnis des Sketches gelegt habe.

    Das ist aber bei Weitem keine elegante Lösung. Leider liefert die Variante, den include-Pfad auf das richtige Verzeichnis zu setzen (~/Day9_TCPAutoTime/libraries/Time/Time.h) einen Haufen Fehlermeldungen.

    Daher die Frage: Gibt es eine Möglichkeit, Bibliotheken relativ zum Sketch einzubinden? Wenn ja, wie müsste Zeile 18 dann aussehen oder wird eine zusätzliche Pfad-Definition eingefügt oder welche Einstellungen müssen im Compiler vorgenommen werden?

    1. nerd

      Siehe oben.
      Diese muss in den libraries-Ordner Ihres Sketchbook-Ordners kopiert werden

      1. nerd

        C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Time

  23. Samichlaus

    Da war ja das Tor zu früh offen! HOHO, HOHO.

  24. fk (Beitrag Autor)

    Hi,

    es gibt nun auch offiziell ein Forum. Zu dem Forum gelangt man oben über die Navigationsleite. Um Themen zu eröffnen und an Diskussionen teilnehmen zu können, muss man sich Registrieren. Dies ist über den Punkt Login, ebenfalls im Navigationsmenü, möglich.

    Für Diskussionen zu dem jeweiligen Adventstag ist die Kommentarfunktion immer noch sinnvoll. Allerdings gab es hier auch viele Interessante und wichtige Diskussionen und Überlegungen, die über das Thema des Tages hinausgingen. Solche Diskussionen haben nun im Forum einen besseren Platz, da sie leichter zu finden und auch besser nachzuvollziehen sind. Gleiches gilt für grundlegende Probleme mit dem Board, wie z.B. mit dem Treiber oder Verbindungsschwierigkeiten.

    Im Forum ist es ausserdem möglich, Dateien, wie veränderte Programme oder neue Projekte, direkt hochzuladen. Einige sehr spannende Ideen und Verbesserungen der Beispielprogramme habe ich bereits gelesen.

    Weiterhin viel Spaß beim Ausprobieren, Entwickeln und Basteln :)

    1. Rainer

      Der erste Beitrag ist schon im Forum.

      Es lassen sich allerdings keine *.ino Dateien direkt hochladen, vorher als ZIP Datei erstellen.

      Ciao, Rainer

  25. Max

    Erster !

    (Total sinnvoller Kommentar)

Schreiben Sie einen Kommentar

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