Update NTPClient.cpp

Until now the fraction of the second was not taken into account. Therefore the resulting time offset is up to 1000 ms. Using the provided Information increases the accuracy of the synchronization to 20-30 milliseconds. And it requires just two lines of code.

https://imgur.com/a/aVjvHON
In this plot both methods are compared. Plotted is the time difference in respect to a PPS signal provided by a GPS receiver.  For comparison the time was synchronized over 1000 times and the resulting time difference filled into the respective histogram.
This commit is contained in:
zeflo 2021-03-04 17:35:14 +01:00 committed by GitHub
parent d7d8b4512b
commit a225c1cc83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -114,6 +114,12 @@ bool NTPClient::forceUpdate() {
this->_currentEpoc = secsSince1900 - SEVENZYYEARS; this->_currentEpoc = secsSince1900 - SEVENZYYEARS;
// get also the most significant 16 bits of the fraction of the second
unsigned long fracWord = word(this->_packetBuffer[44], this->_packetBuffer[45]);
// Account for fraction of the second.
this->_lastUpdate -= (fracWord/66); // should be devided by 2^16/1000 = 65.536 but 66 is close enough
return true; // return true after successful update return true; // return true after successful update
} }
@ -207,4 +213,4 @@ void NTPClient::sendNTPPacket() {
void NTPClient::setRandomPort(unsigned int minValue, unsigned int maxValue) { void NTPClient::setRandomPort(unsigned int minValue, unsigned int maxValue) {
randomSeed(analogRead(0)); randomSeed(analogRead(0));
this->_port = random(minValue, maxValue); this->_port = random(minValue, maxValue);
} }