Por que meu relógio em tempo real está incorretamente no meu PC?

10

Quero que meu relógio em tempo real defina seu horário como o horário no meu PC. No entanto, quando executo o esboço a seguir, o relógio em tempo real relata o tempo 32-33 segundos antes do que o meu PC diz que é a hora.

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

Também tentei definir manualmente a hora no RTC, mas acabo com o mesmo problema: o RTC está sempre 32 a 33 segundos atrás do que eu o defini. O atraso acontece assim que eu faço o esboço. Parece-me muito estranho que, por mais que eu tente definir o horário, acabo exatamente com o mesmo erro. Posso dizer ao Arduino para relatar o tempo como sendo 33 segundos após o que o RTC diz que é, mas essa solução parece meio incompleta e estou preocupado que algo esteja fundamentalmente errado com o meu RTC ou com o modo como o estou usando.

Estou usando um Arduino Uno com um escudo de registro de dados montado da Adafruit. A blindagem de registro de dados usa um DS1307 RTC. Alguém já teve esse problema antes ou tem alguma idéia sobre o que poderia estar causando isso? Qualquer ajuda seria muito apreciada.

lunafish
fonte
Eu levei a explicação de Hugo Bertini e Oli para usar em meus projetos e funciona! Obrigado (: mas vai mais rápido em 26 segundos ....
Ahmad Zaki Aiman ​​Abdul Rashid

Respostas:

17

O __DATE__e __TIME__são definidos quando o código está sendo compilado, para que eles fiquem naturalmente atrasados, pois o código ainda precisa concluir a compilação e depois ser transferido para o chip.

Veja o Arduino Playground para obter um exemplo de como sincronizá-lo com o seu computador através de serial.

O TimeSerial.pde mostra o Arduino como um relógio sem hardware externo.

É sincronizado pelas mensagens de horário enviadas pela porta serial. Um esboço complementar de Processamento fornecerá automaticamente essas mensagens se estiver em execução e conectado à porta serial do Arduino.

sachleen
fonte
0

Você pode corrigir o deslocamento chamando uma vez o seguinte código na setup()função:

RTC_DS3231 rtc;

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

Estou enfrentando um problema semelhante com um Arduino UNO e um Nano. Ambos do mesmo PC. Na verdade, parece que o tempo que leva para compilar o upload e o início do MCU são refletidos.

Supondo que o RTC tenha uma boa bateria e os tempos de compilação + upload sejam consistentes, a adição de uma compensação de desvio ao código parece ser suficiente. Aqui está como eu fiz isso (no meu caso, 7 segundos fez o "truque" - desculpe pelo código rígido, mas isso é apenas para fins de descrição):

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

Atenciosamente, Hugo Bertini

Hugo Bertini
fonte
-1

O Arduino leva o tempo do computador e o envia para o DS1307. O tempo que leva para copiar é aquele que você vê errado. Eu resolveria o problema avançando o tempo do computador nos segundos necessários que você diz estarem atrasados ​​e, ao programar, você deve ter o tempo exato.

antonio
fonte