Разница между «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"? Или проблема сложнее, чем простое преобразование между типами данных?
@Vinterwoo, 👍8
1 ответ
Лучший ответ:
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();
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Библиотека времени Arduino и библиотеки RTC
- Как найти разницу между двумя timestamp
- Синхронизация библиотеки времени и RTClib
- Получение кода FFT arduino для работы более 9 часов с использованием micros()
- DS3231 с Arduino Nano для точной синхронизации
- Альтернатива RDTSC для Arduino
- Невозможно ввести клавишу клавиатуры в цикл while