TimeAlarms e sincronizzazione NTP senza DS1307

Buonasera, sto cercando di realizzare un programma che compia determinate task ad un certo orario, ho trovato perfetto l’uso di TimeAlarms, posseggo una Shield Ethernet e volevo sapere se era possibile sincronizzare l’orario di arduino tramite NTP e quindi fare funzionare TimeAllarms senza l’uso di un Orologio esterno, poichè il mio bellissimo DS1307 non funziona più :c Vi ringrazio in anticipo per le risposte!
Di seguito il codice

#include <TimeAlarms.h>

/*
 * 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.gov


const int timeZone = 2;     // 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 packets

void setup() 
{
  Serial.begin(9600);
  Alarm.alarmRepeat(03,14,30, feed);
  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");
      Alarm.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 displayed

void 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 message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_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 address
void 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();
}
void feed() {
Serial.println("Funziona!");
}

Non provato ma penso di si, visto che la TimeAlarms si appoggia alla lib Time
https://www.pjrc.com/teensy/td_libs_TimeAlarms.html
La lib Time necessita di setTime() per essere impostata, l'ora che ricevi da NTP la passi alla Time con questa funzione.
https://www.pjrc.com/teensy/td_libs_Time.html

Grazie per la risposta! Purtroppo continua a non funzionare! E la sveglia non si attiva!
Di seguito il codice che ho modificato

void loop()
{  
  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { //update the display only if time has changed
      prevDisplay = now();
      digitalClockDisplay();  
      setTime(hour(), minute(), second(), day(), month(), year());
    }
  }
}

Nessun hint? Non capisco cosa blocchi il timer visto che sembra che l’ora venga settata correttamente

UN pò di serial.print possono essere utili.

void loop()
{  
  if (timeStatus() != timeNotSet) 
  { Serial.print("timeNotSet:"); Serial.println(timeNotSet);
    if (now() != prevDisplay) //update the display only if time has changed
    { Serial.print("prevDisplay:"); Serial.println(prevDisplay);
      prevDisplay = now();
      Serial.print("now:"); Serial.println(prevDisplay);
      digitalClockDisplay();  
      setTime(hour(), minute(), second(), day(), month(), year());
    }
  }
}

Grazie! Sembra che qualcosa funzioni ad intervalli, ecco il codice in uscita

waiting for sync
Transmit NTP Request
Receive NTP Response
timeNotSet:0
prevDisplay:0
now:1504541229
16:07:09 4 9 2017
timeNotSet:0
timeNotSet:0
timeNotSet:0
timeNotSet:0
timeNotSet:0
timeNotSet:0
timeNotSet:0
timeNotSet:0
timeNotSet:0
timeNotSet:0
prevDisplay:1504541229
now:1504541230
16:07:10 4 9 2017
timeNotSet:0

Il tutto in loop

?? non sò che cosa vuoi fare con quel codice, ma analizzandolo:
L'orario viene settato con il valore 1504541229
per 1 secondo l'orario e il display sono uguali, perciò segnala solo timeNotSet:0 mentre il secondo if giustamente salta: if (now() != prevDisplay)
poi, dopo 1 secondo il tempo del display non è più uguale e infatti entri in quell'if e rifai il pezzo di codice dentro a quell'if

A cosa ti serve il primo if è un mistero, visto che timeNotSet è sempre a 0 e mai settato

Sinceramente avevo preso il codice da un example della libreria... vorrei semplicemente come detto che l'NTP mi settasse il tempo in modo da far funzionare il TimeAlarm

Il problema deve risiedere forse nel TimeAlarms, poichè sono riuscito a fare settare l'orario