Pages: [1] 2 3 ... 6   Go Down
Author Topic: problema lettura secondi RTC  (Read 6940 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salve ragazzi, ho assemblato uno sketch dove leggere su lcd data ora più due temperature,
il problema nasce nella lettura dei secondi, che saltano due a due, allego il codice se qualcuno con piu esperienza ci butta un occhio per farmi capire dove sbaglio.
grazie
D
Code:
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 8


OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temperatura;

 
char buffer[10];
 
RTC_DS1307 RTC;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup () {
    sensors.begin();
    Wire.begin();
    RTC.begin();
    lcd.begin(20, 4);
 
    RTC.sqw(1);
    if (! RTC.isrunning()) {
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}
 
void loop () {
    DateTime now = RTC.now();
   
 
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(0, 1);
    lcd.print("Data  ");
    lcd.print( buffer );
 
    char buffer[10] = "";

    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(0, 0);
    lcd.print("Time   ");
    lcd.print( buffer );
    delay(1000);
    {
      temperatura=analogRead(A0);
  lcd.setCursor(0, 2);
  lcd.print("Temp esterna ");
  lcd.print((5.0*temperatura*100.0)/1024.0);
  lcd.write(0b011011111);
  lcd.print("C");
  }
   {
    sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
  lcd.setCursor(0, 3);
  lcd.print("Temp H2o");
  lcd.setCursor(10, 3);
  lcd.print (sensors.getTempCByIndex(0));
  lcd.print (" C");
  lcd.write(0b11011111);
 }
  }
Buon Natale a tutti
Logged

Global Moderator
Offline Offline
Newbie
*****
Karma: 13
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cosa pensi che faccia Arduino nel loop(); durante il
 "delay(1000); "
? Siccuramnete non aggiorna i secondi.

Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

credo ritarda un secondo!?
ma arrivo alla soluzione, non vedo l'errore..........

Ciao Daniele
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 248
Posts: 21170
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se fai aspettare Arduino per un secondo é normale che non scrive in quel tempo i secondi sul display e percui salta dei numeri.
Ciao Uwe
« Last Edit: December 24, 2012, 05:06:07 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusami ma non sono un esperto sto imparando da solo. Ho tolto il ritardo ma fa lo stesso, potresti indicarmi quale riga correggere e come?
Grazie
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 248
Posts: 21170
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

manda il nuovo codice.
Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè quello che ho postato non va bene? smiley-sad
« Last Edit: December 24, 2012, 06:37:48 pm by danidiscus » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 248
Posts: 21170
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai detto che l' hai modificato e comunque non funziona. Manda quello modificato.
Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusami se rompo il giorno di natale , anzi ne approfitto per farti gli auguri, ma la modica fatta era soltanto eliminare il DELAY tutto qui, sai dirmi tu che modifica fare? Grazie
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusami se rompo il giorno di natale , anzi ne approfitto per farti gli auguri, ma la modica fatta era soltanto eliminare il DELAY tutto qui, sai dirmi tu che modifica fare? Grazie

Tanti auguri anche a te.
io ho analizzato il codice ed effettivamente imho quello che rende l'aggiornamento ogni 2 secondi è al 99.99% solo il delay: lo togli e dovrebbe aggiornare correttamente.
C'è la remota possibilità che l'interrogazione dei sensori o dell'orologio per qualche motivo impieghi più di un secondo...ma non dovrebbe proprio...mi pare difficile... ma se tu dici che non cambia nulla io devo crederti:
Per ispezionare questa casistica bisogna che ci inventiamo un debug: possiamo usare il Serial.print ma possiamo usare anche il display.
Una possibile soluzione di debug è commentare la parte inerente la lettura dei sensori di temperatura e questo ci permette di capire se è la lettura della data che infastidisce.... commentanto la lettura della temperatura cambia qualcosa?

Un'alternativa "home made" è creare una variabile che viene incrementato ad ogni ciclo di loop e stamparla ad ogni ciclo: questo ci permette di capire quanto dura il ciclo loop (stampa veloce i numeri oppure lentamente) perchè c'è la remota possibilità che il ciclo loop in se duri poco ma che l'orologio per qualche motivo torni valori errati....
una cosa tipo
int cont;
cont ++;
cont = cont % 9;
lcd.print (cont);

Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :-(
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley-grin





 
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...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:
// 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:
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.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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... smiley-grin
Logged

Pages: [1] 2 3 ... 6   Go Up
Jump to: