실시간 시계가 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 초 늦습니다. 스케치를 실행하자마자 지연이 발생합니다. 시간 설정 방법에 관계없이 정확히 같은 오류가 발생한다는 것은 매우 이상합니다. RTC가 말한지 33 초 후에 Arduino에 시간을보고하도록 지시 할 수 있지만,이 솔루션은 일종의 스케치처럼 보이며, RTC 또는 내가 사용하는 방식에 근본적으로 문제가 있다고 걱정됩니다.

Adafruit의 Assembled Data Logging Shield와 함께 Arduino Uno를 사용하고 있습니다. 데이터 로깅 쉴드는 DS1307 RTC를 사용합니다. 누구든지 전에이 문제가 있었거나 원인이 될 수있는 아이디어가 있습니까? 도움을 주시면 감사하겠습니다.


나는 내 프로젝트에서 사용하기 위해 Hugo Bertini와 Oli의 설명을 취했으며 작동합니다! 감사합니다 (:하지만 26 초 빠릅니다 ....
Ahmad Zaki Aiman ​​Abdul Rashid

답변:


17

__DATE____TIME__코드가 여전히 컴파일 완료 후 칩에 플래시 할 필요가 있기 때문에 그들은 자연스럽게 뒤에 수 있도록 코드가 컴파일 될 때 설정됩니다.

시리얼을 통해 컴퓨터와 동기화하는 방법에 대한 예 는 Arduino Playground 를 참조하십시오 .

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와 비슷한 문제가 발생합니다. 둘 다 같은 PC에서. 실제로 컴파일 시간에서 업로드까지 걸리는 시간 + MCU 시작이 반영됩니다.

RTC에 배터리가 있고 컴파일 + 업로드 시간이 일정하다고 가정하면 코드에 드리프트 보상을 추가하는 것이 속임수입니다. 여기에 내가 한 방법이 있습니다 (제 경우에는 7 초 동안 "트릭"을했습니다. 하드 코드는 유감이지만 설명을위한 것입니다) :

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

감사합니다. 휴고 베르 티니


-1

Arduino는 컴퓨터 시간을 가져 와서 DS1307로 보냅니다. 복사하는 데 걸리는 시간은 잘못보고있는 시간입니다. 컴퓨터 시간을 필요한 시간 (초)이 지연되고 프로그래밍 할 때 정확한 시간을 가져야 문제를 해결할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.