Hallo Gemeinde, ich habe einen NTP-Time-Sketch kopiert und möchte nun die einzelnen Daten in eigene Dateien speichern. Leider finde ich keine Möglichkeit, z.B. den Monat in eine Variable zu speichern. Auch die Anzeige mittels Serial.print gelingt mir nicht. Die Zeile Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); wird sauber ausgegeben: 17:44:36.250 -> Thursday, March 09 2023 17:44:36 Wenn ich aber eine einzelne Info mit Serial.print(&timeinfo, "%A"); Serial.println("---"); Serial.print(&timeinfo, "%B"); Serial.println("---"); Serial.print(&timeinfo, "%d"); Serial.println("---"); Serial.print(&timeinfo, "%Y"); Serial.println("---"); Serial.print&timeinfo, "%H"); Serial.println("---"); Serial.print(&timeinfo, "%M"); Serial.println("---"); Serial.print(&timeinfo, "%S"); Serial.println("---"); ausdrucken möchte, kommt nur vorzeitige Angaben. Offensichtlich ist die Auftrennung nicht möglich, aber kennt jemand eine Möglichkeit, die einzelnen Daten zu separieren und dann in eine eigene Variable zu speichern?
Ulrich K. schrieb: > Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); Wo hast du denn dieses Pattern her? Es ist auf der folgenden Seite jedenfalls nicht spezifiziert: https://www.arduino.cc/reference/en/language/functions/communication/serial/println/ Das scheint eher für strftime() zu sein. https://man7.org/linux/man-pages/man3/strftime.3.html
Ulrich K. schrieb: > ich habe einen NTP-Time-Sketch kopiert Wenn ich in der Platformio-Registry nach "NTP" und Framework:Arduino suche, finden sich 138 Libraries. D.H. es gibt vermutlich noch viel mehr, alle mehr oder weniger verschieden. Wenn du uns nicht verrätst, was du genau kopiert hast, hat jede Antwort hier nur eine <1/100 Chance für deinen Quelltext relevant zu sein.
Muss man halt vorher anlegen, dann kannst du in einzelne Variablen reinschreiben. struct tm timeinfo; configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1); getLocalTime(&timeinfo); char timeStringBuff[30]; strftime(timeStringBuff, sizeof(timeStringBuff), "%y-%m-%d %H:%M:%S", &timeinfo); Serial.println(timeStringBuff); String datumString = String(timeStringBuff);
Stefan F. schrieb:
> Das scheint eher für strftime() zu sein.
println ist in der print.h/print.cpp überladen mit
1 | size_t Print::println(struct tm * timeinfo, const char * format) |
, welche dann die ebenfalls überladene Funktion print aufruft, in der dann letztendlich die Funktion strftime verwendet wird, bis zu der dann der Formatstring durchgereicht wird (hier Parameter 'f'). Daher die Formatsyntax von strftime in der println-Funktion.
1 | size_t Print::print(struct tm * timeinfo, const char * format) |
2 | {
|
3 | const char * f = format; |
4 | if(!f){ |
5 | f = "%c"; |
6 | }
|
7 | char buf[64]; |
8 | size_t written = strftime(buf, 64, f, timeinfo); |
9 | if(written == 0){ |
10 | return written; |
11 | }
|
12 | return print(buf); |
13 | }
|
In der Arduino-Dokumentation sind diese Überladungen offensichtlich nicht dokumentiert. Ulrich K. schrieb: >Wenn ich aber eine einzelne Info mit > Serial.print(&timeinfo, "%A"); > ... > Serial.println("---"); >ausdrucken möchte, kommt nur vorzeitige Angaben. Wie sehen denn diese Angaben aus?
:
Bearbeitet durch User
Εrnst B. schrieb: > Ulrich K. schrieb: >> ich habe einen NTP-Time-Sketch kopiert > > Wenn ich in der Platformio-Registry nach "NTP" und Framework:Arduino > suche, finden sich 138 Libraries. > D.H. es gibt vermutlich noch viel mehr, alle mehr oder weniger > verschieden. > > Wenn du uns nicht verrätst, was du genau kopiert hast, hat jede > Antwort hier nur eine <1/100 Chance für deinen Quelltext relevant zu > sein. OK, entschuldige, ich wusste nicht, dass das relevant ist, aber hier der gesamte Code
1 | #include <WiFi.h> |
2 | #include "time.h" |
3 | |
4 | const char* ssid = "ulrker"; |
5 | const char* password = "Kerstin-1960"; |
6 | int e; |
7 | int g; |
8 | int Woochentag; |
9 | int Jahr; |
10 | int Monat; |
11 | int Tag; |
12 | int Stunde; |
13 | int Minuite; |
14 | int Sekunde; |
15 | long current; |
16 | struct tm timeinfo; |
17 | |
18 | const char* ntpServer = "ptbtime1.ptb.de"; |
19 | const long gmtOffset_sec = 3600; |
20 | const int daylightOffset_sec = 3600; |
21 | |
22 | void printLocalTime() |
23 | {
|
24 | struct tm timeinfo; |
25 | if (!getLocalTime(&timeinfo)) |
26 | {
|
27 | Serial.println("Failed to obtain time"); |
28 | return; |
29 | }
|
30 | |
31 | Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); |
32 | }
|
33 | |
34 | void setup() |
35 | {
|
36 | Serial.begin(115200); |
37 | |
38 | //connect to WiFi
|
39 | Serial.printf("Connecting to %s ", ssid); |
40 | WiFi.begin(ssid, password); |
41 | while (WiFi.status() != WL_CONNECTED) { |
42 | delay(500); |
43 | Serial.print("."); |
44 | }
|
45 | Serial.println(" CONNECTED"); |
46 | |
47 | //init and get the time
|
48 | configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); |
49 | printLocalTime(); |
50 | |
51 | //disconnect WiFi as it's no longer needed
|
52 | WiFi.disconnect(true); |
53 | WiFi.mode(WIFI_OFF); |
54 | }
|
55 | |
56 | void loop() |
57 | {
|
58 | delay(1000); |
59 | printLocalTime(); |
60 | Woochentag = timeinfo->weekday; |
61 | Jahr = 1900 + timeinfo->year; |
62 | Monat = 1 + timeinfo->mon; |
63 | Tag = timeinfo->mday; |
64 | Stunde = timeinfo->hour; |
65 | Minute = timeinfo->min; |
66 | Sekunde = timeinfo->sec; |
67 | Serial.print(&timeinfo, "%A"); |
68 | Serial.println("---"); |
69 | Serial.print(&timeinfo, "%B"); |
70 | Serial.println("---"); |
71 | Serial.print(&timeinfo, "%d"); |
72 | Serial.println("---"); |
73 | Serial.print(&timeinfo, "%Y"); |
74 | Serial.println("---"); |
75 | Serial.print&timeinfo, "%H"); |
76 | Serial.println("---"); |
77 | Serial.print(&timeinfo, "%M"); |
78 | Serial.println("---"); |
79 | Serial.print(&timeinfo, "%S"); |
80 | Serial.println("---");*/ |
81 | }
|
Ulrich K. schrieb: > struct tm timeinfo; Hast du zweimal im Program. Du beschreibst die lokale Version im "printLocalTime", aber die globale Version, die in der loop() verwendet wird, wird nie geschrieben. d.H. Das Problem hat erstmal garnichts mit NTP zu tun, sondern mit Variablen-Scoping.
:
Bearbeitet durch User
Mario P. schrieb: > In der Arduino-Dokumentation sind diese Überladungen offensichtlich > nicht dokumentiert. Schöne Scheiße. Und dann tun die auch noch so, als hätten sie eine neue Programmiersprache erfunden. Was sie erfunden haben ist: eine mangelhafte Dokumentation.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.