Tại sao đồng hồ thời gian thực của tôi nhận được thời gian sai từ PC của tôi?


10

Tôi muốn đồng hồ thời gian thực của mình đặt thời gian là giờ trên PC. Tuy nhiên, khi tôi chạy bản phác thảo sau, đồng hồ thời gian thực báo cáo thời gian sớm hơn 32-33 giây so với PC của tôi cho biết thời gian là.

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

Tôi cũng đã thử cài đặt thủ công thời gian trên RTC, nhưng tôi kết thúc với cùng một vấn đề: RTC luôn chậm hơn 32-33 giây so với những gì tôi đặt. Sự chậm trễ xảy ra ngay khi tôi chạy bản phác thảo. Nó có vẻ rất kỳ lạ với tôi rằng cho dù tôi cố gắng đặt thời gian như thế nào, cuối cùng tôi cũng bị lỗi tương tự. Tôi có thể yêu cầu Arduino báo cáo thời gian là 33 giây sau khi RTC nói, nhưng giải pháp này có vẻ sơ sài và tôi lo lắng rằng có gì đó không đúng với RTC của tôi hoặc cách tôi đang sử dụng nó.

Tôi đang sử dụng Arduino Uno với Khiên ghi nhật ký dữ liệu được lắp ráp từ Adaf nhung. Lá chắn ghi dữ liệu sử dụng RTC DS1307. Có ai có vấn đề này trước đây, hoặc có bất kỳ ý tưởng về những gì có thể gây ra nó? Bất kì sự trợ giúp nào đều được đánh giá cao.


Ive lấy lời giải thích của Hugo Bertini và Oli để sử dụng trong các dự án của tôi và nó hoạt động! Cảm ơn bạn (: nhưng nó nhanh hơn 26 giây ....
Ahmad Zaki Aiman ​​Abdul Rashid

Câu trả lời:


17

Các __DATE____TIME__được thiết lập khi mã đang biên dịch để chúng tự nhiên bị tụt lại do mã vẫn cần hoàn thành biên dịch và sau đó được flash vào chip.

Xem Arduino Playground để biết ví dụ về cách đồng bộ hóa nó với máy tính của bạn qua nối tiếp.

TimeSerial.pde hiển thị Arduino như một chiếc đồng hồ không có phần cứng bên ngoài.

Nó được đồng bộ hóa bởi các tin nhắn thời gian được gửi qua cổng nối tiếp. Một bản phác thảo Xử lý đồng hành sẽ tự động cung cấp các thông báo này nếu nó đang chạy và được kết nối với cổng nối tiếp Arduino.


0

Bạn có thể sửa lỗi bù bằng cách gọi một lần đoạn mã sau trong setup()hàm:

RTC_DS3231 rtc;

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

0

Tôi đang gặp vấn đề tương tự với Arduino UNO và Nano. Cả hai từ cùng một PC. Thật vậy, có vẻ như thời gian từ thời gian biên dịch để tải lên + MCU bắt đầu được phản ánh.

Giả sử RTC có pin tốt và thời gian biên dịch + tải lên là nhất quán, sau đó việc thêm bù trôi vào mã dường như thực hiện thủ thuật. Đây là cách tôi đã làm (trong trường hợp của tôi 7 giây đã thực hiện "mẹo" - xin lỗi vì mã cứng, nhưng đó chỉ là mục đích mô tả):

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

Trân trọng, Hugo Bertini


-1

Arduino mất thời gian của máy tính và gửi nó đến DS1307. Thời gian để sao chép là một trong những bạn đang nhìn thấy sai. Tôi sẽ giải quyết vấn đề bằng cách tăng thời gian máy tính những giây cần thiết mà bạn nói bị trì hoãn và khi lập trình bạn nên có thời gian chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.