Ricevere dati dal server esterno su richiesta di arduino

Ciao a tutto,
il titolo non è molto chiaro quindi mi spiego meglio:

Ho un arduino che mi fa da domotica ma ho dei problemi con l'orario, sino ad ora utilizzavo "time.nist.gov" per ricevere l'orario però non considerava l'ora legale.

L'altra idea era di creare una pagine sul mio server che appena aperta mandata un get ad arduino con i dati dell'orario però così facendo se mi salta la corrente arduino rimane senza orario sino a quando non visualizzo la pagina sul mio server.

Dato che riesco a ricevere ed inviare dati tramite get volevo fare una cosa del genere:
Arduino invia un get ad una pagina ad hoc sul mio server che "senza aprire nessun browser" gli risponde con i dati che mi serveno.
Non riesco perché quando invio dati ad arduino lo faccio sempre da un browser visualizzando la pagina che si occupa di fare il get all'indirizzo di arduino coni dati.

In rete non ho trovato niente che faccio al caso mio ma solo tanti tutorial per utilizzare "time.nist.gov" .

Secondo voi come posso risolvere il problema?

Grazie millle

Senza complicarti chissà come la vita, semplicemente ... te la calcoli ! :smiley:

Guglielmo

Grazie mille per la risposta.
Era una delle soluzioni che avevo pensato però volevo unire l'utile al dilettevole e capire come scambiare altri dati e non solo l'ora.

gpb mi ha anticipato. Se il protocollo NTP è stato inventato apposta per distribuire l’ora, perché mai mettere in piedi un accrocchio, il cui funzionamento corretto è tutto da mettere a punto e verificare, che fa la stessa cosa?

Visto che NTP deve funzionare OVUNQUE, ovviamente deve distribuire l’orario UTC, eventuali correzioni locali (fuso orario e DST/Ora legale) non possono che essere a carico dell’utilizzatore. Il fuso è fisso (a meno di non spostarsi, ma in tal caso aggiornarlo dinamicamente è davvero complesso), mentre il DST cambia nel corso dell’anno. gpb ha già postato una funzione per calcolare l’ora legale partendo dalla data, io te ne posto un’altra trovata in giro, che però non ho ancora testato in tutte le possibili date, quindi usa pure quella che preferisci:

byte dstOffset () {
			/* This is valid for the EU, for other places see
			* http://www.webexhibits.org/daylightsaving/i.html
			*
			* Someone please check the implementation anyway :D.
			*/
			byte d = day (), m = month (), y = year (), h = hour ();
			if ((m == 3 && d >= (31 - (5 * y / 4 + 4) % 7) && h >= 1) ||
			 (m > 3 && m < 10) ||
			 (m == 10 && d <= (31 - (5 * y / 4 + 1) % 7) && h < 1))
				return 1;
			else
				return 0;
}

Se usi la TimeLib, puoi banalmente fare qualcosa tipo:

adjustTime ((utcOffset + dstOffset ()) * SECS_PER_HOUR);

Dopo che la sincronizzazione è avvenuta.

PS: Al posto di time.nist.gov puoi usare it.pool.ntp.org, dovrebbe essere un po’ più rapido a rispondere.

Grazie per la risposta, sicuramente con il tuo metodo risolvo il problema ma in realtà questo problema mi ha aperto il dubbio sul modo di scambiare dati tra Arduino e sever web esterno anche per questo il titolo non focalizzava sull'orario.

Mi interessa questo post... Sukko, comunque sto usando da poco il codice da te postato e pare funzionare :wink: Mi ha restituito un +1 per questo periodo e va bene. Bisogna vedere a Ottobre, per ora lo tengo in test. Grazie!

Sukko, comunque per quella funzione che hai trovato c'è un problema oppure sbaglio ad applicarla io? Io utilizzo il ds3231 con la sua libreria, ma il problema sta nel fatto che io aggiungo quel dstoffset all'ora e così facendo aumenta di uno oppure no. Ma il problema che sorge è questo: se per esempio l'ora arriva alla mezzanotte in questi giorni d'estate, il giorno non cambierà se non all'una di notte sempre di quel giorno, questo perché in realtà quando mi segna mezzanotte per l'rtc sono le 23... forse sbaglio io a applicarla, ma si potrebbe applicare proprio nella funzione di hour(), in modo tale che anche il giorno si aggiorni di conseguenza?

Se la stai applicando con adjustTime() come detto sopra, dovrebbe pensare a tutto la TimeLib.

Forse non ho la libreria giusta: mi dice che l'utcoffset non è dichiarato

const int utcoffset = 1;

:smiley:

E' semplicemente lo scostamento rispetto a UTC (il fuso orario, insomma): in Italia siamo un'ora avanti.

Ah ecco :slight_smile: io pensavo era qualcosa sempre della libreria! Allora niente, grazie :slight_smile:

P.S. Però meglio byte se no Guglielmo e Astro ti menano :smiley: :smiley: :grin:

As_Needed:
P.S. Però meglio byte se no Guglielmo e Astro ti menano :smiley: :smiley: :grin:

Vedi però che a forza di "bastonate" imparate ... :smiling_imp: :smiling_imp: :smiling_imp: ... :smiley: :smiley: :smiley: :smiley: :smiley:

Guglielmo

P.S.: però io metterei "char' che è con segno, dato che lo scostamento UTC può essere anche negativo :wink:

ahaha Ecco la grande entità :astonished: :grin: :grin: 8) :wink: :smiley:

Riguardo al char, ovviamente è vero, però in questo caso siccome non credo la stazione la sposterò da questo fuso orario non penso mi serva :wink: Però siccome tanto vale sempre un byte, tanto vale mettere char :slight_smile:

Strano che io ho questa libreria TimeLib
e praticamente dopo aver inserito la funzione e dichiarato con il famoso char la constante utc, ho messo nel setup così:

setSyncProvider(RTC.get);
adjustTime ((utcOffset + dstOffset ()) * SECS_PER_HOUR);

E non mi aggiunge un'ora... ho sbagliato qualcosa? L'ora adesso impostata sull'rtc è un'ora indietro, ovvero quella invernale.

Infatti byte non va bene, per i motivi già detti da gpb. Io personalmente uso signed char, ma char da solo dovrebbe andare bene uguale. Qua ho messo int per semplicità.

Sull'RTC l'ora dovrebbe essere impostata in UTC secondo tutto il discorso fatto finora, quindi 2 ore indietro rispetto ad ora. Se è sull'ora solare italiana (1 ora indietro rispetto ad ora) allora elimina l'utcoffset.

Si infatti nemmeno mi serve l'offset visto che l'ho impostato l'rtc sull'ora invernale italiana, ma comunque continua a non aggiungere l'ora in più

setSyncProvider(RTC.get);
adjustTime (dstOffset () * SECS_PER_HOUR);

Forse chiami adjustTime() troppo presto e la TimeLib non ha ancora avuto modo di interrogare l'RTC e quindi non conosce ancora la data?

Io quella funzione la uso con un GPS, dove il SyncProvider non si usa, per cui non so dirti di più.

SukkoPera:
Forse chiami adjustTime() troppo presto e la TimeLib non ha ancora avuto modo di interrogare l'RTC e quindi non conosce ancora la data?

Io quella funzione la uso con un GPS, dove il SyncProvider non si usa, per cui non so dirti di più.

E' strano, perché comunque la funzione funziona, è l'adjust che non fa. Sinceramente ho provato anche a mettere l'adjust nel loop e stessa cosa. Comunque l'offset ci vuole in ogni caso se no dopo quando diventa 0 è un casino e quando invece è uno poi resta la stessa ora. Comunque anche mettendo tutte e due le versioni di adjust sempre la stessa cosa.

P.S. E se provassi a mettere in qualche modo la funzione nel file h della timelib?

Non modificare la TimeLib, non è necessario.

Sei sicuro che l'ora dell'RTC non sia indietro di 2?

SukkoPera:
Non modificare la TimeLib, non è necessario.

Sei sicuro che l'ora dell'RTC non sia indietro di 2?

No no l'rtc è indietro di un'ora... Non so, la funzione dst funziona, perché se aggiungo ad esempio
hour()+dstOffset ()

Segna un'ora in più, ma il comando adjust proprio non ne vuole sapere