Pourquoi mon horloge en temps réel obtient-elle l'heure incorrecte de mon PC?


10

Je veux que mon horloge en temps réel règle son heure comme l'heure sur mon PC. Cependant, lorsque j'exécute l'esquisse suivante, l'horloge en temps réel signale l'heure comme étant 32-33 secondes plus tôt que mon ordinateur ne le dit.

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

J'ai également essayé de régler manuellement l'heure sur le RTC, mais je me retrouve avec le même problème: le RTC est toujours 32-33 secondes derrière ce que je l'ai réglé. Le décalage se produit dès que je lance le croquis. Il me semble très étrange que peu importe comment j'essaie de régler l'heure, je me retrouve avec exactement la même erreur. Je peux dire à l'Arduino de signaler le temps comme étant 33 secondes après ce que le RTC dit qu'il est, mais cette solution semble un peu sommaire, et je crains que quelque chose ne fonctionne fondamentalement avec mon RTC ou la façon dont je l'utilise.

J'utilise un Arduino Uno avec un bouclier de journalisation de données assemblé d'Adafruit. Le bouclier d'enregistrement des données utilise un RTC DS1307. Quelqu'un a-t-il déjà eu ce problème ou a-t-il une idée de ce qui pourrait en être la cause? Toute aide serait très appréciée.


J'ai pris l'explication de Hugo Bertini et Oli à utiliser dans mes projets et ça marche! Merci (: mais ça va plus vite de 26 secondes ....
Ahmad Zaki Aiman ​​Abdul Rashid

Réponses:


17

Les __DATE__et __TIME__sont définis lorsque le code est en cours de compilation, ils seront donc naturellement en retard, car le code doit encore terminer la compilation, puis être flashé sur la puce.

Voir l' Arduino Playground pour un exemple de la façon de le synchroniser avec votre ordinateur via série.

TimeSerial.pde montre Arduino comme une horloge sans matériel externe.

Il est synchronisé par des messages horaires envoyés sur le port série. Un croquis de traitement associé fournira automatiquement ces messages s'il est en cours d'exécution et connecté au port série Arduino.


0

Vous pouvez corriger le décalage en appelant une fois le code suivant dans la setup()fonction:

RTC_DS3231 rtc;

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

0

Je rencontre un problème similaire avec un Arduino UNO et un Nano. Les deux à partir du même PC. En effet, il semble que le temps qu'il faut entre la compilation et le téléchargement + le démarrage du MCU se reflète.

En supposant que le RTC a une bonne batterie et que les temps de compilation et de téléchargement sont cohérents, l'ajout d'une compensation de dérive au code semble faire l'affaire. Voici comment je l'ai fait (dans mon cas, 7 secondes ont fait le "truc" - désolé pour le hardocode, mais c'est à des fins de simple description):

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

Cordialement, Hugo Bertini


-1

L'Arduino prend le temps de l'ordinateur et l'envoie au DS1307. Le temps qu'il faut pour copier est celui que vous voyez mal. Je résoudrais le problème en faisant avancer l'heure de l'ordinateur des secondes nécessaires que vous dites retardées et lors de la programmation, vous devriez avoir l'heure exacte.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.