Orologio siderale

dunque, se vuoi usare un PC, fai attenzione: molti SO e vecchi sistemi operativi hanno dei timer precisi solo ad centesimo di secondo. (lo so perchè facendo della grafica al PC alle volte tra un'immagine e l'altra capita di dover far aspettare al Thread qualhe millesimo/centesimo di secondo e non si può.

La soluzione di leo è interessante, ma come dicevamo i timer tendono a sballare sul lungo termine (e per un timer lungo termine vuol dire decine di minuti), però ecco, un sistema leo + un RTC (che poi usi il PC come RTC è una tua scelta).

la cosa diventa un poco complessa, a solo lato matematico non programmazione.
tu avresti l'RTC (che poi sia il PC chissene), che ogni secondo invia un impulso. chiamiamolo RTC

quando ti arriva un impulso, salvi il valore di micros() in una variabile, lastRTC per esempio.
Quando l'utente preme su "start" salvi il valore attuale di micros() meno lastRTC (ovvero il numero di microsecondi di sfaso tra il secondo reale e il secondo siderale, chiamamiamola sfasoRTC), setti a 0 una variabile che conta i secondi RTC (chiamaiamola secRTC).

poi fai la durata di un secondo in micros (6.000.000) meno sfasoRTC e ottieni quanti microsecondi ci rimangono entro il prossimo interrupt RTC (chiamiamo missingRTC)

ora avreai precalcolato quanto microsecondi RTC equivalgolo and un microsecondio SID (siderale): 997.261 (SIDinRTC)

ora calcoli il numero di SID che devono trascorrere fino al prossimo interrupt RTC: missingRTC/SIDinRTC = missingSID

ora semplicemente fai un for da 0 a missingSID che incrementa uno step il motore (che saranno 86400) e poi si mette a nanna per SIDinRTC microsecondi.

poi a questo punto, finito il for, devi ricalcolare lo sfaso di missingRTC, però ora devo andare, vediamo se riesci a concludere da solo...

Ma in pratica tutto questo è un modo per usare l'RTC per rimanere allineati con i Timer.

ps. @leo: sul tuo github si discute per modificare la swRTC, sarebbe gradito un tuo intervento :slight_smile: