Forum: Mikrocontroller und Digitale Elektronik Arduino: NTP-Server Timestamp einzelne Infos in Variable speichern


von Ulrich K. (ukr)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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.

von Fred F. (fred08151)


Lesenswert?

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);

von Mario P. (mario_71950c)


Lesenswert?

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
von Ulrich K. (ukr)


Lesenswert?

Ε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
}

von Εrnst B. (ernst)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.