AceTimeClock
1.2.0
Clock classes for Arduino that can synchronize from an NTP server or an RTC chip
|
A Clock that retrieves the time from an NTP server. More...
#include <NtpClock.h>
Public Member Functions | |
NtpClock (const char *server=kNtpServerName, uint16_t localPort=kLocalPort, uint16_t requestTimeout=kRequestTimeoutMillis) | |
Constructor. More... | |
void | setup (const char *ssid=nullptr, const char *password=nullptr, uint16_t connectTimeoutMillis=kConnectTimeoutMillis) |
Set up the WiFi connection using the given ssid and password, and prepare the UDP connection. More... | |
const char * | getServer () const |
Return the name of the NTP server. | |
bool | isSetup () const |
Return true if setup() suceeded. | |
acetime_t | getNow () const override |
Return the number of seconds since the AceTime epoch (2000-01-01T00:00:00Z). More... | |
void | sendRequest () const override |
Send a time request asynchronously. | |
bool | isResponseReady () const override |
Return true if a response is ready. | |
acetime_t | readResponse () const override |
Returns number of seconds since AceTime epoch (2000-01-01). More... | |
![]() | |
Clock ()=default | |
Default constructor. | |
~Clock ()=default | |
We deliberately avoid using a virtual destructor. More... | |
virtual void | setNow (acetime_t) |
Set the time to the indicated seconds. More... | |
Static Public Attributes | |
static const char | kNtpServerName [] = "us.pool.ntp.org" |
Default NTP Server. | |
static const uint16_t | kLocalPort = 2390 |
Default port used for UDP packets. | |
static const uint16_t | kRequestTimeoutMillis = 1000 |
Request time out milliseconds. | |
static const uint16_t | kRequestTimeout = kRequestTimeoutMillis |
Deprecated. More... | |
static const uint16_t | kConnectTimeoutMillis = 10000 |
Number of millis to wait during connect before timing out. | |
![]() | |
static const acetime_t | kInvalidSeconds = LocalTime::kInvalidSeconds |
Error value returned by getNow() and other methods when this object is not yet initialized. | |
A Clock that retrieves the time from an NTP server.
This class has the deficiency that the DNS name resolver WiFi.hostByName() is a blocking call. So every now and then, it can take 5-6 seconds for the call to return, blocking everything (e.g. display refresh, button clicks) until it times out.
TODO: Create a version that uses a non-blocking DNS look up.
Warning: If you are using an ESP8266, AND you are using the analogRead()
function, calling analogRead()
too quickly will cause the WiFi connection to disconnect after 5-10 seconds. Calling NtpClock::setup() will not fix the disconnect. See https://github.com/esp8266/Arduino/issues/1634 and https://github.com/esp8266/Arduino/issues/5083. The solution is to add a slightly delay between calls to analogRead(). I don't know what the minimum value should be, but using a 10ms delay seems to work for me.
Borrowed from https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/NTPClient/NTPClient.ino and https://github.com/PaulStoffregen/Time/blob/master/examples/TimeNTP/TimeNTP.ino
Definition at line 48 of file NtpClock.h.
|
inlineexplicit |
Constructor.
server | name of the NTP server (default us.pool.ntp.org) |
localPort | used by the UDP client (default 8888) |
requestTimeout | milliseconds for a request timeout (default 1000) |
Definition at line 71 of file NtpClock.h.
|
overridevirtual |
Return the number of seconds since the AceTime epoch (2000-01-01T00:00:00Z).
Returns kInvalidSeconds if an error has occured.
This is a blocking call. Some clocks (e.g. NTP client) this may take many seconds. On those clocks, use the asynchronous methods (sendRequest(), isResponseReady(), and readResponse()) instead.
Implements ace_time::clock::Clock.
Definition at line 58 of file NtpClock.cpp.
|
overridevirtual |
Returns number of seconds since AceTime epoch (2000-01-01).
Return kInvalidSeconds if there is an error. Valid only if isResponseReady() returns true.
Reimplemented from ace_time::clock::Clock.
Definition at line 123 of file NtpClock.cpp.
void ace_time::clock::NtpClock::setup | ( | const char * | ssid = nullptr , |
const char * | password = nullptr , |
||
uint16_t | connectTimeoutMillis = kConnectTimeoutMillis |
||
) |
Set up the WiFi connection using the given ssid and password, and prepare the UDP connection.
If the WiFi connection was set up elsewhere, you can call the method with no arguments to bypass the WiFi setup.
ssid | wireless SSID (default nullptr) |
password | password of the SSID (default nullptr) |
connectTimeoutMillis | how long to wait for a WiFi connection (default 10000 ms) |
Definition at line 21 of file NtpClock.cpp.
|
static |