swRTC

leo72:
Boh, io ho trovato questo:
http://www.inrim.it/ntp/howtosync_i.shtml
Pare che fornisca l'orario in formato legale italiano, danno un software di sincronizzazione: magari osservando il sorgente si può vedere il protocollo usato e provare ad implementarlo.

ho seguito la procedura, per win7, si tratta solo di usare ntp.inrim.it come server

e' quindi gia' inclusa l'ora legale ?

Testato:
e' quindi gia' inclusa l'ora legale ?

No, semplicemente ti configura il relativo servizio per usare quel server con tutte le relative configurazioni, del servizio, per convertire l'orario UTC in quello Italiano con relativo cambio automatico, che fa il servizio, per l'ora legale.
Lo standard NTP è perfettamente descritto e si basa sull'uso dell'orario UTC in modo che sia svincolato dalle varie zone temporali e/o l'uso dell'ora legale, solo in questo modo è possibile utilizzare in tutto il mondo un qualunque server NTP.

@Daniela:
la funzione già c'è. La swRTC2 che ho rilinkato qualche post su fa questo per te. Ogni anno, calcola l'ultima domenica del mese di marzo e quella del mese di ottobre, poi si preoccupa di mandare avanti o indietro l'orologio se si è nella condizione temporale di doverlo fare (alle ore 2:00 nel primo caso ed alle ore 3:00 nel secondo). Addirittura tiene anche conto del fuso orario così che non si debba neanche stare a regolare l'orario dato da un server NTP per adeguarlo all'ora in vigore in Italia, ossia UTC+1.

Poi non so, volete codici, formule ecc... Ce l'avete! Sono nella swRTC2. :sweat_smile:

anche io ho sempre visto cosi' la cosa, quello che mi ha fatto pensare, credo anche a leo, e' che il servizio viene cosi' illustrato

I server NTP dell'I.N.RI.M. permettono di sincronizzare l'orologio interno di un calcolatore alla scala di tempo nazionale italiana UTC(IT)

cosa e' incluso in UTC(IT) ?

leo72:
@Daniela:
la funzione già c'è. La swRTC2 che ho rilinkato qualche post su fa questo per te.
Poi non so, volete codici, formule ecc... Ce l'avete! Sono nella swRTC2. :sweat_smile:

Leo ho guardato la tua libreria ieri :smiley:
Ho visto la funzione ma mi sembrava richiamasse almeno un altra sottofunzione... alla fine mi risultava difficile estrarre solo il calcolo per il passaggio all'ora legale.
Avrei dovuto estrapolare troppo codice ed ho preferito abbandonare l'attuale mia libreria RTC e testare una con più funzioni.

@Test

I server NTP dell'I.N.RI.M. permettono di sincronizzare l'orologio interno di un calcolatore alla scala di tempo nazionale italiana UTC(IT)

Aveva ingannato anche me la prima volta.
Ma quando ho fatto la prima sincronizzazione ero indietro di 1 ora :slight_smile:

Testato:
cosa e' incluso in UTC(IT) ?

E' solo una notazione per dire che l'ora UTC è da considerarsi corretta per quella Italiana, il punto chiave della questione è che il protocollo NTP è basato sull'ora UTC e non può essere diversamente, è uno standard mondiale perfettamente definito.
Se cerchi su Wikipedia Italia trovi una descrizione abbastanza corretta di cosa è NTP e vari link di approfondimento.
Non ti scordare che sul pc hai un servizio, parlando di Windows, che fa da client NTP che tu configuri per la località in quale ti trovi, poi che usi un server NTP in America, in Giappone, in Russia, in Italia non cambia nulla perché il dato che ricevi è identico per tutti.

thanks,
quindi scusa pero' a questo punto non capisco se la correzione +1 rispetto a utc e' presente o no ?
se la correzione e' presente direttamente su questo server, un americano che lo usa su un sup so americano avra' un'orario sbagliato.

oppure non e' vero quello che loro dichiarano (utc)it ma e' un utc e basta, e poi il servizio "OraWindows" aggiunge sia l'ora in piu' per italia, sia l'ora in piu' per ora legale.

Daniela dice che ha ricevuto un'ora indietro, visto che siamo ancora nell'ora solare, vuol dire che non include proprio nulla.
Perche' scrivono utc(it) ?

Testato:
thanks,
quindi scusa pero' a questo punto non capisco se la correzione +1 rispetto a utc e' presente o no ?

Non c'è nessuna correzione, e non ci può essere se è un server NTP, quella è solo una notazione per indicare che l'ora UTC è da considerarsi localizzata sul ricevente, ma non perché loro trasmettono l'orario Italiano, ma perché viene corretta da un qualche sistema locala sull'hardware che riceve l'informazione.
Infatti se leggi la loro procedura per settare il server sul pc semplicemente ti dicono di inserirlo nella apposita finestra di configurazione del client NTP di Windows, poi è il client a modificare l'orario UTC in orario locale in base alla timezone che scegli e l'eventuale attivazione per il cambio ora legale in automatico.

@Daniela:
sì, ma sono tutte funzioni contenute nella libreria stessa...

Cmq continuo a non vedere realmente il problema. Prendete l'ora dal server, aggiungeteci 1 ora per avere l'orario italiano e poi l'eventuale ora se siamo nel periodo compreso fra l'ultima di marzo e l'ultima di ottobre. Dove sta il problema?

leo72:
Cmq continuo a non vedere realmente il problema. Prendete l'ora dal server, aggiungeteci 1 ora per avere l'orario italiano e poi l'eventuale ora se siamo nel periodo compreso fra l'ultima di marzo e l'ultima di ottobre. Dove sta il problema?

Quello che dico pure io, però mi pare di capire che Daniela non sa come determinare il giorno della settimana ecco perché gli ho consigliato di mettere in una tabelle le varie coppie di date esatte per i prossimi 10 anni, così non deve determinare nulla, basta che confronta la data corrente con quelle contenute nella tabella.

Basta che calcoli il giorno della settimana a partire da uno noto che valga poi per i secoli a venire XD
Ad esempio, assuma come epoca il 1° gennaio 2012, che era domenica. Da quel dì, basta che trovi il giorno rispetto all'anno e da lì calcolare poi il giorno della settimana.

Esempio:
voglio sapere che giorno è il 20 ottobre 2012.

Risoluzione:
calcolo i giorni trascorsi dallo 01/01/2012. Sono 293.
293 mod 7=6
Adesso so che 0=lun, 1=mar ecc... 6=sab per cui so che il 20 ottobre 2012 sarà sabato.

leo72:
Basta che calcoli il giorno della settimana a partire da uno noto che valga poi per i secoli a venire XD

Era lo stesso pensiero che avevo avuto io... ma poi la pigrizia affiancata ad una libreria aggiornata :slight_smile:

Teoricamente la libreria è indipendente dalla versione dell'IDE usata visto che modifica i timer del micro a basso livello, quindi agendo direttamente sui registri e non passando da librerie del core.

Servirebbe un debug fatto sulla seriale: stampando continuamente l'ora ottieni cose strane?
Il log che fai riporta data ed ora: queste sono prese direttamente con le funzioni della libreria oppure converti il timestamp che ricevi dal server?

Questa è la funzione che invochi:

// set the internal clock using a timestamp using the epoch passed as argument
byte swRTC::setClockWithTimestamp(unsigned long timeT, int yearRef) {
	unsigned long dayT;
	
	timeT+=86400; //days in the calendar start from Jan., 1 not from Jan., 0
	dayT = timeT/(60L*60L*24L);
	float remaining = timeT-dayT*(60L*60L*24L);
	int yearT = (dayT / 365.2422);
	float dayRemaining = dayT-yearT*365.2422;
	
	if (yearRef==NULL) {
		yearRef=1970;
	} else if (yearRef<1900) {
		yearRef=1900;
	} else if (yearRef>1970) {
		yearRef=1970;
	} else if ((yearRef!=1900) && (yearRef!=1970)) {
		yearRef=1970;
	}
	
	yearT+=yearRef;
	if (dayRemaining>=365.2422)
		return 1;//my math is wrong!
	if (yearT<yearRef)
		return 2;//year not supported!
	int monthT=0;
	while (dayRemaining > daysPerMonth[monthT]){
		dayRemaining -= daysPerMonth[monthT];
		monthT++;
	}

	monthT++;//because month 0 doesn't exist
	if (monthT>12)
		return 3;//my math is wrong!
	if (dayRemaining>=(60L*60L*24L))
		return 4;//my math is wrong!
	dayT=dayRemaining;
	if (dayRemaining-dayT>0){ //add partial day!
		dayT++;
	}
	int hoursT = remaining/(60L*60L);
	remaining = remaining-hoursT*(60L*60L);
	if (remaining>=(60L*60L))
		return 5;//my math is wrong!
	int minutesT = remaining/(60L);
	remaining = remaining-minutesT*(60L);
	if (remaining>=60)
		return 6;//my math is wrong!

	year=yearT;
	month = monthT;
	day = dayT;
	hours = hoursT;
	minutes = minutesT;
	seconds = remaining;
	return 0;
}

Come vedi si tratta solo di poche formule matematiche. Non vorrei che con la 1.0 fosse cambiato qualcosa nelle regole di casting dei dati.
Mi confermi che con la 0022 funziona tutto perfettamente?

sisi è lo sketch che ho postato più su ... spe ti metto la pag

PAG 48 http://arduino.cc/forum/index.php/topic,73496.705.html

Re: swRTC
« Reply #714 on: February 14, 2012, 11:20:56 PM »
quello andava bene

Allora è proprio l'IDE 1.0 che ha cambiato qualcosa. Ora non sono a casa, stasera farò dei test per capire cos'è che sballa.

potrebbe essere che la nuova libreria UDP cambia il qualche modo il formato della risposta? Magari la gestione dei packet è cambiata ... non so dico io, magari è una boiata :slight_smile:

Ci sta tutto, mai usato l'ethernet per cui non so come lavorano le lib a corredo.
Bisognerebbe mettersi lì a controllare tutte le righe di codice delle funzioni interessate.

Forse è il server che ha dei problemi. Hai provato a cambiarlo?

un istruzione UDP è cambiata e non l'avevo notata, ora è giusto, ma quando passo epoch alla lib, mi calcola che oggi è il giorno
6/3/2012 13:7:12 non dovrebbe essere 5? :slight_smile: centra qualcosa col 29 febbraio passato?

elimino i post precedenti giusto per non inzozzare di infirmazioni sbagliate il tuo treadh grazie