DS1307+BMP180 come usare i due moduli insieme su UNO?

Come collego i due moduli (ds1307+bmp180) visto che condividono gli stessi PINin di Arduino (UNO) A4(SDA) e A5(SCL)???
Altra cosa, il modulo bmp180 è alimentato a 3,3v mentre DS1307 a 5v.
Montati insieme con collegamento in parallelo per A4(SDA) e A5(SCL) (con resistenze e senza resistenze di pullup da 4,70K) il modulo bmp funziona, mentre il RTC(ds1307) no e rimane su data e ora fisse!

Ho provato a verificare il funzionamento del modulo RTC da solo. Ora e data sono comparsi, ma lo scorrere del tempo non è regolare, ACCELERA!!
Visto che non credo di avere inventato per caso la macchina del tempo, cosa può essere?

Qualcuno sa aiutarmi?

Il bus I2C è strutturato in modo che ogni device abbia un indirizzo diverso proprio per connettere allo stesso bus più device in parallelo. La diversità di livello logico la risolvi con un convertitore che puoi acquistare bello e pronto o farlo da te. Qui alcune soluzioni http://playground.arduino.cc/Main/I2CBi-directionalLevelShifter

Il problema adesso è che il tempo non scorre come dovrebbe! Salta i secondi!!!

Ecco due immagini dove si vede che salta i secondi!

Ciao,

non è il modulo RTC che salta i secondi, è la visualizzazione su display e/o la stampa su seriale che ha dei ritardi nelle letture e quindi ti fornisce dati a salti.

Mi spiego meglio: - il modulo RTC conta il tempo per fatti suoi e, a meno di guasti, non sbaglia; - Arduino legge i dati e li manda ad una periferica di output; - se nel processo di lettura/scrittura è inserito un ritardo, tipicamente un "delay" i dati saltano perché tra due letture consecutive, visto che Arduino si ferma per x millisecondi, il modulo RTC, che appunto è indipendente, è già andato troppo avanti.

void loop()
{
   Vis_Data();                //routine di visualizzazione data
   Vis_Ora();                 //routine di visualizzazione ora
   Vis_Temperatura();    //routine di visualizzazione temperatura
   Vis_Umidita();           //routine di visualizzazione umidità

   delay(1000);
}

La parte di sketch riportata sopra è quella che gira nel mio datalogger (ora senza delay). In pratica, così come è scritto, eseguo una lettura/scrittura dei dati ogni secondo. Il problema sta nel "delay"; impostato a 1 secondo ogni tanto salta, riducendo l'intervallo si riduce l'errore, togliendo completamente il "delay" l'errore scompare.

Spero di essermi spiegato e di aver centrato il tuo problema.

Attilio

ultimo_53: Ciao,

non è il modulo RTC che salta i secondi, è la visualizzazione su display e/o la stampa su seriale che ha dei ritardi nelle letture e quindi ti fornisce dati a salti.

Mi spiego meglio: - il modulo RTC conta il tempo per fatti suoi e, a meno di guasti, non sbaglia; - Arduino legge i dati e li manda ad una periferica di output; - se nel processo di lettura/scrittura è inserito un ritardo, tipicamente un "delay" i dati saltano perché tra due letture consecutive, visto che Arduino si ferma per x millisecondi, il modulo RTC, che appunto è indipendente, è già andato troppo avanti.

void loop()
{
   Vis_Data();                //routine di visualizzazione data
   Vis_Ora();                 //routine di visualizzazione ora
   Vis_Temperatura();    //routine di visualizzazione temperatura
   Vis_Umidita();           //routine di visualizzazione umidità

  delay(1000); }




La parte di sketch riportata sopra è quella che gira nel mio datalogger (ora senza delay).
In pratica, così come è scritto, eseguo una lettura/scrittura dei dati ogni secondo.
Il problema sta nel "delay"; impostato a 1 secondo ogni tanto salta, riducendo l'intervallo si riduce l'errore, togliendo completamente il "delay" l'errore scompare.

Spero di essermi spiegato e di aver centrato il tuo problema.

Attilio

Il delay l'avevo tolto anche io. Comunque grazie alla tua riflessione, ho semplificato il codice e adesso va bene. Volevo chiederti se sai come cambiare il formato dell'ora. Il mio visualizza 7:1:13 vorrei che fosse 07:01:13. Si può fare?

Ciao

si si può fare.

Io ho adottato questa soluzione:

ho definito una variabile: char sOutDisp[3]

poi nella funzione che mi visualizza l’ora estraggo e stampo, di volta in volta, ore, minuti e secondi e con la sprintf() formatto l’output su lcd.

Ti allego la funzione così si capisce meglio :smiley:

void Vis_Ora()
// visualizza l'ora sul display
{
  DateTime now = RTC.now();
  
  lcd.setCursor(12, 0);
  sprintf(sOutDisp, "%02d", now.hour());
  lcd.print(sOutDisp);
  
  lcd.setCursor(14, 0);  
  lcd.print(':');
  
  lcd.setCursor(15, 0);
  sprintf(sOutDisp, "%02d", now.minute());
  lcd.print(sOutDisp);
  
  lcd.setCursor(17, 0);  
  lcd.print(':');
  
  lcd.setCursor(18, 0);
  sprintf(sOutDisp, "%02d", now.second());
  lcd.print(sOutDisp);
}

Buon divertimento

Attilio