为什么我的实时时钟从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或我的使用方式从根本上来说是错误的。

我正在将Arduino Uno与来自Adafruit的组装数据记录盾一起使用。数据记录屏蔽使用DS1307 RTC。有没有人曾经遇到过这个问题,或者对导致问题的原因有任何想法?任何帮助将非常感激。


我已经在我的项目中使用了Hugo Bertini和Oli的解释,并且有效!谢谢您(:但速度提高了26秒
。...–艾哈迈德·扎基

Answers:


17

__DATE____TIME__当代码编译,使他们自然会落后,因为代码仍然需要完成编译,然后被刷新到芯片设置。

有关如何通过串行将其同步到计算机的示例,请参见Arduino Playground

TimeSerial.pde显示Arduino为没有外部硬件的时钟。

它通过通过串行端口发送的时间消息进行同步。如果配套的Processing草图正在运行并连接到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上遇到类似的问题。两者都来自同一台PC。确实,这反映了从编译时间到上传+ MCU启动所花费的时间。

假设RTC电池电量充足,并且编译+上传时间一致,则在代码中添加漂移补偿似乎可以解决问题。这是我的操作方式(在我的情况下,“技巧”是7秒钟的操作-对此硬编码感到抱歉,但这仅出于描述目的):

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

此致,雨果·贝蒂尼(Hugo Bertini)


-1

Arduino占用了计算机时间,并将其发送到DS1307。复制所需的时间是您看到的错误。我可以通过将计算机时间提前您说的必要秒数来解决问题,并且在编程时应该有准确的时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.