Uur en minuten deels uit NTP sketch krijgen

algemene C code
Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Uur en minuten deels uit NTP sketch krijgen

Berichtdoor Pexy » 04 Feb 2020, 13:41

Goedendag allemaal,

Ik ben ergens op internet een NTP sketch voor de ESP tegengekomen(ik weet niet meer waar) en die werkt.
Mijn vraag is hoe krijg ik de uur en minuten los van elkaar eruit zodat ik Serial.println(uur); en Serial.println(minuut); kan gebruiken?

Hieronder de sketch:
cpp code
/*
* Example that shows how to use NTP with a TZ timezone string.
*
* Recommended use:
* Bring up Serial monitor at 115200 *before* uploading
* Upload code and observe results
*
* Code is realeased to the public domain
* 2018-10-28 Bill Perry
*/

#include <ESP8266WiFi.h>
#include <time.h> // time() ctime()
#include <sys/time.h> // struct timeval
#include <coredecls.h> // settimeofday_cb()


////////////////////////////////////////////////////////
//
// WiFi setup
//
#include <WiFiManager.h>

#define SSID "***********"
#define SSIDPWD "***********"

////////////////////////////////////////////////////////

timeval cbtime; // when time set callback was called
bool cbtime_set = false;

// callback function that is called whenever time is set
// This is optional and can be used to trigger things when the time is set
// It is called each time NTP syncs the time.
void time_is_set (void)
{
time_t t = time(nullptr);

gettimeofday(&cbtime, NULL);
cbtime_set = true;
Serial.println("------------------ settimeofday() was called ------------------");
printf(" local asctime: %s\n", asctime(localtime(&t))); // print formated local time
}

void setup() {
Serial.begin(115200);

settimeofday_cb(time_is_set); // optional: set function to call when time is set

// DO NOT attempt to use the timezone offsets. The code is broken.
// if used, then localtime() and gmtime() won't work correctly.
// set both to zero and get real timezone & DST support by using TZ string
// enable NTP by setting NTP server
// up to 3 ntp servers can be specified
//configTime(0, 0, "server1", "server2", "server3");
configTime(0, 0, "europe.pool.ntp.org");

// set up TZ string to use a POSIX/gnu TZ string for local timezone
// TZ string information: https://www.gnu.org/software/libc/manua ... iable.html
setenv("TZ", "CET-1CEST,M3.5.0/2,M10.5.0/3", 1);

tzset(); // save the TZ variable

// turn on WIFI using SSID/SSIDPWD
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, SSIDPWD);
// don't wait, observe time changing when ntp timestamp is received

Serial.println();

}

// for testing purpose:
extern "C" int clock_gettime(clockid_t unused, struct timespec *tp);

#define PTM(w) \
Serial.print(":" #w "="); \
Serial.print(tm->tm_##w);

void printTm (const char* what, const tm* tm)
{
Serial.print(what);
PTM(isdst); PTM(yday); PTM(wday);
PTM(year); PTM(mon); PTM(mday);
PTM(hour); PTM(min); PTM(sec);
}

timeval tv;
struct timezone tz;
timespec tp;
time_t tnow;

void loop()
{

gettimeofday(&tv, &tz);
clock_gettime(0, &tp); // also supported by esp8266 code
tnow = time(nullptr);

// localtime / gmtime every second change
static time_t lastv = 0;
if (lastv != tv.tv_sec)
{
lastv = tv.tv_sec;
if(tnow % 60)
goto noprint;
#if 1
printf("tz_minuteswest: %d, tz_dsttime: %d\n", tz.tz_minuteswest, tz.tz_dsttime);
printf("gettimeofday() tv.tv_sec : %ld\n", lastv);
printf("time() time_t : %ld\n", tnow);
Serial.println();
#endif

printf(" ctime: %s", ctime(&tnow)); // print formated local time
printf(" local asctime: %s", asctime(localtime(&tnow))); // print formated local time
printf("gmtime asctime: %s", asctime(gmtime(&tnow))); // print formated gm time

// print gmtime and localtime tm members
printTm(" gmtime", gmtime(&tnow));
Serial.println();
printTm(" localtime", localtime(&tnow));
Serial.println();

Serial.println();
}
noprint:
delay(100);
}



Alvast bedankt.

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Uur en minuten deels uit NTP sketch krijgen

Berichtdoor Koepel » 04 Feb 2020, 17:58

Het komt hier vandaan: https://forum.arduino.cc/index.php?topic=516847.msg3923167#msg3923167.
Die sketch laat zien wat er zo allemaal gebeurd. Normaal gesproken heb je al die functies en variabelen niet nodig.

Zijn uitleg klopt, het is al heel lang onderdeel van de 'C' taal en wordt op de Arduino nauwelijks of verkeerd gebruikt.
Zelfs voor een Arduino Uno is de "time.h" van de 'C' taal beschikbaar.

Dat wordt een paar uur de "time.h" van de 'C' taal bestuderen: http://www.cplusplus.com/reference/ctime/.

De basis is het aantal seconden sinds 1970. Dat zit meestal in het type 'time_t', dat is een gewone 32-bits unsigned long.
Om te converteren wordt vaak de 'struct tm' gebruikt. Dan heb je alle variabelen zoals uren, minuten en seconden beschikbaar.

Maar hoe het nu zit met de tijdzone en de zomer/winter-tijd en of ze dat voor de ESP8266 correct in the library hebben zitten, dat weet ik niet.

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Uur en minuten deels uit NTP sketch krijgen

Berichtdoor Pexy » 04 Feb 2020, 20:04

Dan zal ik morgen eens goed kijken naar 'struct tm', denk dat ik daar wel iets mee kan.

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Uur en minuten deels uit NTP sketch krijgen

Berichtdoor Pexy » 05 Feb 2020, 19:23

Het is gelukt met dit stukje code:
cpp code
struct tm * timeinfo;
time(&tnow);
timeinfo = localtime(&tnow);
Serial.println(timeinfo->tm_hour);

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten