Warum erhält meine Echtzeituhr von meinem PC die falsche Zeit?

10

Ich möchte, dass meine Echtzeituhr die Uhrzeit auf meinem PC einstellt. Wenn ich jedoch die folgende Skizze ausführe, meldet die Echtzeituhr, dass die Zeit 32-33 Sekunden früher liegt, als mein PC die Zeit angibt.

#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();
}

Ich habe auch versucht, die Uhrzeit manuell auf der RTC einzustellen, aber am Ende habe ich das gleiche Problem: Die RTC liegt immer 32-33 Sekunden hinter dem, was ich eingestellt habe. Die Verzögerung tritt auf, sobald ich die Skizze starte. Es scheint mir sehr seltsam, dass ich, egal wie ich versuche, die Zeit einzustellen, genau den gleichen Fehler habe. Ich kann dem Arduino sagen, dass er die Zeit als 33 Sekunden nach dem, was die RTC sagt, melden soll, aber diese Lösung scheint etwas skizzenhaft zu sein, und ich mache mir Sorgen, dass etwas mit meiner RTC oder der Art und Weise, wie ich sie verwende, grundlegend nicht stimmt.

Ich verwende ein Arduino Uno mit einem Assembled Data Logging Shield von Adafruit. Das Datenprotokollierungsschild verwendet eine DS1307-RTC. Hat jemand dieses Problem schon einmal gehabt oder hat er Ideen, was es verursachen könnte? Jede Hilfe wäre sehr dankbar.

Lunafish
quelle
Ich habe Hugo Bertini und Oli erklärt, um sie in meinen Projekten zu verwenden, und es funktioniert! Vielen Dank (: aber es geht um 26 Sekunden schneller ....
Ahmad Zaki Aiman ​​Abdul Rashid

Antworten:

17

Die __DATE__und __TIME__werden gesetzt, wenn der Code kompiliert wird, so dass sie natürlich zurückbleiben, da der Code noch kompiliert werden muss und dann auf den Chip geflasht wird.

Auf dem Arduino-Spielplatz finden Sie ein Beispiel für die serielle Synchronisierung mit Ihrem Computer.

TimeSerial.pde zeigt Arduino als Uhr ohne externe Hardware.

Es wird durch Zeitnachrichten synchronisiert, die über die serielle Schnittstelle gesendet werden. Eine begleitende Verarbeitungsskizze liefert diese Nachrichten automatisch, wenn sie ausgeführt und mit der seriellen Arduino-Schnittstelle verbunden wird.

Sachleen
quelle
0

Sie können den Offset korrigieren, indem Sie den folgenden Code in der setup()Funktion einmal aufrufen :

RTC_DS3231 rtc;

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

Ich habe ein ähnliches Problem mit einem Arduino UNO und einem Nano. Beide vom selben PC. In der Tat sieht es so aus, als würde sich die Zeit widerspiegeln, die von der Kompilierungszeit bis zum Hochladen + MCU-Start benötigt wird.

Angenommen, die RTC hat eine gute Batterie und die Kompilierungs- und Upload-Zeiten sind konsistent, dann scheint das Hinzufügen einer Driftkompensation zum Code den Trick zu tun. So habe ich es gemacht (in meinem Fall haben 7 Sekunden den "Trick" gemacht - Entschuldigung für den Hardocode, aber das dient nur der Beschreibung):

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

Grüße, Hugo Bertini

Hugo Bertini
quelle
-1

Der Arduino nimmt sich die Computerzeit und sendet sie an den DS1307. Die Zeit zum Kopieren ist die, die Sie falsch sehen. Ich würde das Problem lösen, indem ich die Computerzeit um die notwendigen Sekunden vorschiebe, von denen Sie sagen, dass sie verzögert sind, und wenn Sie programmieren, sollten Sie die genaue Zeit haben.

Antonio
quelle