Чому мої годинники в режимі реального часу отримують неправильний час від мого ПК?


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. Хто-небудь мав цю проблему раніше, чи є якісь ідеї щодо того, що може викликати її? Будь-яка допомога буде дуже вдячна.


Я взяв пояснення Уго Бертіні та Олі, щоб використати у своїх проектах, і це працює! Дякую (: але це йде швидше на 26 секунд ....
Ахмад Закі Айман Абдул Рашид

Відповіді:


17

Значення __DATE__і __TIME__встановлюються, коли код збирається, тому вони, природно, будуть позаду, оскільки код все ще потрібно закінчити компілювати, а потім перенести на мікросхему.

Дивіться майданчик Arduino для прикладу того, як послідовно синхронізувати його з комп'ютером.

TimeSerial.pde показує Arduino як годинник без зовнішнього обладнання.

Він синхронізується тимчасовими повідомленнями, що надсилаються через послідовний порт. Ескіз супутника Обробка автоматично надасть ці повідомлення, якщо він запущений і підключений до послідовного порту Arduino.


0

Ви можете виправити зміщення, викликавши один раз наступний код у setup()функції:

RTC_DS3231 rtc;

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

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. Копія часу, який потрібно, - це те, що ви бачите неправильно. Я вирішував би проблему, просунувши час на комп’ютері, щоб затриматись необхідні секунди, які, за вашими словами, затримуються, а при програмуванні ви повинні мати точний час.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.