Arduino uno - NTP not work

Goodmorning,
I’m trying implementing a code for arduino 1 and ethernet shield to read time and date from NTP server (looking online too for tutorials) and I paste it in the following. Unfortunately the code doesn’t work and I don’t understand why. I enable the port forwarding service too on port 8888UDP but not work.
Can someone help me to understand where I did mistakes or give me example which works for ethernet shield.

#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
IPAddress dnServer(8, 8, 8, 8);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress ip(192, 168, 1, 105);

unsigned int localPort = 8888;      

char timeServer[] = "time.nist.gov";

const int NTP_PACKET_SIZE= 48; 

byte packetBuffer[ NTP_PACKET_SIZE ];

EthernetUDP Udp;

void setup() 
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip, dnServer, gateway, subnet);
  Udp.begin(localPort);
  Serial.print("Local port: ");
  Serial.println(Udp.localPort());
  delay(1000); 
}
void loop()
{
  sendNTPpacket(timeServer);
  delay(1000);
  if ( Udp.parsePacket() ) {
    Udp.read(packetBuffer, NTP_PACKET_SIZE); 
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);
 
    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    Serial.println(epoch);
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich 
                                            // Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour 
                                            // (86400 equals secs per day)
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute 
                                        // (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
}
 
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(char* 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();
}

many thanks
best regards

Unfortunately the code doesn't work

the code does something. What does it do? what do you see? does it compile? do you get something out of it? do you get data back from the NTP server? what have you tried to debug?have you confirmed your Ethernet board gets online?

Try using port 123 instead of 8888 (where did you get that from anyway??).

Thank you for your answers: the code compile correctly but it seems it not connect to NTP server.

infact I tried to add following debug:

if ( Udp.parsePacket() ) {
    Serial.println("connected");
    ...
  }
  else
  {
    Serial.println("not connected");
  }

but on serial monitor "not connected" string appears.

I tried with localPort=123 but it seems not receive any data from NTP server

Erm, try pool.ntp.org instead of time.nist.gov. I am confident that the correct port is 123UDP

I am using those successfully.

I vaguely remember having problems with time.nist.gov, but it was some time ago.

It's not cool to poll an NTP server every second. It will suss you out and refuse your requests.

I have change each delay from 1000 to 10000 and I try with pool.ntp.org server but the serial monitor show "not connected" again :( I don't really know how to receive packages succesfully :(

does your network connexion work? have you tried another piece of code just to ensure you have internet reachability?

The “not connected” has nothing to do with NTP. NTP is a sessionless protocol. You have no internet connectivity (TCP/IP). Try connecting to your router using DHCP. Verify all your router information.

What aarg said

The way it works is you send a request for the time and the NTP server replies with a packet containing the time. Maybe it replies, maybe not. There is no connection.

There are 2 protocols in common use on the internet, UDP and TCP.

UDP is like sending someone a letter; you post it, maybe it gets to the person you sent it to, maybe not. Maybe they write back, maybe they don't.

TCP is like a phone call (ironic as phone calls use UDP...); you set up a call and have a conversation, you only speak when you know they are on the other end to listen. If you think the connection has dropped you check. When you have finished you disconnect the call.

NTP uses UDP.