Синхронизация библиотеки времени и RTClib

Пытаюсь разобраться в двух библиотеках и setSyncProvider(RTC.now). Использование Arduino Uno с Adafruit ChronoDot. Aduino IDE 1.8.13.

Приведенный ниже код предназначен просто для того, чтобы понять, что происходит.
Я получаю удивительные результаты, а это значит, что я не понимаю, что делают библиотеки.

То, что я думаю, я говорю ему делать:

  1. Установите время RTC на 05:10:30
  2. Установите библиотеку времени на 09:27:05
  3. В цикле время печати библиотеки (час, минута, секунды)
  4. В цикле выводится время RTC (сейчас.час, сейчас.минута, сейчас.секунда).
  5. Каждые 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

, 👍-2

Обсуждение

-1, поскольку вы явно не обратили внимания на ответ на ваш предыдущий вопрос. Я уже объяснял, почему setSyncProvider(RTC.now) неверен и может привести только к тому, что библиотека времени выдаст вам мусор., @Edgar Bonet

@EdgarBonet - Извините, я использовал вашу предыдущую информацию, и это сработало. Скопируйте сюда ошибку вставки из более старого кода. Спасибо за вашу помощь и терпение., @RickH


1 ответ


Лучший ответ:

1

Почему библиотека времени time hour() minute() second() изменяется с 9:27: 9 до 12:43:44 после первой синхронизации, а затем с 12:43:48 до 19: 1:20 после второй синхронизации, а затем сбрасывается до 19: 1:20 после каждой последующей синхронизации?

Потому что:

  1. Вы продолжаете вызывать setSyncProvider(). Весь смысл системы синхронизации заключается в том, что вы должны вызвать ее только один раз, чтобы установить поставщика синхронизации, а затем она автоматически синхронизируется.
  2. Вы настраиваете поставщика синхронизации на функцию, которая возвращает объект. Поставщику синхронизации нужна функция, которая возвращает значение без знака long (time_t).

Ваш код должен быть следующим:

setSyncProvider(time_provider);

И он должен быть вызван только один раз из внутренней настройки.

Вопрос 2: Почему после синхронизации для библиотек Time hour(), minute() и second() не установлены значения RTC для now.hour(), now.minute() и now.second()?

Из-за всего того, что я изложил выше, а также было сказано в вашем последнем вопросе.

,