Arduino: NTP-Server Timestamp einzelne Infos in Variable speichern

OP #7367647
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?

#7369314
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.

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

#7369326
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?

OP #7369387
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren