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

Я хочу, чтобы мои часы реального времени устанавливали свое время так же, как и время на моем ПК. Однако, когда я запускаю следующий скетч, часы реального времени сообщают о времени на 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!");
// следующая строка устанавливает RTC на дату & время составления этого скетча
// раскомментировать & загрузите, чтобы установить время, дату и запустить 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. Экран регистрации данных использует DS1307 RTC. У кого-нибудь была эта проблема раньше или есть какие-либо идеи о том, что может быть ее причиной? Любая помощь приветствуется.

, 👍10

Обсуждение

Я взял объяснения Хьюго Бертини и Оли, чтобы использовать их в своих проектах, и они работают! Спасибо (: но он идет быстрее на 26 секунд...., @Ahmad Zaki Aiman Abdul Rashid


5 ответов


17

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

См. Площадку Arduino Playground, чтобы узнать, как синхронизировать ее с компьютером через последовательный порт.

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

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

,

-1

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

,

0

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

RTC_DS3231 rtc;

DateTime now = rtc.now();
rtc.adjust(DateTime(now.unixtime() + 10)); // добавляем 10 секунд к текущему времени для фиксации смещения
,

0

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

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

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

С уважением, Хьюго Бертини

,

0

С файлом <DS1307RTC.h> библиотеку DS1307 можно настроить во время настройки времени, используя глобальную переменную, а затем добавив ее к чтению Sec в функции getTime(), например, следующим образом:

#include <DS1307RTC.h>
tmElements_t tm;
byte adjustt = 8;  // регулировка задержки в секундах, учитывающая время загрузки компилятора

/*********************

bool getTime(const char *str) {
  int Hour, Min, Sec;
  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec + adjustt;
  return true;
}
,