Perché il mio orologio in tempo reale riceve l'ora sbagliata dal mio PC?


10

Voglio che il mio orologio in tempo reale imposti l'ora sul mio PC. Tuttavia, quando eseguo il seguente schizzo, l'orologio in tempo reale riporta l'ora come 32-33 secondi prima del mio PC.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
// uncomment it & upload to set the time, date and start run the RTC!
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {
  DateTime now = RTC.now();
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}

Ho anche provato a impostare manualmente l'ora sull'RTC, ma finisco con lo stesso problema: l'RTC è sempre 32-33 secondi indietro rispetto a quello su cui l'ho impostato. Il ritardo si verifica non appena eseguo lo schizzo. Mi sembra molto strano che, indipendentemente dal modo in cui provo a impostare l'ora, finisca esattamente con lo stesso errore. Posso dire ad Arduino di riferire il tempo come 33 secondi dopo quello che dice l'RTC, ma questa soluzione sembra un po 'imprecisa e sono preoccupato che qualcosa sia fondamentalmente sbagliato nel mio RTC o nel modo in cui lo sto usando.

Sto usando un Arduino Uno con uno scudo di registrazione dei dati assemblato di Adafruit. Lo scudo per la registrazione dei dati utilizza un DS1307 RTC. Qualcuno ha avuto questo problema prima o hai qualche idea su cosa potrebbe causarlo? Qualsiasi aiuto sarebbe molto apprezzato.


Ho preso la spiegazione di Hugo Bertini e Oli da usare nei miei progetti e funziona! Grazie (: ma va più veloce di 26 secondi ....
Ahmad Zaki Aiman ​​Abdul Rashid

Risposte:


17

Gli __DATE__e __TIME__vengono impostati quando il codice viene compilato, quindi saranno naturalmente indietro poiché il codice deve ancora completare la compilazione e quindi essere trasferito sul chip.

Vedi il Arduino Playground per un esempio di come sincronizzarlo sul tuo computer tramite seriale.

TimeSerial.pde mostra Arduino come un orologio senza hardware esterno.

È sincronizzato dai messaggi temporali inviati tramite la porta seriale. Uno schizzo di elaborazione associato fornirà automaticamente questi messaggi se è in esecuzione e collegato alla porta seriale di Arduino.


0

È possibile correggere l'offset chiamando una volta il seguente codice nella setup()funzione:

RTC_DS3231 rtc;

DateTime now = rtc.now();
rtc.adjust(DateTime(now.unixtime() + 10)); // add 10s to current time for fixing the offset

0

Sto riscontrando un problema simile con un Arduino UNO e un Nano. Entrambi dallo stesso PC. In effetti sembra che il tempo impiegato dal tempo di compilazione per caricare + l'avvio di MCU si rifletta.

Supponendo che l'RTC abbia una buona batteria e che i tempi di compilazione + upload siano coerenti, quindi l'aggiunta di una compensazione della deriva al codice sembra fare il trucco. Ecco come l'ho fatto (nel mio caso 7 secondi ha fatto il "trucco" - scusate il codice hard, ma questo è solo a scopo di descrizione):

RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime t = DateTime(RTC.now().unixtime()+7);
RTC.adjust(t);

Saluti, Hugo Bertini


-1

Arduino prende il tempo del computer e lo invia al DS1307. Il tempo necessario per copiare è quello che stai vedendo male. Vorrei risolvere il problema facendo avanzare il tempo del computer i secondi necessari che dici siano in ritardo e durante la programmazione dovresti avere l'ora esatta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.