Skip to content

Commit 1ef7d0d

Browse files
committed
Use library for NTP data handling
1 parent fb6f722 commit 1ef7d0d

File tree

1 file changed

+18
-72
lines changed

1 file changed

+18
-72
lines changed

libraries/RTC/examples/RTC_NTPSync/RTC_NTPSync.ino

+18-72
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,36 @@
11
/**
2-
* This example shows how to set the RTC (Real Time Clock) on the Portenta C33
2+
* This example shows how to set the RTC (Real Time Clock) on the Portenta C33 / UNO R4 WiFi
33
* to the current date and time retrieved from an NTP server on the Internet (pool.ntp.org).
44
* Then the current time from the RTC is printed to the Serial port.
55
*
66
* Instructions:
7-
* 1. Change the WiFi credentials in the arduino_secrets.h file to match your WiFi network.
8-
* 2. Upload this sketch to Portenta C33.
9-
* 3. Open the Serial Monitor.
7+
* 1. Download the NTPClient library (https://github.com/arduino-libraries/NTPClient) through the Library Manager
8+
* 2. Change the WiFi credentials in the arduino_secrets.h file to match your WiFi network.
9+
* 3. Upload this sketch to Portenta C33 / UNO R4 WiFi.
10+
* 4. Open the Serial Monitor.
1011
*
1112
* Initial author: Sebastian Romero @sebromero
1213
*/
1314

1415
#include "RTC.h"
16+
#include <NTPClient.h>
17+
18+
#if defined(ARDUINO_PORTENTA_C33)
1519
#include <WiFiC3.h>
20+
#elif defined(ARDUINO_UNOWIFIR4)
21+
#include <WiFiS3.h>
22+
#endif
23+
1624
#include <WiFiUdp.h>
1725
#include "arduino_secrets.h"
1826

1927
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
2028
char ssid[] = SECRET_SSID; // your network SSID (name)
2129
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
2230

23-
constexpr unsigned int LOCAL_PORT = 2390; // local port to listen for UDP packets
24-
constexpr int NTP_PACKET_SIZE = 48; // NTP timestamp is in the first 48 bytes of the message
25-
2631
int wifiStatus = WL_IDLE_STATUS;
27-
IPAddress timeServer(162, 159, 200, 123); // pool.ntp.org NTP server
28-
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
2932
WiFiUDP Udp; // A UDP instance to let us send and receive packets over UDP
30-
31-
// send an NTP request to the time server at the given address
32-
unsigned long sendNTPpacket(IPAddress& address) {
33-
// set all bytes in the buffer to 0
34-
memset(packetBuffer, 0, NTP_PACKET_SIZE);
35-
// Initialize values needed to form NTP request
36-
// (see URL above for details on the packets)
37-
packetBuffer[0] = 0b11100011; // LI, Version, Mode
38-
packetBuffer[1] = 0; // Stratum, or type of clock
39-
packetBuffer[2] = 6; // Polling Interval
40-
packetBuffer[3] = 0xEC; // Peer Clock Precision
41-
// 8 bytes of zero for Root Delay & Root Dispersion
42-
packetBuffer[12] = 49;
43-
packetBuffer[13] = 0x4E;
44-
packetBuffer[14] = 49;
45-
packetBuffer[15] = 52;
46-
47-
// all NTP fields have been given values, now
48-
// you can send a packet requesting a timestamp:
49-
Udp.beginPacket(address, 123); //NTP requests are to port 123
50-
Udp.write(packetBuffer, NTP_PACKET_SIZE);
51-
Udp.endPacket();
52-
}
33+
NTPClient timeClient(Udp);
5334

5435
void printWifiStatus() {
5536
// print the SSID of the network you're attached to:
@@ -96,56 +77,21 @@ void connectToWiFi(){
9677
printWifiStatus();
9778
}
9879

99-
/**
100-
* Calculates the current unix time, that is the time in seconds since Jan 1 1970.
101-
* It will try to get the time from the NTP server up to `maxTries` times,
102-
* then convert it to Unix time and return it.
103-
* You can optionally specify a time zone offset in hours that can be positive or negative.
104-
*/
105-
unsigned long getUnixTime(int8_t timeZoneOffsetHours = 0, uint8_t maxTries = 5){
106-
// Try up to `maxTries` times to get a timestamp from the NTP server, then give up.
107-
for (size_t i = 0; i < maxTries; i++){
108-
sendNTPpacket(timeServer); // send an NTP packet to a time server
109-
// wait to see if a reply is available
110-
delay(1000);
111-
112-
if (Udp.parsePacket()) {
113-
Serial.println("packet received");
114-
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
115-
116-
//the timestamp starts at byte 40 of the received packet and is four bytes,
117-
//or two words, long. First, extract the two words:
118-
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
119-
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
120-
121-
// Combine the four bytes (two words) into a long integer
122-
// this is NTP time (seconds since Jan 1 1900):
123-
unsigned long secsSince1900 = highWord << 16 | lowWord;
124-
125-
// Now convert NTP time into everyday time:
126-
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
127-
const unsigned long seventyYears = 2208988800UL;
128-
unsigned long secondsSince1970 = secsSince1900 - seventyYears + (timeZoneOffsetHours * 3600);
129-
return secondsSince1970;
130-
}
131-
}
132-
133-
return 0;
134-
}
135-
13680
void setup(){
13781
Serial.begin(9600);
13882
while (!Serial);
13983

14084
connectToWiFi();
141-
Serial.println("\nStarting connection to server...");
142-
Udp.begin(LOCAL_PORT);
14385
RTC.begin();
86+
Serial.println("\nStarting connection to server...");
87+
timeClient.begin();
88+
timeClient.update();
14489

14590
// Get the current date and time from an NTP server and convert
14691
// it to UTC +2 by passing the time zone offset in hours.
14792
// You may change the time zone offset to your local one.
148-
auto unixTime = getUnixTime(2);
93+
auto timeZoneOffsetHours = 2;
94+
auto unixTime = timeClient.getEpochTime() + (timeZoneOffsetHours * 3600);
14995
Serial.print("Unix time = ");
15096
Serial.println(unixTime);
15197
RTCTime timeToSet = RTCTime(unixTime);

0 commit comments

Comments
 (0)