Mengapa jam waktu nyata saya mendapatkan waktu yang salah dari PC saya?

10

Saya ingin jam waktu-nyata saya mengatur waktunya sebagai waktu di PC saya. Namun, ketika saya menjalankan sketsa berikut, jam waktu sebenarnya melaporkan waktu 32-33 detik lebih awal dari PC saya mengatakan waktunya.

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

Saya juga mencoba secara manual mengatur waktu pada RTC, tetapi saya berakhir dengan masalah yang sama: RTC selalu 32-33 detik di belakang apa yang saya atur. Kelambatan terjadi segera setelah saya menjalankan sketsa. Sepertinya sangat aneh bagi saya bahwa tidak peduli bagaimana saya mencoba mengatur waktu, saya berakhir dengan kesalahan yang persis sama. Saya dapat memberitahu Arduino untuk melaporkan waktu 33 detik setelah apa yang dikatakan RTC, tetapi solusi ini tampaknya agak samar, dan saya khawatir ada sesuatu yang salah dengan RTC saya atau cara saya menggunakannya.

Saya menggunakan Arduino Uno dengan Shield Data Logging Shield dari Adafruit. Pelindung pencatatan data menggunakan DS1307 RTC. Adakah yang pernah mengalami masalah ini sebelumnya, atau memiliki ide tentang apa yang menyebabkannya? Bantuan apa pun akan sangat dihargai.

orang gila
sumber
Ive mengambil penjelasan Hugo Bertini dan Oli untuk digunakan dalam proyek saya dan itu berhasil! Terima kasih (: tapi itu berjalan lebih cepat 26 detik ....
Ahmad Zaki Aiman ​​Abdul Rashid

Jawaban:

17

The __DATE__dan __TIME__ditetapkan ketika kode ini kompilasi sehingga mereka secara alami akan berada di belakang karena kode masih perlu menyelesaikan kompilasi dan kemudian melintas ke chip.

Lihat Arena Bermain Arduino untuk contoh cara menyinkronkannya ke komputer Anda melalui serial.

TimeSerial.pde menunjukkan Arduino sebagai jam tanpa perangkat keras eksternal.

Ini disinkronkan dengan pesan waktu yang dikirim melalui port serial. Sketsa Pemrosesan pengiring akan secara otomatis memberikan pesan-pesan ini jika sedang berjalan dan terhubung ke port serial Arduino.

sachleen
sumber
0

Anda dapat memperbaiki offset dengan memanggil sekali kode berikut dalam setup()fungsi:

RTC_DS3231 rtc;

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

Saya mengalami masalah serupa dengan Arduino UNO dan Nano. Keduanya dari PC yang sama. Memang sepertinya waktu yang dibutuhkan dari waktu kompilasi untuk mengunggah + MCU mulai tercermin.

Dengan asumsi RTC memiliki baterai yang bagus dan waktu kompilasi + unggahan konsisten, kemudian menambahkan kompensasi melayang ke kode tampaknya melakukan trik. Inilah cara saya melakukannya (dalam kasus saya 7 detik melakukan "trik" - maaf untuk hardocode, tapi itu hanya untuk tujuan deskripsi):

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

Salam, Hugo Bertini

Hugo Bertini
sumber
-1

Arduino membutuhkan waktu komputer dan mengirimkannya ke DS1307. Waktu yang diperlukan untuk menyalin adalah salah satu yang Anda lihat salah. Saya akan memecahkan masalah dengan memajukan waktu komputer detik-detik yang diperlukan yang Anda katakan tertunda dan ketika pemrograman Anda harus memiliki waktu yang tepat.

antonio
sumber