www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

avtomatsko preklamplnaje ure med zimskim in poletnim časom

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
damjango
Član
Član



Pridružen-a: Pon 03 Sep 2012 7:56
Prispevkov: 721
Aktiv.: 5.08
Kraj: Murska Sobota

PrispevekObjavljeno: Ned Okt 29, 2023 9:01 pm    Naslov sporočila:  avtomatsko preklamplnaje ure med zimskim in poletnim časom Odgovori s citatom

Že celi dan se mučim, kako narediti sinhronizacijo ure preko etherneta in da se bo ura avtomatsko znala premaknoti med poletnim in zimskim časov. Tudi Chat GPT mi ne zna napisati pravilni program brez napak to, kar jaz hočem imeti.

Koda:

#include <TimeLib.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include <Timezone.h> // Dodajte Timezone knjižnico

// Definirajte svoje podatke za Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress timeServer(193, 2, 4, 2);
const int localPort = 8888;

EthernetUDP Udp;
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};
TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60};
Timezone myTZ(CEST, CET);

void setup() {
  // Vaša obstoječa inicializacija
  Ethernet.begin(mac);
  Udp.begin(localPort);
  setSyncProvider(getNtpTime);
}

void loop() {
  // Vaša obstoječa zanka
  // Preverite trenutni čas in se prepričajte, da se time zone pravilno nastavi
  if (timeStatus() != timeNotSet) {
    TimeChangeRule *tcr;
    if (myTZ.utcIsDST(now())) {
      tcr = &CEST;
      myTZ.setTimeZone(2);
    } else {
      tcr = &CET;
      myTZ.setTimeZone(1);
    }
    TimeChangeRule newTcr = myTZ.selectNextRule(now());
    if (newTcr != *tcr) {
      myTZ = Timezone(newTcr, newTcr);
    }

    // Nadaljujte s svojo obdelavo
  }
}


To je programska koda, ki jo je izpisal chat GPT, kar se meni zdi najbolj preprosto, ampak očitno neka funkcija ni pravilno definirana v knjižnici "Timezone.h"

javi napako:

getNtpTime ni deklarirani

označi mi to vrstico:
Koda:
setSyncProvider(getNtpTime);


Koda, ko samo sinhronizira uro preko etherneta brez tega timezone in premikanja ure deluje. Ampak, potem moram na vsake pol leta ročno spreminjati časovni pas v programu. Drugače imam to tudi rešeno z tipko.

Mogoče se komu sanja, kako narediti program, da bo sam prepoznal, kdaj se bo morala ura spremeniti iz poletnega v zimski čas.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3356
Aktiv.: 16.96

PrispevekObjavljeno: Pon Okt 30, 2023 7:11 am    Naslov sporočila:   Odgovori s citatom

Off topic:

Počakaj do 2026, pa ne bo te potrebe Smile

-----Potem pa ona živalca zavije čokolado -----
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4592
Aktiv.: 20.59
Kraj: Kobarid

PrispevekObjavljeno: Pon Okt 30, 2023 9:18 am    Naslov sporočila:   Odgovori s citatom

Zakaj ne gledaš datum? Med tem in tem dnem imaš UTC +1 sicer +2
_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
damjango
Član
Član



Pridružen-a: Pon 03 Sep 2012 7:56
Prispevkov: 721
Aktiv.: 5.08
Kraj: Murska Sobota

PrispevekObjavljeno: Pon Okt 30, 2023 11:03 am    Naslov sporočila:   Odgovori s citatom

Zdaj deluje naredil sem logiko, ki preverja UTC in Local time. No vsaj bi moglo delovatri, to pa bom videl komaj konec marca naslednje leto. zdaj pa še dodam zpis na lcd in zraven poleg še merjenje temperature znotraj in zunaj.

Koda:

#include <TimeLib.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include <Timezone.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress timeServer(193, 2, 4, 2);
const int timeZone = 2; // Privzeta vrednost za zimski čas
EthernetUDP Udp;
unsigned int localPort = 8888;

TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};   // Poletni čas
TimeChangeRule CET = {"CET", Last, Sun, Oct, 3, 60};     // Zimski čas
Timezone myTZ(CEST, CET);
//------void setup--------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {
    while (1) {
      delay(10000);
    }
  }
  Udp.begin(localPort);
}
//----konec voide setup-------------------------------------------------------------------------------
time_t prevDisplay = 0;

void loop() {
  Udp.begin(localPort);
  setSyncProvider(getNtpTime);

  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) {
      prevDisplay = now();
      digitalClockDisplay();
    }
  }

}

//---------konec void loop--------------------------------------------------------------------------

void digitalClockDisplay() {
  time_t utcTime = now(); // Trenutni čas v UTC
  time_t localTime = myTZ.toLocal(utcTime); // Pretvorba v lokalni čas

  //--izpis poletnega časa------------
  if (myTZ.locIsDST(utcTime)) {
    Serial.print(hour(localTime));
    printDigits(minute(localTime));
    printDigits(second(localTime));
    Serial.print(" ");
    Serial.print(day(localTime));
    Serial.print(" ");
    Serial.print(month(localTime));
    Serial.print(" ");
    Serial.print(year(localTime));
  }
  //--izpis zimskega časa------------
  else {
    Serial.print(hour(utcTime));
    printDigits(minute(utcTime));
    printDigits(second(utcTime));
    Serial.print(" ");
    Serial.print(day(utcTime));
    Serial.print(" ");
    Serial.print(month(utcTime));
    Serial.print(" ");
    Serial.print(year(utcTime));
  }
  Serial.println();
}

void printDigits(int digits) {
  Serial.print(":");
  if (digits < 10) {
    Serial.print('0');
  }
  Serial.print(digits);
}

const int NTP_PACKET_SIZE = 48;
byte packetBuffer[NTP_PACKET_SIZE];

time_t getNtpTime() {
  while (Udp.parsePacket() > 0);
  sendNTPpacket(timeServer);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Udp.read(packetBuffer, NTP_PACKET_SIZE);
      unsigned long secsSince1900 =  (unsigned long)packetBuffer[43] |
                                     (unsigned long)packetBuffer[42] << 8 |
                                     (unsigned long)packetBuffer[41] << 16 |
                                     (unsigned long)packetBuffer[40] << 24;
      time_t utcTime = secsSince1900 - 2208988800UL;
      time_t localTime = myTZ.toLocal(utcTime); // Pretvorba v lokalni čas
      return localTime;
    }
  }
  return 0;
}

void sendNTPpacket(IPAddress &address) {
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  packetBuffer[0] = 0b11100011;
  packetBuffer[1] = 0;
  packetBuffer[2] = 6;
  packetBuffer[3] = 0xEC;
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;

  Udp.beginPacket(address, 123);
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1791
Aktiv.: 8.03

PrispevekObjavljeno: Tor Okt 31, 2023 4:51 pm    Naslov sporočila:   Odgovori s citatom

Tale API:
https://timeapi.io/api/Time/current/zone?timeZone=Europe/Ljubljana
vrne vse kar potrebuješ okrog časa in datuma na določeni lokaciji (timeZone parameter).
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 78 dni


Powered by phpBB © 2001, 2005 phpBB Group