|
1 | 1 | /**
|
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 |
3 | 3 | * to the current date and time retrieved from an NTP server on the Internet (pool.ntp.org).
|
4 | 4 | * Then the current time from the RTC is printed to the Serial port.
|
5 | 5 | *
|
6 | 6 | * 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. |
10 | 11 | *
|
11 | 12 | * Initial author: Sebastian Romero @sebromero
|
12 | 13 | */
|
13 | 14 |
|
14 | 15 | #include "RTC.h"
|
| 16 | +#include <NTPClient.h> |
| 17 | + |
| 18 | +#if defined(ARDUINO_PORTENTA_C33) |
15 | 19 | #include <WiFiC3.h>
|
| 20 | +#elif defined(ARDUINO_UNOWIFIR4) |
| 21 | +#include <WiFiS3.h> |
| 22 | +#endif |
| 23 | + |
16 | 24 | #include <WiFiUdp.h>
|
17 | 25 | #include "arduino_secrets.h"
|
18 | 26 |
|
19 | 27 | ///////please enter your sensitive data in the Secret tab/arduino_secrets.h
|
20 | 28 | char ssid[] = SECRET_SSID; // your network SSID (name)
|
21 | 29 | char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
|
22 | 30 |
|
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 |
| - |
26 | 31 | 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 |
29 | 32 | 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); |
53 | 34 |
|
54 | 35 | void printWifiStatus() {
|
55 | 36 | // print the SSID of the network you're attached to:
|
@@ -96,56 +77,21 @@ void connectToWiFi(){
|
96 | 77 | printWifiStatus();
|
97 | 78 | }
|
98 | 79 |
|
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 |
| - |
136 | 80 | void setup(){
|
137 | 81 | Serial.begin(9600);
|
138 | 82 | while (!Serial);
|
139 | 83 |
|
140 | 84 | connectToWiFi();
|
141 |
| - Serial.println("\nStarting connection to server..."); |
142 |
| - Udp.begin(LOCAL_PORT); |
143 | 85 | RTC.begin();
|
| 86 | + Serial.println("\nStarting connection to server..."); |
| 87 | + timeClient.begin(); |
| 88 | + timeClient.update(); |
144 | 89 |
|
145 | 90 | // Get the current date and time from an NTP server and convert
|
146 | 91 | // it to UTC +2 by passing the time zone offset in hours.
|
147 | 92 | // 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); |
149 | 95 | Serial.print("Unix time = ");
|
150 | 96 | Serial.println(unixTime);
|
151 | 97 | RTCTime timeToSet = RTCTime(unixTime);
|
|
0 commit comments