¿Por qué mi reloj de tiempo real está recibiendo la hora incorrecta de mi PC?


10

Quiero que mi reloj de tiempo real establezca su hora como la hora en mi PC. Sin embargo, cuando ejecuto el siguiente boceto, el reloj en tiempo real informa que la hora es 32-33 segundos antes de lo que dice mi PC.

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

También he intentado configurar manualmente la hora en el RTC, pero termino con el mismo problema: el RTC siempre está 32-33 segundos detrás de lo que configuré. El retraso ocurre tan pronto como ejecuto el boceto. Me parece muy extraño que no importa cómo intente establecer la hora, termino exactamente con el mismo error. Puedo decirle al Arduino que informe que el tiempo es 33 segundos después de lo que dice el RTC, pero esta solución parece un poco incompleta, y me preocupa que algo esté fundamentalmente mal con mi RTC o la forma en que lo estoy usando.

Estoy usando un Arduino Uno con un escudo de registro de datos ensamblado de Adafruit. El escudo de registro de datos utiliza un DS1307 RTC. ¿Alguien ha tenido este problema antes o tiene alguna idea sobre lo que podría estar causándolo? Cualquier ayuda sería muy apreciada.


¡He tomado la explicación de Hugo Bertini y Oli para usar en mis proyectos y funciona! Gracias (: pero va más rápido en 26 segundos ...
Ahmad Zaki Aiman ​​Abdul Rashid

Respuestas:


17

Los __DATE__y __TIME__se configuran cuando el código se está compilando, por lo que, naturalmente, estarán atrasados, ya que el código aún debe terminar de compilarse y luego enviarse al chip.

Vea el Arduino Playground para ver un ejemplo de cómo sincronizarlo con su computadora en serie.

TimeSerial.pde muestra a Arduino como un reloj sin hardware externo.

Se sincroniza mediante mensajes de tiempo enviados a través del puerto serie. Un boceto de procesamiento complementario proporcionará automáticamente estos mensajes si se está ejecutando y está conectado al puerto serie Arduino.


0

Puede corregir el desplazamiento llamando una vez al siguiente código en la setup()función:

RTC_DS3231 rtc;

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

0

Estoy experimentando un problema similar con un Arduino UNO y un Nano. Ambos desde la misma PC. De hecho, parece que se refleja el tiempo que lleva desde el tiempo de compilación hasta la carga + el inicio de MCU.

Suponiendo que el RTC tiene una buena batería y los tiempos de compilación + carga son consistentes, entonces agregar una compensación de deriva al código parece ser el truco. Así es como lo hice (en mi caso, 7 segundos hicieron el "truco" - lo siento por el código de hardo, pero es solo para fines de descripción):

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

Saludos, Hugo Bertini


-1

El Arduino toma el tiempo de la computadora y lo envía al DS1307. El tiempo que lleva copiar es el que está viendo mal. Resolvería el problema adelantando el tiempo de la computadora los segundos necesarios que usted dice que se retrasan y cuando programe debe tener el tiempo exacto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.