Dlaczego mój zegar czasu rzeczywistego pobiera nieprawidłowy czas z komputera?

10

Chcę, aby mój zegar czasu rzeczywistego ustawiał czas jako czas na moim komputerze. Jednak po uruchomieniu poniższego szkicu zegar czasu rzeczywistego zgłasza, że ​​jest o 32-33 sekundy wcześniej niż mówi mój komputer.

#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();
}

Próbowałem też ręcznie ustawić czas w RTC, ale mam ten sam problem: RTC jest zawsze o 32-33 sekund opóźniony. Opóźnienie ma miejsce, gdy tylko uruchomię szkic. Wydaje mi się bardzo dziwne, że bez względu na to, jak próbuję ustawić czas, mam dokładnie ten sam błąd. Mogę powiedzieć Arduino, aby zgłosiło czas jako 33 sekundy po tym, co mówi RTC, ale to rozwiązanie wydaje się dość szkicowe i martwię się, że coś jest zasadniczo nie tak z moim RTC lub sposobem, w jaki go używam.

Używam Arduino Uno ze złożoną tarczą do rejestrowania danych od Adafruit. Tarcza rejestrowania danych wykorzystuje DS1307 RTC. Czy ktoś miał wcześniej ten problem lub miał jakieś pomysły na to, co może być przyczyną? Każda pomoc będzie mile widziana.

lunafish
źródło
Wziąłem wyjaśnienie Hugo Bertiniego i Oli do wykorzystania w moich projektach i działa! Dziękuję (: ale idzie szybciej o 26 sekund ....
Ahmad Zaki Aiman ​​Abdul Rashid

Odpowiedzi:

17

__DATE__I __TIME__są ustawione, gdy kod kompiluje więc będą naturalnie być za ponieważ kod musi jeszcze zakończyć kompilacji i następnie błysnął na chipie.

Zobacz Arduino Playground, gdzie znajduje się przykład synchronizacji z komputerem przez port szeregowy.

TimeSerial.pde pokazuje Arduino jako zegar bez zewnętrznego sprzętu.

Jest synchronizowany przez komunikaty czasowe wysyłane przez port szeregowy. Szkic towarzyszący automatycznie dostarczy te komunikaty, jeśli jest uruchomiony i podłączony do portu szeregowego Arduino.

sachleen
źródło
0

Możesz naprawić przesunięcie, wywołując raz następujący kod w setup()funkcji:

RTC_DS3231 rtc;

DateTime now = rtc.now();
rtc.adjust(DateTime(now.unixtime() + 10)); // add 10s to current time for fixing the offset
Oli
źródło
0

Mam podobny problem z Arduino UNO i Nano. Oba z tego samego komputera. Rzeczywiście wygląda na to, że czas potrzebny na przesłanie + kompilacja startu MCU jest odzwierciedlony.

Zakładając, że RTC ma dobrą baterię i czasy kompilacji + wysyłania są spójne, to dodanie kompensacji znoszenia do kodu wydaje się załatwić sprawę. Oto jak to zrobiłem (w moim przypadku 7 sekund zrobiłem „trick” - przepraszam za hardocode, ale to tylko w celach opisowych):

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

Pozdrawiam, Hugo Bertini

Hugo Bertini
źródło
-1

Arduino zabiera czas komputera i wysyła go do DS1307. Czas potrzebny na skopiowanie jest tym, który widzisz źle. Rozwiązałbym ten problem, przyspieszając czas w komputerze, o kilka sekund, o których mówisz, że są opóźnione, a podczas programowania powinieneś mieć dokładny czas.

Antonio
źródło