Napotkałem problem podczas próby połączenia 2 różnych projektów timera Arduino, które znalazłem w Internecie.
W obu projektach używam DS3231 RTC, ale mogłem używać biblioteki DS1307 w moim kodzie.
Pierwszy zestaw kodu, który wybrałem, zaczął się od:
#include <DS1307RTC.h>
Drugi zestaw kodu, który próbowałem połączyć, nie zawierał tego „include”, ale zamiast tego został użyty
RTC_DS1307 RTC;
jak znaleziono tutaj:
https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/understanding-the-code
Jako początkujący programista nie jestem pewien, jaka jest różnica między powyższymi dwoma sposobami wywoływania tej biblioteki. Ale znam pierwszy sposób użycia „include”, jeśli chcę uzyskać dostęp do aktualnego czasu w RTC, używam
RTC.get();
w przeciwieństwie do drugiej metody co wymaga:
RTC.now();
I chociaż łatwo było znaleźć dokumentację dotyczącą synchronizacji czasu RTC z komputerem za pomocą kabla USB, używając tego przydatnego fragmentu kodu:
// Notify if the RTC isn"t running if (! RTC.isrunning()) { Serial.println("RTC is NOT running"); } // Get time from RTC DateTime current = RTC.get(); DateTime compiled = DateTime(__DATE__, __TIME__); if (current.unixtime() < compiled.unixtime()) { //CHECKS AGAINST COMPUTERTIME Serial.println("RTC is older than compile time! Updating"); RTC.adjust(DateTime(__DATE__, __TIME__)); //UPDATES FROM COMPUTER IF OLD TIME IS OFF }
Nie mogę znaleźć łatwej alternatywy przy użyciu „#include DS1307RTC”
Najpierw pomyślałem, że różnica między RTC.now () a RTC .get () było tylko kwestią podstawiania słów. Ale później, gdy chcę użyć wywołania „time_t” po zainicjowaniu z „RTC_DS1307 RTC;”
time_t timeNOW = RTC.now();
Otrzymuję błąd „nie można przekonwertować„ DateTime ” do „time_t {aka long unsigned int}” w inicjalizacji ”
Zakładam więc, że jedna metoda używa„ DateTime ”, a jedna metoda używa„ time_t ”. Ale nie jestem pewien, czy tak jest a jeśli tak, jak przekonwertować wartość „DateTime” na wartość „time_t”.
Pisząc ten post mam dwa cele.
1 – Czy ktoś może wyjaśnić różnica między „#include DS1307RTC.h” a „RTC_DS1307 RTC;” i jaki ma to wpływ na mój kod.
2- Chciałbym pozostać przy używaniu „” RTC_DS1307 RTC; „tylko dlatego, że wydaje mi się, że synchronizacja mojego RTC z komputerem jest łatwa. Ale jeśli tak, pojawia się powyższy błąd. Czy ktoś może mi powiedzieć, jak przekonwertować wywołanie „RTC now ()” na wartość „time_t”? A może problem jest bardziej skomplikowany niż zwykła konwersja między typami danych?
Odpowiedź
A DateTime
to pełna klasa z wieloma metodami – time_t
to po prostu długość bez znaku.
time_t
służy do przechowywania liczby sekund, które upłynęły od epoki (zwykle 01/01/1970)
Biblioteka Arduino Time zwraca time_t
do funkcji now()
– ale RTCLib zwraca jako obiekt DateTime.
Jednak obiekt DateTime ma unixtime()
, która zwróci time_t
reprezentację czasu zapisanego w obiekcie DateTime.
Możesz więc zrobić :
DateTime dt = RTC.now(); time_t time = dt.unixtime();