|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
damjango Član
Pridružen-a: Pon 03 Sep 2012 7:56 Prispevkov: 721 Aktiv.: 5.08 Kraj: Murska Sobota
|
Objavljeno: Ned Okt 29, 2023 9:01 pm Naslov sporočila: avtomatsko preklamplnaje ure med zimskim in poletnim časom |
|
|
Ž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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Pon Okt 30, 2023 7:11 am Naslov sporočila: |
|
|
Off topic:
Počakaj do 2026, pa ne bo te potrebe
-----Potem pa ona živalca zavije čokolado ----- |
|
Nazaj na vrh |
|
|
SimonS Član
Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4592 Aktiv.: 20.59 Kraj: Kobarid
|
Objavljeno: Pon Okt 30, 2023 9:18 am Naslov sporočila: |
|
|
Zakaj ne gledaš datum? Med tem in tem dnem imaš UTC +1 sicer +2 _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
|
damjango Član
Pridružen-a: Pon 03 Sep 2012 7:56 Prispevkov: 721 Aktiv.: 5.08 Kraj: Murska Sobota
|
Objavljeno: Pon Okt 30, 2023 11:03 am Naslov sporočila: |
|
|
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 |
|
|
Proteus Član
Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1790 Aktiv.: 8.02
|
|
Nazaj na vrh |
|
|
|
|
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
|