Go Down

Topic: problema lettura secondi RTC (Read 8 times) previous topic - next topic

danidiscus

ho fatto delle prove eliminando il DELAY ma noto che nello scorrere dei secondi ogni tot come se si inceppa, ho messo il DELAY (150) sembra andare meglio, ma anche in questo caso trova un inceppo ogni tanto meno del 150.
ho eliminato il sensore digitale e sembra funzionare bene, quindi l,intoppo è nel sensore digitale ma non capisco dove :-(

qsecofr

evidentemente i tempi di risposta sul dallas non sono certi. Io non so la logica in profondità del bus ma spesso nei bus le risposte vengono date a tempi appositamente "random" di modo da gestire eventuali risposte multiple/conflitti tra sensori.
Altra cosa il dallas l'hai attaccato con l'alimentazione parassita? (2 soli fili?): perchè con 2 fili è previsto un ritardo di "carica"... mi pare... devo averlo letto da qualche parte... boo forse mi sono inventato tutto...

andiamo ad una possibile soluzione: io toglierei questo delay: assolutamente.
Poi testerei "alla morte" (più velocemente possibile) l'orologio di modo da avere il più possibile letture al secondo e leggerei il sensore 1-wire (e a questo punto anche l'analogico) solo quando il secondo scatta...
uno "pseudocodice tipo":

void loop:

read dataora;
if second != oldSecond
    lcd.print data ora
    oldsecond = second
     leggo dallas
     leggo analogico.
     lcd.print temperature
     endif
end loop

In questo modo mi aspetto di intercettare il cambio del secondo appena succede ed avere un secondo netto per leggermi il sensore prima che ci sia bisogno di aggiornare di nuovo la data/ora... inoltre metti anche che non ce la facciamo in un secondo spaccato anche se diventa un secondo ed 1 decimo ben difficilmente ci accorgeremo di qualcosa.

L'alternativa è trovare un'altra libreria per il sensore che magari funzioni più velocemente.
Ho il panetto che mi viene su. :D






qsecofr

...ho guardato la libreria che stai usando... di suo può aspettare fino a 750 millisecondi il dato di temperatura però ha delle funzioni che permettono di non bloccare il codice nei delay. per esempio c'è questa funzine che fa si che la funzione di lettura della temperatura non sia bloccante...

Code: [Select]
// sets the value of the waitForConversion flag
// TRUE : function requestTemperature() etc returns when conversion is ready
// FALSE: function requestTemperature() etc returns immediately (USE WITH CARE!!)
//                (1) programmer has to check if the needed delay has passed
//        (2) but the application can do meaningful things in that time
void DallasTemperature::setWaitForConversion(bool flag)
{
        waitForConversion = flag;
}


e con questa puoi vedere se il dato è diventato disponibile
Code: [Select]
bool DallasTemperature::isConversionAvailable(uint8_t* deviceAddress)
{
        // Check if the clock has been raised indicating the conversion is complete
        ScratchPad scratchPad;
        readScratchPad(deviceAddress, scratchPad);
        return scratchPad[0];
}       


quindi sul setup setti il setwaitforconversion a false. fai requesttemperature normale (e questo non ti bloccherà) e solo quando troverai il isconversionavaiable a true farai il getTempC.

danidiscus

io vi ringrazio tutti di vero cuore ma come ho scritto sono alle prime armi, ora ho capito,
non ci capisco niente, stiamo entrando troppo nello specifico.
vi prego scusate ma sono inetto,
se posso chiedere ....
.... ho bisogno che qualcuno corregga il codice che ho impostato cosi da confrontarlo e cercare di capire.
grazie
Daniele

qsecofr


io vi ringrazio tutti di vero cuore ma come ho scritto sono alle prime armi, ora ho capito,
non ci capisco niente, stiamo entrando troppo nello specifico.
vi prego scusate ma sono inetto,
se posso chiedere ....
.... ho bisogno che qualcuno corregga il codice che ho impostato cosi da confrontarlo e cercare di capire.
grazie
Daniele


non ti devi scusare e per quanto poco ti conosco non credo tu sia inetto se sei comunque riuscito a modificare un po' il codice soprastante.... è tuttavia molto difficile per me perchè non ho il dallas da attaccare... non mi funzionerebbe un tubo e non riuscirei a provare... pertanto potrei solamente postarti un codice "più o meno" funzionante e poi tu lo correggi e lo provi perchè se no non ce la faccio.
Devo però dirti che non è il miglior "approccio all'apprendimento"... nel senso che sarebbe bene che ti "spaccassi" letteralmente la schiena su questo problema di tuo in modo da imparare altrimenti alla fine otterremo un codice funzionante ma non otterremo la tua crescita che è ben più importante di un dallas che non risponde nei tempi.
Comunque dato che è Natale (e sono abbastanza disoccupato) mi offro di aiutarti... domani... :D

Go Up