Hallo zusammen, ich nutze etwas code und werde da nicht komplett schlau draus: tm local; void readClock() { time_t now; time(&now); localtime_r(&now, &local); Serial.println(&local, "%A, %B %d %Y %H:%M:%S"); } Der code läuft, wie kann ich auf beispielweise die Stunden zugreifen? Ganz klar ist mir der pintln auch nicht, ich hätte erwartet dass in "local" ein string enthalten ist, aber irgendwie wir er ja dann zerteilt. Ich hätte gern einfach nur die Zahlenwerte (integer) ... Auch hier: void setClockManually() { #define RTC_UTC_TEST2 1709235881 time_t rtc = RTC_UTC_TEST2; timeval tv = { rtc, 0 }; settimeofday(&tv, nullptr); } Auch die Zeit setzen, lieber aus Einzelwerten. Habe mir mal die Sekunden seit 1970 für gerade eben ausgerechnet und eingesetzt... geht auch wie erwartet, aber ich würde lieber Tag, Monat, Jahr etc... übergeben und auch zurück bekommen...
Arbeite die Anfängerübungen in Deinem C Buch für struct durch, dann lernst Du wie auf die Elemente von struct tm zugegriffen werden kann.
Das ist nicht das Problem, ich kenne diese Strukturen nicht. time_t dürfte nur ein long sein... logischerweise time(&now); scheint mir Überflüssig, da der Rückgabewert nicht ausgewertet wird und es ja auch nicht ändert da die Sekunden seit 1970 ja in time_t stehen, verstehe ich den Sinn dieser Zeile Code nicht. Außer time holt den Wert nach now... tm -> keine Ahnung, aber das hier hilft mir wohl weiter... https://en.cppreference.com/w/c/chrono/tm Aber das: timeval tv = { rtc, 0 }; settimeofday(&tv, nullptr); komme ich noch nicht ganz hinter wie das (timeval) aufgebaut ist https://pubs.opengroup.org/onlinepubs/007908775/xsh/systime.h.html Vor allem wie nun die Informationen vom einen zum anderen kommen... für mich etwas undurchsichtig nachzuvollziehen...
:
Bearbeitet durch User
Moin, Naja, dieses Zeitgedoense ist halt so gewachsen (mit der Zeit). Welche structs jetzt wie aufgebaut sind, steht in den man-pages zu den Funktionen. Oder in jedem gut sortierten Internet. Gruss WK
Thorsten S. schrieb: > ich kenne diese Strukturen nicht Der Sinn von Doku besteht darin, diesem Zustand abzuhelfen. https://www.tutorialspoint.com/c_standard_library/c_function_localtime.htm
Thorsten S. schrieb: > time_t dürfte nur ein long sein... logischerweise Weißt Du, wie und wo Du das nachsehen kannst? Also ohne Internet. (Internet ist hier zwar auch gut und hilft beim Verständnis, doch der erste Schritt muss immer lokal in Deiner IDE möglich sein) (Gilt auch für die anderen Strukturen und Funktionen)
:
Bearbeitet durch User
Thorsten S. schrieb: > Außer time holt den Wert nach now... Korrekt. Thorsten S. schrieb: > tm -> keine Ahnung, aber das hier hilft mir wohl weiter... Auch korrekt. Wo ist jetzt das Problem? Die Dokumentation ist doch sehr eindeutig, gerade in Bezug auf diese Frage: Thorsten S. schrieb: > Der code läuft, wie kann ich auf beispielweise die Stunden zugreifen? Thorsten S. schrieb: > Ganz klar ist mir der pintln auch nicht, ich hätte erwartet dass in > "local" ein string enthalten ist, aber irgendwie wir er ja dann > zerteilt. Nö, println weiß nur mit tm umzugehen und macht das dann entsprechend des Formatstrings. Ich sehe hier eher ein Grundlagenproblem.
Danke für eure Hilfe. Dergute W. schrieb: > Naja, dieses Zeitgedoense ist halt so gewachsen (mit der Zeit) Jo, muss ich erstmal durchsteigen, bin sonst eher sehr hardwarenah unterwegs...in Assembler und C. Keks F. schrieb: > Wo ist jetzt das Problem? Es wundert mich zum Beipsiel noch, warum local nicht vom Typ timeval ist... Und warum dort nicht mit gettimeofday() gearbeitet wird... In meiner Vorstellung läuft dort irgendwo in den Untiefen ein Sekundenzähler, getrieben von irgendeiner internen Hardware in irgendeinem Interrupt... Keks F. schrieb: > Ich sehe hier eher ein Grundlagenproblem. Absolut nicht ausgeschlossen. :-)
:
Bearbeitet durch User
Thorsten S. schrieb: > Es wundert mich zum Beipsiel noch, warum local nicht vom Typ timeval > ist... Du definierst es doch als tm und so will es auch die Funktion. Timeval ist ein komplett anderer Typ. Unterschied ist entsprechend der Doku hauptsächlich, dass der Zeitstempel und die Mikrosekunden noch angegeben werden.
Jo. Ich brauche eigentlich nur etwas das nach 24 Stunden true wird, bis es 1x abgefragt wurde und das so genau wie es geht...
Thorsten S. schrieb: > Ich brauche eigentlich nur etwas das nach 24 Stunden true wird, 24 Stunden "nach was"? Evtl. kannst du dir das ganze struct tm sparen, und einfach ausnutzen, dass 24 Stunden 24×60 Minuten und damit 24×60×60 Sekunden sind. time_t enthält Sekunden. Kann man einfach vergleichen, "(now > ziel_zeit_24h)" wird dann true...
Thorsten S. schrieb: > Ich brauche eigentlich nur etwas das nach 24 Stunden true wird Auf welcher Zielplattform? Wenn du z.B. eine RTC drauf hast, dann kannst du dir einfach einen Interrupt auslösen lassen.
Ich gehe in meine Shell, und gebe ein: man settimeofday und schon bekomme ich GETTIMEOFDAY(2) Linux Programmer's Manual GETTIMEOFDAY(2) NAME gettimeofday, settimeofday - get / set time SYNOPSIS #include <sys/time.h> int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv, const struct timezone *tz); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): settimeofday(): _BSD_SOURCE usw... Und das geht auch für localtime und time. Auch Verweise auf andere Funktionen sind dort zu finden. Und das funktioniert schon seit >30 Jahren.
Das nutzt nichts wenn man meint die Grundlagen zu Strukturen und Zeigern überspringen zu können.
Lothar M. schrieb: > Auf welcher Zielplattform? ESP32 über Arduino. Keine RTC, keinen Internetzugang. Εrnst B. schrieb: > und einfach ausnutzen, > dass Jup, sehe ich ähnlich. Ich brauche einen "Trigger" immer (jeden Tag) um 0:00 Uhr. Peter schrieb: > Und das funktioniert schon seit >30 Jahren. Jo, ich habe die noch nie genutzt und fand das gefundene Beispiel einfach sehr "gewöhnungsbedürftig", Thema UNIX Sekunden ab 1970 ist mir bekannt und ja auch kein Hexenwerk...
Thorsten S. schrieb: > > Peter schrieb: >> Und das funktioniert schon seit >30 Jahren. > > Jo, ich habe die noch nie genutzt und fand das gefundene Beispiel > einfach sehr "gewöhnungsbedürftig", Thema UNIX Sekunden ab 1970 ist mir > bekannt und ja auch kein Hexenwerk... Aber Ihr wisst schon, dass ab 19-Jan-2038 03:14:07 Uhr UTC Dunkeltuten ist und der Rechner zurueck zum 01-JAN-1970 gesetzt wird? Richtige Betriebssysteme (TM) wie OpenVMS haben vierstellige Jahreszahlen, der naechste Overflow ist am 31-DEC-9999. Das ist mal vorausschauend programmiert.
Thomas W. schrieb: > Aber Ihr wisst schon, dass ab 19-Jan-2038 03:14:07 Uhr UTC Dunkeltuten > ist und der Rechner zurueck zum 01-JAN-1970 gesetzt wird? Du hast mitbekommen, dass time_t inzwischen 64 Bit hat, und damit noch ein paar Hundert Milliarden Jahre safe ist?
Εrnst B. schrieb: > Thomas W. schrieb: >> Aber Ihr wisst schon, dass ab 19-Jan-2038 03:14:07 Uhr UTC Dunkeltuten >> ist und der Rechner zurueck zum 01-JAN-1970 gesetzt wird? > > Du hast mitbekommen, dass time_t inzwischen 64 Bit hat, und damit noch > ein paar Hundert Milliarden Jahre safe ist? Da hast Du ja recht, so recht.
Übrigens geht der (32-Bit) time_t Überlauf nicht auf 0, sondern auf −2.147.483.648. Ist ein signed Wert. d.H. es wird nicht nach 1970 gesprungen, sondern nach 1901.
Ich hab mir VS-Code und die entsprechenden Erweiterngen installiert (Platformio usw). Da drück ich F12, sehe nach und mit Alt-links wieder zurück. Find ich praktisch und bin begeistert. Geht das bei Dir nicht? Nahezu jede IDE bietet diese Funktionalität, die die Definitionen "hineinzusehen", dennke ich. Nur eben andere Tasten. Bei VSCode ists F12.
Axel R. schrieb: > Nahezu jede IDE bietet diese Funktionalität, die die Definitionen > "hineinzusehen", dennke ich. Tja, denkst Du. Die von manchen so innig geliebte Arduino-IDE in der Version 1.x kann das nicht, das haben sie erst der Version 2.x beigebracht, die aber wird von vielen abgelehnt, weil zu ... irgendwas.
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.