| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | /* * Time_NTP.pde * Example showing time sync to NTP time source * * This sketch uses the Ethernet library */ #include <TimeLib.h>#include <Ethernet.h>#include <EthernetUdp.h>#include <SPI.h>byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // NTP Servers:IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov// IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov// IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.govconst int timeZone = 1;     // Central European Time//const int timeZone = -5;  // Eastern Standard Time (USA)//const int timeZone = -4;  // Eastern Daylight Time (USA)//const int timeZone = -8;  // Pacific Standard Time (USA)//const int timeZone = -7;  // Pacific Daylight Time (USA)EthernetUDP Udp;unsigned int localPort = 8888;  // local port to listen for UDP packetsvoid setup() {  Serial.begin(9600);  while (!Serial) ; // Needed for Leonardo only  delay(250);  Serial.println("TimeNTP Example");  if (Ethernet.begin(mac) == 0) {    // no point in carrying on, so do nothing forevermore:    while (1) {      Serial.println("Failed to configure Ethernet using DHCP");      delay(10000);    }  }  Serial.print("IP number assigned by DHCP is ");  Serial.println(Ethernet.localIP());  Udp.begin(localPort);  Serial.println("waiting for sync");  setSyncProvider(getNtpTime);}time_t prevDisplay = 0; // when the digital clock was displayedvoid loop(){    if (timeStatus() != timeNotSet) {    if (now() != prevDisplay) { //update the display only if time has changed      prevDisplay = now();      digitalClockDisplay();      }  }}void digitalClockDisplay(){  // digital clock display of the time  Serial.print(hour());  printDigits(minute());  printDigits(second());  Serial.print(" ");  Serial.print(day());  Serial.print(" ");  Serial.print(month());  Serial.print(" ");  Serial.print(year());   Serial.println(); }void printDigits(int digits){  // utility for digital clock display: prints preceding colon and leading 0  Serial.print(":");  if(digits < 10)    Serial.print('0');  Serial.print(digits);}/*-------- NTP code ----------*/const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of messagebyte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packetstime_t getNtpTime(){  while (Udp.parsePacket() > 0) ; // discard any previously received packets  Serial.println("Transmit NTP Request");  sendNTPpacket(timeServer);  uint32_t beginWait = millis();  while (millis() - beginWait < 1500) {    int size = Udp.parsePacket();    if (size >= NTP_PACKET_SIZE) {      Serial.println("Receive NTP Response");      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer      unsigned long secsSince1900;      // convert four bytes starting at location 40 to a long integer      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;      secsSince1900 |= (unsigned long)packetBuffer[43];      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;    }  }  Serial.println("No NTP Response :-(");  return 0; // return 0 if unable to get the time}// send an NTP request to the time server at the given addressvoid sendNTPpacket(IPAddress &address){  // set all bytes in the buffer to 0  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();}
 |