Hallo,
ich habe ein Problem beim Projekt mit einem ESP32
ich möchte mir über NTP die Uhzreit holen, aber ich einige Funktionen
aus time.h werden bei mir nicht erkannt. andere aber widerum schon
habe ich direkt als zweites inkludiert. aber die Funktionen tzset und
time() wird mir gesagt implizite deklarationen.
Der Datentyp time_t scheint aber kein Problem zu sein. Bei struct tm
allerdins wieder schon.
Chandler B. schrieb:> tzset und time()
Die wird es für den ESP32 nicht geben, ist ja keine Unix-Maschine, wo im
Hintergrund dauernd die Sekunden seit 1.1.1970 mitgezählt werden.
Timezone-Umgebungen wirst Du auf dem ESP32 genausowenig vorfinden.
Aber wofür brauchst Du diese Funktionen, wenn Du Dir die Zeit sowieso
über NTP holen willst?
Frank M. schrieb:> Aber wofür brauchst Du diese Funktionen, wenn Du Dir die Zeit sowieso> über NTP holen willst?
NTP verschickt immer UTC. Das Zeitzonen-Handling und Sommer-/Winterzeit
muss lokal durchgeführt werden.
Rolf M. schrieb:> NTP verschickt immer UTC. Das Zeitzonen-Handling und Sommer-/Winterzeit> muss lokal durchgeführt werden.
Ja und? Das kann man sich leicht zusammenschreiben. Die
WordClock mit WS2812 holt sich auch per NTP die Zeit. Eine oder ein
paar mehr Stunden draufaddieren/abziehen ist doch nicht die Welt. Die
Regeln, wann in Europa die Sommerzeit beginnt und endet, sind ebenso
bekannt. Das ist keine Raketentechnik.
Den Code dafür hatte ich mal vor ein paar Jahren zusammengeschrieben -
hier für einen STM32: https://github.com/ukw100/wordclock24h
Konkret ist die Berechnung hier drin:
https://github.com/ukw100/wordclock24h/blob/main/src/timeserver/timeserver.c
Letzte Funktion darin: timeserver_convert_time (): Diese rechnet die
Unix-Time um in Datum/Uhrzeit unter Berücksichtigung der eingestellten
Zeitzone und Sommer-/Winterzeit.
Frank M. schrieb:> Rolf M. schrieb:>> NTP verschickt immer UTC. Das Zeitzonen-Handling und Sommer-/Winterzeit>> muss lokal durchgeführt werden.>> Ja und?
Und dafür sind die Funktionen da, die vermisst werden. Die können also
nicht durch NTP ersetzt werden. Muss man halt selber machen.
> Das kann man sich leicht zusammenschreiben.
Klar.
Rolf M. schrieb:>>>> Und dafür sind die Funktionen da, die vermisst werden. Die können also> nicht durch NTP ersetzt werden. Muss man halt selber machen.
tzset() verwendet die Umgebungsvariable TZ und ein paar Listen aus
Dateien, wie zum Beispiel:
- /etc/localtime - The system timezone file.
- /usr/share/zoneinfo/ - The system timezone database directory.
- /usr/share/zoneinfo/posixrules
Siehe auch https://man7.org/linux/man-pages/man3/tzset.3.html.
So etwas gibt es unter Unix/Linux, aber doch nicht auf einem
Mikrocontroller. time() greift auf den systeminternen Ticker zu. Das
gibts natürlich auch nicht standardmäßig auf einem uC. Kann man
natürlich alles nachbauen (inkl. Dateisystem, um die obigen
Database-Files zu handhaben), aber warum? Nur, um die lokale Zeit
anzeigen zu können? Das sind ein paar Zeilen in C.
Ich verstehe dieses Anspruchdenken nicht. Ein Mikrocontroller ist kein
vollständiges Posix-System. Wer das vermisst, sollte sich einen RaspPi
nehmen und keinen ESP32.
Versuch es mal mit #include "sys/time.h"
Functioniert bei mir (ESP32, Arduino IDE 2.02, ESP32 lib 1.06).
Wichtig : die exacte string mit monat/day muss eingebunden werden.
1
#if defined(DLS)
2
//summertime is on march 26 2023 2 AM, see https://www.di-mgt.com.au/wclock/help/wclo_tzexplain.html
3
my_time.tm_hour = 1;
4
my_time.tm_min = 55;
5
my_time.tm_mday =26;
6
my_time.tm_mon = 2; //mktime needs months 0 - 11
7
my_time.tm_year = 2023 - 1900;
8
setenv("TZ","CET0CEST,M3.5.0/2,M10.5.0/3", 1);//timezone UTC = CET, Daylightsaving ON : TZ=CET-1CEST,M3.5.0/2,M10.5.0/3
9
tzset(); //this works for CET, but TZ string is different for every Land / continent....
Hallo,
Frank M. schrieb:> Ich verstehe dieses Anspruchdenken nicht. Ein Mikrocontroller ist kein> vollständiges Posix-System. Wer das vermisst, sollte sich einen RaspPi> nehmen und keinen ESP32.
time.h ist die Implementation der Posix-Lib auf ESP8266 und ESP32.
Aus einer meiner Uhren:
1
#include <time.h>
2
...
3
// Start Time service.
4
configTime(0, 1, "pool.ntp.org", "time.nist.gov"); // eine Sekunde Korrektur für das E-Paper...
5
setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 0);
6
...
7
8
time_t now = time(nullptr);
9
struct tm * timeinfo;
10
timeinfo = localtime(&now);
11
12
uint32_t seconds = timeinfo->tm_sec;
13
uint32_t minutes = timeinfo->tm_min;
14
uint32_t hours = timeinfo->tm_hour;
usw.
Wo siehst Du da ein Anspruchsdeneken?
Gruß aus Berlin
Michael
time.h hat es schon vor ewigen Zeiten in den ANSI/ISO C Standard
geschafft. Daher verstehe ich die Aufregung um POSIX nicht.
Der C Standard hat eine Einschränkungen für time.h auf
Freestanding-Environments. Nämlich dass die Funktionen daraus nicht
implementiert sein müssen :), aber sie dürfen implementiert sein :)
Bis auf die zwei oben genannten Probleme (Zeitquelle und
Zeitzonen-Datenbank), ist das auch nicht so schwer. Moderne µCs sind ja
mittlerweile leistungsfähiger als die Unix-Dampfmaschinen auf denen das
mal entstanden ist.
Frank M. schrieb:> Chandler B. schrieb:>> tzset und time()>> Die wird es für den ESP32 nicht geben, ist ja keine Unix-Maschine, wo im> Hintergrund dauernd die Sekunden seit 1.1.1970 mitgezählt werden.> Timezone-Umgebungen wirst Du auf dem ESP32 genausowenig vorfinden.>> Aber wofür brauchst Du diese Funktionen, wenn Du Dir die Zeit sowieso> über NTP holen willst?
Nun ja, diese Funktionen stehen aber auch noch im Programming Guide vom
ESP-IDF
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html?highlight=tzset#overview
Und mit version 4.1 hat das auch noch funktioniert.
Das umrechnen an für sich ist nicht das Problem. Aber warum neu machen,
wenn es das schon gibt. Aber dann werde ich das selber umrechnen