Countimer tempi imprecisi

Ciao a tutti,
sto utilizzando la libreria "Countimer.h" per realizzare un contatore alla rovescia con tempi selezionabili ma ho un problema...il timer non preciso ...è più lento della "realtà" , su un tempo di 1 minuto, di circa 3/4 secondi.è normale?
poiché vorrei lavorare su tempi anche abbastanza lunghi , nell'ordine di anche 96 ore, ovviamente questo ritardo è inaccettabile.
Preciso che il mio codice , un po' lungo , viene eseguito mediamente in circa 500ms ..fino a punte di 1600ms e non mi è possibile installare un RTC.

Vorrei ,se possibile, continuare a utilizzare la libreria "Countimer.h" (la trovo molto comoda) ma ,in qualche modo, avere la possibilità di farla sincronizzare con NTP.

Sarebbe possibile?

Grazie a tutti per il supporto.

Non ho mai usato quella libreria, ma vedo che tutto dipende da quanto frequentemente tu richiami "tDown.run();". Per cui se il tuo codice ha delle attività che arrivano ad oltre 1 secondo e mezzo la vedo difficile.

Generalmente se vuoi lavorare con più eventi contemporaneamente devi evitare assolutamente l'uso di delay() e passare all'uso di millis() in tutto il tuo programma.

>fntslz: in conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui, i tui post duplicati nella sezione Inglese del forum (post per di più scritti in Italiano, cosa NON permessa) sono stati cancellati.

Ti prego, per il futuro, di evitare di aprire più post sullo stesso argomento in sezioni differenti del forum. Grazie.

Guglielmo

Ok.. ma il "tDown.run();" dovrei metterlo nel loop ....giusto?
comunque ho ricontrollato il mio codice ed effettivamente nel mio if richiamo continuamente

loop()
 if ( power == 1) {    
    tDown.run();
    tDown.start();
   }

ora provo a modificarlo cosi

loop()
tDown.run();
 if ( power == 1) {    
   if(!timer.isCounterCompleted()) {
     tDown.start();
   }

Cosi dovrebbe andare?
Forse e questo che mi fa' lievitare i tempi di elaborazione?

fntslz: ... magari una letta a tutto REGOLAMENTO glie la vogliamo dare ? ? ? Grazie ... :slight_smile:

... in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Buongiorno Moderatore,
per la segnalazione del punto 13 purtroppo è stato un errore (doppio ) , ho tentato invano di cancellare i miei post.
L'unica cosa che sono riuscito a fare è stato utilizzare il bottone "Report to moderator" per segnalare il mio errore .

Per il punto 7 mi gioco il Jolly ... :-))

Battute a parte...

Ora ho riletto con più attenzione il regolamento ma non mi è chiaro quando utilizzare il bottone "More -> Modify" o quando scrivere in "Quick Reply" (praticamente quello che ho fatto per rispondere a docdoc).

Comunque mi scuso in anticipo per i miei errori ma ci tengo a precisare che non è assolutamente mia intenzione mancare di rispetto e di educazione a nessun membro di questo forum.

fntslz:
Ora ho riletto con più attenzione il regolamento ma non mi è chiaro quando utilizzare il bottone "More -> Modify" o quando scrivere in "Quick Reply" (praticamente quello che ho fatto per rispondere a docdoc).

Beh ... More -> Modify serve per modificare un post già esistente, ad esempio per correggere degli errori ... come ciò che devi fare per il tuo post #3 per racchiudere il codice nei sui TAG; Quick Reply lo usi per scrivere velocemente un nuovo post mentre Reply lo usi per scrivere un nuovo post con l'aiuto di tutti i bottoni di edit disponibili.

Quindi ... segui quanto ti ho scritto nel post #4 e aggiungi gli appositi TAG attorno ai due pezzi di codice :wink:

Guglielmo

Ok perfetto capito...grazie..

Comunque in questi giorni, come suggerito , ho fatto delle prove .. ma nulla.. sempre timer impreciso...

Quindi ho applicato una soluzione un po' spartana ma almeno funziona...

Praticamente ,non volendo modificare il mio codice già pronto, ho preferito modificare la libreria Countimer.h e Countimer.cpp aggiungendo un parametro di sincronizzazione timer, quindi "a mio piacimento" posso aumentare o diminuire la velocità del timer.
Utilizzando un'altra libreria sincronizzo arduino con l'ora corrente tramite NTP , una volta acquisita la confronto con quella che mi restituisce CounTimer e in caso di differenza la trasmetto al timer "aumentando o diminuendo" la velocità del conteggio.

Cosi facendo diciamo che il mio CountDown Timer è abbastanza preciso, nell'ordine di qualche secondo.

L'unico limite e che riuscendo ad acquisire tramite NTP sono i secondi e non anche i millisecondi, riesco a rilevare solo differenze in secondi ..quindi non precisissimo... ma per ora va' più che bene.

Ovviamente se avete altri suggerimenti sarò ben felice di fare altre prove.

fntslz:
Ok perfetto capito...grazie..

... bene, se hai capito, allora fai quanto ti ho chiesto al mio post #4 dato che NON lo hai ancora fatto! Grazie.

Guglielmo

Ok Guglielmo fatto.
Cosi va' bene? oppure devo fare altro?

perfetto !!! Grazie.

Guglielmo

fntslz:
Comunque in questi giorni, come suggerito , ho fatto delle prove .. ma nulla.. sempre timer impreciso...
Quindi ho applicato una soluzione un po' spartana ma almeno funziona...
Ovviamente se avete altri suggerimenti sarò ben felice di fare altre prove.

Allora, intanto generalmente modificare una libreria (fatta da altri) non è mai una buona idea, perché si mette mano a qualcosa che:

  1. non si conosce bene, quindi si rischia di "aggiustare" una cosa e danneggiarne un'altra
  2. la prima volta che aggiorni quella libreria ti perdi le tue modifiche

Quindi ora come suggerimento già te l'avevo scritto (ma non ti ho risposto in attesa del completamento delle richieste fatte dal moderatore), devi richiamare la run() più spesso, il che significa che se nel tuo codice hai dei delay() lunghi o dei cicli dai quali esce solo dopo un certo tempo/evento, nessuna libreria basata sul tempo potrà mai lavorare decentemente perché Arduino non è multithreading.

Devi modificare il tuo codice per togliere ciò che rallenta, e lascia stare la libreria (ossia rimettila a posto).

Se vuoi una mano, posta tutto il tuo codice e vediamo di capire insieme cos'è che ti impedisce di usare correttamente i timer.