リアルタイムクロックがPCから間違った時間を取得するのはなぜですか?


10

リアルタイムクロックでPCの時刻を設定します。ただし、次のスケッチを実行すると、リアルタイムクロックは、PCの時刻よりも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に、RTCが言っていることから33秒後に時間を報告するように指示することができますが、この解決策はおおざっぱに思われ、RTCまたは使用方法に根本的に何か問題があるのではないかと心配しています。

Ardaino UnoとAdafruitのAssembled Data Logging Shieldを使用しています。データロギングシールドはDS1307 RTCを使用します。誰かが以前にこの問題を抱えていましたか、それを引き起こしている可能性があるものについて何か考えがありますか?どんな助けでも大歓迎です。


私は、Hugo BertiniとOliの説明をプロジェクトで使用するために説明しました。....それは26秒で速く行く:(ありがとう
アフマドザキAimanアブドゥル・ラシッド

回答:


17

__DATE__そして__TIME__、コードはまだコンパイルを終了した後、チップにフラッシュする必要があるので、彼らは自然の後ろになりますので、コードがコンパイルされたときに設定されています。

シリアル経由でコンピューターに同期する方法の例については、Arduino Playgroundを参照してください。

TimeSerial.pdeは、Arduinoを外部ハードウェアのないクロックとして示しています。

シリアルポートを介して送信される時間メッセージによって同期されます。これらのメッセージが実行されており、Arduinoシリアルポートに接続されている場合、コンパニオンProcessingスケッチはこれらのメッセージを自動的に提供します。


0

setup()関数で次のコードを1回呼び出すことで、オフセットを修正できます。

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で同様の問題が発生しています。両方とも同じPCから。確かに、コンパイル時からアップロード+ MCU起動までの時間が反映されています。

RTCに十分なバッテリーがあり、コンパイル+アップロード時間が一貫していると仮定すると、コードにドリフト補正を追加するとうまくいくようです。ここに私がそれをした方法があります(私の場合7秒は「トリック」をしました-hardocodeのために申し訳ありませんが、それは単なる説明目的のためです):

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

よろしく、Hugo Bertini


-1

Arduinoはコンピュータに時間をかけ、それをDS1307に送信します。コピーにかかる時間は、間違っていると思われる時間です。私はコンピュータの時間を進めることで問題を解決します。あなたが言う必要な秒が遅れ、プログラミング時には正確な時間が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.