Разница между «time_t» и «DateTime»

Я столкнулся с проблемой при попытке объединить два разных проекта таймера Arduino, которые я нашел в Интернете.

Для обоих проектов я использую DS3231 RTC, но в моем коде я прекрасно использую библиотеку DS1307.

Первый набор кода, который я получил, начинался с:

#include <DS1307RTC.h>

Второй набор кода, который я пытался объединить, не содержал этого «включения», а вместо этого использовал

RTC_DS1307 RTC;

как здесь:

https://learn.adafruit.com/ds1307 -комплект-платы-разрыва-часов-реального-времени/понимание-кода

Как начинающий программист, я не очень понимаю, в чем разница между двумя указанными выше способами вызова этой библиотеки. Но я знаю первый способ, используя «include», если я хочу получить доступ к текущему времени на RTC, который я использую

RTC.get();

в отличие от второго метода, который требует:

RTC.now();

И хотя было легко найти документацию по синхронизации RTC с компьютерным временем через USB-кабель с помощью этого удобного фрагмента кода:

// Сообщаем, если RTC не запущен
    if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running");
  }



   // Получить время из RTC
  DateTime current = RTC.get();
  DateTime compiled = DateTime(__DATE__, __TIME__);
  if (current.unixtime() < compiled.unixtime()) { // ПРОВЕРЯЕТ ВРЕМЯ КОМПЬЮТЕРА
    Serial.println("RTC is older than compile time! Updating");
    RTC.adjust(DateTime(__DATE__, __TIME__));  //ОБНОВЛЕНИЕ С КОМПЬЮТЕРА, ЕСЛИ СТАРОЕ ВРЕМЯ ВЫКЛЮЧЕНО
  } 

Я не могу найти простой альтернативы "#include DS1307RTC"

Сначала я подумал, что разница между RTC.now() и RTC.get() заключается просто в замене слов. Но позже, когда я хочу использовать вызов «time_t» после инициализации с «RTC_DS1307 RTC»;

 time_t timeNOW = RTC.now();

Я получаю сообщение об ошибке "не удается преобразовать 'DateTime' в 'time_t {aka long unsigned int}' при инициализации"

Поэтому я предполагаю, что один метод использует "DateTime", а другой метод использует "time_t". Но я не уверен, так ли это, и если да, то как преобразовать значение "DateTime" в значение "time_t".

При написании этого поста у меня две цели.

1- Может ли кто-нибудь объяснить мне разницу между "#include DS1307RTC.h" и "RTC_DS1307 RTC"; и как это повлияет на мой код.

2- Я бы хотел использовать ""RTC_DS1307 RTC;" только потому, что кажется простым синхронизировать мой RTC с моим компьютером. Но если я это сделаю, я получаю указанную выше ошибку. Так может кто-нибудь, пожалуйста, скажите мне как преобразовать вызов "RTC now()" в значение "time_t"? Или проблема сложнее, чем простое преобразование между типами данных?

, 👍8


1 ответ


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

12

DateTime — это полноценный класс с множеством методов, а time_t — это просто тип long без знака.

time_t используется для хранения количества секунд, прошедших с эпохи (обычно 01.01.1970)

Библиотека Arduino Time возвращает time_t в функцию now(), но RTCLib возвращает объект DateTime.

Однако объект DateTime имеет метод unixtime(), который возвращает time_t представление времени, хранящегося в объекте DateTime.

Итак, вы можете сделать:

DateTime dt = RTC.now();
time_t time = dt.unixtime();
,