NTP haalt geen nieuwe data op met Uno/nano
2 berichten
• Pagina 1 van 1
NTP haalt geen nieuwe data op met Uno/nano
Hallo,
ben bezig paar ouwe projectjes weer nieuw lezen in te blazen (nu wet ik waarom ik overgestap ben op esp8266/esp32).
Ik heb dus een arduino nano (old bootloader) en heb deze voorzien van een enc28j60 module.
Nu wil ik deze regelmatig syncen met NTP.
Het verkrijgen van een IP adres lukt gewoon. En voor de 1e keer een tijdsynchronisatie met een NTP server lukt ook.
Maar als ik daarna wederom met NTP verbind krijg iedere keer dezelfde waarde met paar +1 of +2 terug terwijl de de voorgaande sync 1 of meerdere minuten terug ligt......
Sterker nog ..... zodra ik de utp-kabel er uit trek krijg ik nog een aantal pogingen een sync ..... zou toch niet mogen?
Ik heb zowel de standaard ethernet.h library als de laatste uipethernet.h library gebruikt .......
Dus nu gaat na verloop van tijd de klok steeds meer achteruit lopen ......
Met de esp8266/32 gaat dit wel gewoon goed. en bij de 1e sync van de uno/nano ook.
Voorheen had ik de functie alleen maar 1x aangeroepen tijdens de setup(), dan gaat het wel goed, maar nu wil ik de functie ieder uur aanroepen.
Iemand bekend met dit probleem?
ben bezig paar ouwe projectjes weer nieuw lezen in te blazen (nu wet ik waarom ik overgestap ben op esp8266/esp32).
Ik heb dus een arduino nano (old bootloader) en heb deze voorzien van een enc28j60 module.
Nu wil ik deze regelmatig syncen met NTP.
Het verkrijgen van een IP adres lukt gewoon. En voor de 1e keer een tijdsynchronisatie met een NTP server lukt ook.
Maar als ik daarna wederom met NTP verbind krijg iedere keer dezelfde waarde met paar +1 of +2 terug terwijl de de voorgaande sync 1 of meerdere minuten terug ligt......
Sterker nog ..... zodra ik de utp-kabel er uit trek krijg ik nog een aantal pogingen een sync ..... zou toch niet mogen?
Ik heb zowel de standaard ethernet.h library als de laatste uipethernet.h library gebruikt .......
Dus nu gaat na verloop van tijd de klok steeds meer achteruit lopen ......
Met de esp8266/32 gaat dit wel gewoon goed. en bij de 1e sync van de uno/nano ook.
Voorheen had ik de functie alleen maar 1x aangeroepen tijdens de setup(), dan gaat het wel goed, maar nu wil ik de functie ieder uur aanroepen.
Iemand bekend met dit probleem?
- Code: Alles selecteren
#include <UIPEthernet.h>
byte mac[6] = {0x74,0x69,0x69,0x93,0x30,0x34};
unsigned int localPort = 8888; // local port to listen for UDP packets
//IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server
IPAddress timeServer(193,204,114,232);
//IPAddress timeServer(129,6,15,28);
//IPAddress timeServer{194,109,6,2}; //ntp.xs4all.nl
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
uint16_t timeZone = 3600;
boolean lastsync = false;
void setup() {
// put your setup code here, to run once:
Serial.begin (9600);
delay(2000);
Serial.println();
Serial.println();
Serial.println("IP/NTP test.");
if(Ethernet.begin(mac)) {
Serial.print("DHCP ...");
Serial.print("localIP: ");
Serial.println(Ethernet.localIP());
Serial.print("subnetMask: ");
Serial.println(Ethernet.subnetMask());
Serial.print("gatewayIP: ");
Serial.println(Ethernet.gatewayIP());
Serial.print("dnsServerIP: ");
Serial.println(Ethernet.dnsServerIP());
} else {
Serial.println("DHCP Failed.");
}
Udp.begin(localPort);
Serial.println("Setup ready");
}
void loop() {
if (!lastsync) {
if (unsigned long t = ntpSync()){
if (adjustDstEurope(t)) {timeZone = 7200;} else {timeZone = 3600;}
if (t) {setTime(t+timeZone);}
Serial.println(F("Synced now."));
lastsync = true;
} else {
Serial.println(F("Synced failed."));
lastsync = false;
}
}
//Sync every minute (change to minute() to sync every hour.
if (second() == 0) {lastsync = false;}
Serial.println(hour());
Serial.println(minute());
Serial.println(second());
Serial.println();
// wait ten seconds before asking for the time again
delay(10000);
}
unsigned long ntpSync()
{
sendNTPpacket(timeServer); // send an NTP packet to a time server
// wait to see if a reply is available
delay(1000);
int cb = Udp.parsePacket();
if (cb) {
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
//the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
//Serial.print("Seconds since Jan 1 1900 = " );
//Serial.println(secsSince1900);
// 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);
return epoch;
} else {
//Serial.println("no packet yet");
return false;
}
}
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
// set all bytes in the buffer to 0
//Serial.print(".");
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
}
boolean adjustDstEurope(long epoch2)
{
// last sunday of march
int beginDSTDate= (31 - (5* year(epoch2) /4 + 4) % 7);
int beginDSTMonth=3;
//last sunday of october
int endDSTDate= (31 - (5 * year(epoch2) /4 + 1) % 7);
int endDSTMonth=10;
// DST is valid as:
if (((month(epoch2) > beginDSTMonth) && (month(epoch2) < endDSTMonth))
|| ((month(epoch2) == beginDSTMonth) && (day(epoch2) >= beginDSTDate))
|| ((month(epoch2) == endDSTMonth) && (day(epoch2) < endDSTDate)))
return true; // DST europe = GMT +2
else return false; // nonDST europe = GMT +1
}
sudo rm -rf /
(Don't Drink and Root)
(Don't Drink and Root)
Advertisement
Re: NTP haalt geen nieuwe data op met Uno/nano
ik geloof dat ik het probleem opgelost heb.
i.p.v. vast ip adres van ntp server gebruik ik nu dns resolve van time.nist.gov
nu gaat het alvast beter .... ff nachtje testen ......
i.p.v. vast ip adres van ntp server gebruik ik nu dns resolve van time.nist.gov
nu gaat het alvast beter .... ff nachtje testen ......
sudo rm -rf /
(Don't Drink and Root)
(Don't Drink and Root)
2 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 28 gasten