Day 9: TCP time
Today’s project uses the functions of the prior test to independently collect information from a website. The program specifically loads the current time from a dedicated website and thus sets the internal clock of the controller that is implemented by library.
Behind today’s door, there is another resistor with 1 kΩ. All three resistors will be needed for tomorrow’s experiment.
The program: Day9_TCPAutoTime
While yesterday’s program still required mostly manual operation, today’s program works mostly autonomously. The controller connects to the website entirely independently:
The URL can be used to call various time systems and conversions. The current time valid in Germany in winter is queried by the URL
http://chronic.herokuapp.com/utc/in-one-hour
Therefore, the call of the function getTime has the second parameter »utc/in-one-hour«. Based on the UTC (coordinated world time), you need to change the call to »utc/in-two-hours« in summer. You can treat all other time zones according to the same system.
The determined time is now handed over to the Time-Library of Michael Margolis (source: http://www.pjrc.com/teensy/td_libs_Time.html). For practical reasons, a copy of the Time-Library version that I use is enclosed in the sketch folder. It must be copied into the libraries folder of your sketchbook folder. In the background, the new time is continually calculated and output in the terminal every second. You can now simply program an alarm clock or another time-controlled application.
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 :)
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.
Fehler beim kompilieren
Hast du die Library schon hinzugefügt?
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
Ohne das jetzt ausprobiert zu haben, würde ich mal pauschal sagen, per NTP-Protokoll. Muss man vermutlich im Router aktivieren.
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
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
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
Leider ist die Webseite down, die die Zeit liefert…
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”
Danke!!! Eigentlich stellt sich hier die Frage, wieso das bei so vielen mit einer falschen Webseite funktioniert hat.
Siehe die Antwort vom Raabinator Mittwoch, der 9. Dezember 2015 um 20:50
Grüße aus CElle
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 ;)?
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 ?
“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”.
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 …
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
Bitte die Kommentarfunktion verbessern, oder eine Anleitung, wie man einfach die “Pfeillinks” Klammer durchbringt. Danke.
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.
Hi,
hast du die Library richtig eingefügt?
Was ist die libray? wo mus ich die eingeben
In dem Download Ordner von heute befindet sich ein Ordner librarys.
UND WO MUSS ICH SIE WIE EINFÜGEN?
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?
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.
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?
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
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.
Ich bekomme ebenfalls den ESP SEND ERROR.
Irgendeine Idee woran das liegen kann?
Der Link in dem Quellcode ist Falsch http://chronic.herokuapp.com/utc/in-one-hour
anstatt
http://chronic.herokuapp.com/utc/in-one-hours
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Nein, ich habe ihn nicht geändert und er läuft. Da muss irgendwas bei Dir falsch gelaufen sein.
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.
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.
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.
super! Dankeschön!
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?
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.
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.
Ok … manchmal reicht auch eine Minute nicht aus.
Armer kleiner Server…
Hallo Raabinator,
vielen Dank für Deinen Tipp, damit geht’s!
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.
Schreibe ich das unter
esp8266.println(getRequest);
mit oder ohne Leerzeile?
Ja. Leerzeilen sind dem Compiler egal.
Find() muss einfach länger auf die Antwort warten.
Danke der Timeout hat geholfen :)
Danke für den Tip mit 60000 gehts, es besser.
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
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
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.
Danke, das war genau die Information die in der Beschreibung gefehlt hat.
VERSCHIEBEN und nicht kopieren – dann klappts !
Day9_TCPAutoTime.ino:18:18: fatal error: Time.h: No such file or directory
compilation terminated.
Fehler beim Kompilieren.
Was habe ich falsch gemacht???
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
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.
Bei mir wird nicht die Uhrzeit angezeigt sondern es zählt die Zeit hoch was muss ich machen ?
Bei mir auch. Die Seite chronic.herokuapp.com ist zur Zeit nur mit langer Ladezeit mit einem Browser erreichbar.
Bei mir zählts auch nur von Null an rauf!?
welche datei muss wohin kopiert werden
bei mir wird immer eine fehlermeldung mit “include time.h” angezeigt
danke im vorraus
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
danke ich dachte man muss es in den ordner kopieren in dem auch das programm von heute ist
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.
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
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
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.
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?
Siehe oben.
Diese muss in den libraries-Ordner Ihres Sketchbook-Ordners kopiert werden
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Time
Da war ja das Tor zu früh offen! HOHO, HOHO.
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 :)
Der erste Beitrag ist schon im Forum.
Es lassen sich allerdings keine *.ino Dateien direkt hochladen, vorher als ZIP Datei erstellen.
Ciao, Rainer
Erster !
(Total sinnvoller Kommentar)