Почему мои часы реального времени получают неправильное время с моего компьютера?

10

Я хочу, чтобы мои часы реального времени устанавливали время на моем ПК. Однако, когда я запускаю следующий эскиз, часы реального времени сообщают, что время на 32-33 секунды раньше, чем мой компьютер говорит, что время.

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

Я также пытался вручную установить время на RTC, но в итоге я столкнулся с той же проблемой: время на RTC всегда на 32-33 секунды меньше того, что я установил. Лаг случается, как только я запускаю эскиз. Мне кажется очень странным, что независимо от того, как я пытаюсь установить время, я получаю точно такую ​​же ошибку. Я могу сказать Arduino сообщить, что время составляет 33 секунды после того, что говорит RTC, но это решение кажется отрывочным, и я обеспокоен тем, что что-то не так с моим RTC или тем, как я его использую.

Я использую Arduino Uno с собранным щитом регистрации данных от Adafruit. Экран регистрации данных использует RTC DS1307. Кто-нибудь имел эту проблему раньше, или есть какие-либо идеи о том, что может быть причиной? Любая помощь приветствуется.

lunafish
источник
Я взял объяснения Хьюго Бертини и Оли для использования в моих проектах, и это работает! Спасибо (: но это идет быстрее на 26 секунд ....
Ахмад Заки Айман Абдул Рашид

Ответы:

17

Символы __DATE__и __TIME__устанавливаются, когда код компилируется, поэтому они, естественно, будут отставать, поскольку код все еще должен завершить компиляцию и затем быть передан в чип.

Посмотрите Arduino Playground для примера того, как синхронизировать его с вашим компьютером через последовательный порт.

TimeSerial.pde показывает Arduino как часы без внешнего оборудования.

Он синхронизируется по сообщениям времени, отправленным через последовательный порт. Эскиз сопутствующей обработки автоматически предоставит эти сообщения, если он работает и подключен к последовательному порту Arduino.

sachleen
источник
0

Вы можете исправить смещение, вызвав один раз следующий код в setup()функции:

RTC_DS3231 rtc;

DateTime now = rtc.now();
rtc.adjust(DateTime(now.unixtime() + 10)); // add 10s to current time for fixing the offset
Oli
источник
0

У меня похожая проблема с Arduino UNO и Nano. Оба с одного компьютера. Действительно, похоже, что время, которое требуется от времени компиляции до загрузки + запуска MCU, отражается.

Предполагая, что RTC имеет хорошую батарею и время компиляции + загрузки одинаково, тогда добавление компенсации дрейфа к коду, похоже, поможет. Вот как я это сделал (в моем случае 7 секунд сделал «трюк» - извините за хардокод, но это только для целей описания):

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

С уважением, Уго Бертини

Хьюго Бертини
источник
-1

Arduino отнимает у компьютера время и отправляет его на DS1307. Время, которое требуется для копирования, - это то, что вы видите неправильно. Я бы решил проблему, увеличив время компьютера на те секунды, которые, как вы говорите, задерживаются, и при программировании у вас должно быть точное время.

антонио
источник