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.
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?
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.
Letzte Funktion darin: timeserver_convert_time (): Diese rechnet die Unix-Time um in Datum/Uhrzeit unter Berücksichtigung der eingestellten Zeitzone und Sommer-/Winterzeit.
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....
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...
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.
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?