Синхронизация библиотеки времени и RTClib
Пытаюсь разобраться в двух библиотеках и setSyncProvider(RTC.now). Использование Arduino Uno с Adafruit ChronoDot. Aduino IDE 1.8.13.
Приведенный ниже код предназначен просто для того, чтобы понять, что происходит.
Я получаю удивительные результаты, а это значит, что я не понимаю, что делают библиотеки.
То, что я думаю, я говорю ему делать:
- Установите время RTC на 05:10:30
- Установите библиотеку времени на 09:27:05
- В цикле время печати библиотеки (час, минута, секунды)
- В цикле выводится время RTC (сейчас.час, сейчас.минута, сейчас.секунда).
- Каждые 5 секунд синхронизируйте библиотеку времени с RTC.
Это не то, что он делает.
Выходные данные серийных отпечатков находятся внизу.
Вопрос 1: Почему библиотека времени time hour() minute() second() изменяется с 9:27: 9 до 12:43:44 после первой синхронизации, а затем с 12:43:48 до 19: 1:20 после второй синхронизации, а затем сбрасывается до 19: 1:20 после каждая последующая синхронизация?
Вопрос 2: Почему после синхронизации для библиотек Time hour(), minute() и second() не установлены значения RTC для now.hour(), now.minute() и now.second()?
#include "RTClib.h"
#include <Wire.h>
#include <TimeLib.h>
RTC_DS1307 RTC;
unsigned long LastSyncTime = 0; // будет контролировать, когда он синхронизируется, просто чтобы понять
time_t time_provider()
{
return RTC.now().unixtime();
}
void setup() {
Serial.begin(9600);
Wire.begin(); //устанавливает I2C
RTC.begin(); // инициализирует I2C для RTC
// Установите время RTC на 5:10:30 3 ноября 2020 года
RTC.adjust(DateTime(2020,11,3,5,10,30));
// Установите библиотеку времени Arduino, отличную от времени RTC 9:27:05, чтобы посмотреть, как работает синхронизация
setTime(9, 27, 05, 4, 07, 2015);
}
void loop() {
//Время синхронизации каждые 5 секунд
if ((millis() - LastSyncTime) > 5000)
{
Serial.println("+++++ Sync ++++++++");
setSyncProvider(RTC.now); //устанавливает библиотеку времени в значение RTC time: hour(), установленное в значение RTC now.час (?)
LastSyncTime = millis();
}
DateTime now = RTC.now(); // возвращает время RTC в объект now
//Время печати Lib Times
Serial.print("hour: ");
Serial.print(hour());
Serial.println();
Serial.print("minute: ");
Serial.print(minute());
Serial.println();
Serial.print("seconds: ");
Serial.print(second());
Serial.println();
Serial.println();
//Вывести время RTC
Serial.print("now.hour: ");
Serial.print(now.hour());
Serial.println();
Serial.print("now.minute: ");
Serial.print(now.minute());
Serial.println();
Serial.print("now.second: ");
Serial.print(now.second());
Serial.println();
Serial.println("______________________");
delay(1000);
}
ВЫХОДНОЙ СИГНАЛ
час: 9
минут: 27
секунд: 8
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 33
час: 9
минут: 27
секунд: 9
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 34
+++++ Синхронизация ++++++++
час: 12
минут: 43
секунды: 44
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 35
час: 12
минут: 43
секунды: 45
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 36
час: 12
минут: 43
секунды: 46
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 37
час: 12
минут: 43
секунды: 47
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 38
час: 12
минут: 43
секунды: 48
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 39
+++++ Синхронизация ++++++++
час: 19
минута: 1
секунда: 20
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 40
час: 19
минута: 1
секунда: 21
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 41
час: 19
минута: 1
секунда: 22
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 42
час: 19
минута: 1
секунда: 23
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 43
час: 19
минута: 1
секунда: 24
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 44
+++++ Синхронизация ++++++++
час: 19
минута: 1
секунда: 20
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 45
час: 19
минута: 1
секунда: 21
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 46
час: 19
минута: 1
секунда: 22
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 47
час: 19 минута: 1 секунда: 23
сейчас.час: 5
сейчас.минута: 10
сейчас.секунда: 48
час: 19
минута: 1
секунда: 24
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 49
+++++ Синхронизация ++++++++
час: 19
минута: 1
секунда: 20
сейчас.час: 5
сейчас.минута: 10
сейчас.секунда: 50
час: 19
минута: 1
секунда: 21
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 51
час: 19
минута: 1
секунда: 22
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 52
час: 19
минута: 1
секунда: 23
сейчас.час:
сейчас 5.минута:
сейчас 10.секунда: 53
@RickH, 👍-2
Обсуждение1 ответ
Лучший ответ:
Почему библиотека времени time hour() minute() second() изменяется с 9:27: 9 до 12:43:44 после первой синхронизации, а затем с 12:43:48 до 19: 1:20 после второй синхронизации, а затем сбрасывается до 19: 1:20 после каждой последующей синхронизации?
Потому что:
- Вы продолжаете вызывать
setSyncProvider()
. Весь смысл системы синхронизации заключается в том, что вы должны вызвать ее только один раз, чтобы установить поставщика синхронизации, а затем она автоматически синхронизируется. - Вы настраиваете поставщика синхронизации на функцию, которая возвращает объект. Поставщику синхронизации нужна функция, которая возвращает значение без знака long (
time_t
).
Ваш код должен быть следующим:
setSyncProvider(time_provider);
И он должен быть вызван только один раз из внутренней настройки.
Вопрос 2: Почему после синхронизации для библиотек Time hour(), minute() и second() не установлены значения RTC для now.hour(), now.minute() и now.second()?
Из-за всего того, что я изложил выше, а также было сказано в вашем последнем вопросе.
- Разница между «time_t» и «DateTime»
- Библиотека времени Arduino и библиотеки RTC
- Как получить текущее время и дату в Arduino без внешнего источника?
- Преобразование в Unix Timestamp и обратно
- Как запустить цикл на определенное время?
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Оси X и Y на последовательном плоттере Arduino?
-1, поскольку вы явно не обратили внимания на ответ на ваш предыдущий вопрос. Я уже объяснял, почему
setSyncProvider(RTC.now)
неверен и может привести только к тому, что библиотека времени выдаст вам мусор., @Edgar Bonet@EdgarBonet - Извините, я использовал вашу предыдущую информацию, и это сработало. Скопируйте сюда ошибку вставки из более старого кода. Спасибо за вашу помощь и терпение., @RickH