NTP server a letný čas pre Arduino Uno

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

NTP server a letný čas pre Arduino Uno

Príspevok od používateľa roboulbricht » 29 Dec 2016, 21:57

Na Google+ prebehla diskusia o čase z NTP servera a jeho prípadnej konverzie do našej časovej zóny a správneho výpočtu letného času, tak som všetko zosumarizoval a dopísal vzorové algoritmy. Rovno upozorňujem na to, že AVR-LIBC 2.0 má v sebe chybu a letný čas počíta zle. Ale našiel som aj opravený algoritmus. Všetky zdrojáky sú pre 8bit AVR. Čiže Arduino Uno alebo mikrokontroléry ATmega a ATtiny.
  • time_avr_ntp - Nastavenie časovej zóny pre Slovensko.
  • time_avr_dst - Demonštrácia chybného výpočtu letného času v AVR-LIBC 2.0.
  • time_avr_dst_fixed - Správny algoritmus výpočtu letného času.
Komu stačí len správny algoritmus (autor je Edgar Bonet).

Kód: Vybrať všetko

int eu_dst(const time_t * timer, int32_t * z)
{
  uint32_t t = *timer;
  if ((uint8_t)(t >> 24) >= 194) t -= 3029443200U;
  t = (t + 655513200) / 604800 * 28;
  if ((uint16_t)(t % 1461) < 856) return 3600;
  else return 0;
}
Použije sa to takto.

Kód: Vybrať všetko

#include <time.h>

set_zone(1 * ONE_HOUR);
set_dst(eu_dst);
Popis
http://www.arduinoslovakia.eu/blog/2016 ... rduino-uno

Zdrojáky
https://github.com/RoboUlbricht/arduino ... aster/time
0

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

Re: NTP server a letný čas pre Arduino Uno

Príspevok od používateľa roboulbricht » 22 Júl 2017, 10:19

Rovnaká téma, ale iný mikrokontrolér. ESP8266 je medzi užívateľmi Arduina obľúbený vďaka možnosti programovať ho priamo cez IDE. Na spojenie s NTP serverom nájdete veľa príkladov, ale opäť sa už nik nenamáha s prevodom času do letného a zimného času (prípadne to urobí zle s pomocou bulharskej konštanty). Konverziu času ľahko urobíte pomocou dvoch knižníc. A použije sa to takto. Tu sú len úryvky podstatného kódu, zvyšok nájdete na serveri GitHub a v popise článku.

Kód: Vybrať všetko

#include <TimeLib.h>
#include <Timezone.h>
...
//Central European Time (Frankfurt, Paris)
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};     //Central European Summer Time
TimeChangeRule CET = {"CET", Last, Sun, Oct, 3, 60};       //Central European Standard Time
Timezone CE(CEST, CET);
...
// now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
    Serial.println(epoch);

    TimeChangeRule *tcr;
    time_t utc;
    utc = epoch;

    printTime(utc, "UTC", "Universal Coordinated Time");
    printTime(CE.toLocal(utc, &tcr), tcr -> abbrev, "Bratislava");

Popis
http://www.arduinoslovakia.eu/blog/2017 ... -letny-cas

Zdroják
https://github.com/RoboUlbricht/arduino ... ntp_client
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok