Почему мои часы реального времени показывают неверное время с моего ПК?
Я хочу, чтобы мои часы реального времени устанавливали свое время так же, как и время на моем ПК. Однако, когда я запускаю следующий скетч, часы реального времени сообщают о времени на 32-33 секунды раньше, чем говорит мой компьютер.
#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!");
// следующая строка устанавливает RTC на дату & время составления этого скетча
// раскомментировать & загрузите, чтобы установить время, дату и запустить 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();
}
Я также пытался вручную установить время на RTC, но столкнулся с той же проблемой: RTC всегда на 32-33 секунды отстает от того, что я установил. Задержка происходит, как только я запускаю скетч. Мне кажется очень странным, что как бы я ни пытался установить время, я получаю точно такую же ошибку. Я могу сказать Arduino, чтобы он сообщал время на 33 секунды позже того, что говорит RTC, но это решение кажется схематичным, и я беспокоюсь, что что-то принципиально не так с моим RTC или с тем, как я его использую.
Я использую Arduino Uno с собранным защитным экраном для регистрации данных от Adafruit. Экран регистрации данных использует DS1307 RTC. У кого-нибудь была эта проблема раньше или есть какие-либо идеи о том, что может быть ее причиной? Любая помощь приветствуется.
@lunafish, 👍10
Обсуждение5 ответов
__DATE__
и __TIME__
устанавливаются во время компиляции кода, поэтому они, естественно, будут отставать, поскольку код еще должен завершить компиляцию, а затем записать его на чип.
См. Площадку Arduino Playground, чтобы узнать, как синхронизировать ее с компьютером через последовательный порт.
TimeSerial.pde показывает Arduino как часы без внешнего оборудования.
Он синхронизируется сообщениями о времени, отправляемыми через последовательный порт. А сопутствующий скетч обработки автоматически предоставит эти сообщения если он запущен и подключен к последовательному порту Arduino.
Arduino берет время компьютера и отправляет его на DS1307. Время, необходимое для копирования, - это то, которое вы видите неправильно. Я бы решил проблему, опережая время компьютера на необходимые секунды, которые, как вы говорите, задерживаются, и при программировании у вас должно быть точное время.
Вы можете исправить смещение, вызвав один раз следующий код в функции setup()
:
RTC_DS3231 rtc;
DateTime now = rtc.now();
rtc.adjust(DateTime(now.unixtime() + 10)); // добавляем 10 секунд к текущему времени для фиксации смещения
У меня возникла аналогичная проблема с Arduino UNO и Nano. Оба с одного ПК. Действительно, похоже, что отражено время, которое требуется от времени компиляции до загрузки + запуска MCU.
Предполагая, что у RTC хорошая батарея и время компиляции и загрузки одинаковое, добавление компенсации дрейфа в код, похоже, помогает. Вот как я это сделал (в моем случае 7 секунд сделали «трюк» — извините за хардкод, но это просто для целей описания):
RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime t = DateTime(RTC.now().unixtime()+7);
RTC.adjust(t);
С уважением, Хьюго Бертини
С файлом <DS1307RTC.h> библиотеку DS1307 можно настроить во время настройки времени, используя глобальную переменную, а затем добавив ее к чтению Sec в функции getTime(), например, следующим образом:
#include <DS1307RTC.h>
tmElements_t tm;
byte adjustt = 8; // регулировка задержки в секундах, учитывающая время загрузки компилятора
/*********************
bool getTime(const char *str) {
int Hour, Min, Sec;
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec + adjustt;
return true;
}
- Несколько неблокирующих таймеров обратного отсчета?
- Получение кода FFT arduino для работы более 9 часов с использованием micros()
- Как повторить код
- Вопрос по программированию для Time Arduino
- Рассчитать часовой пояс по координатам GPS
- Как справиться с rollover millis()?
- Печать string and integer LCD
- Как получить текущее время и дату в Arduino без внешнего источника?
Я взял объяснения Хьюго Бертини и Оли, чтобы использовать их в своих проектах, и они работают! Спасибо (: но он идет быстрее на 26 секунд...., @Ahmad Zaki Aiman Abdul Rashid