Am întâmpinat o problemă, încercând să combin 2 proiecte diferite de temporizator Arduino pe care le-am găsit online.
Pentru ambele proiecte folosesc un DS3231 RTC, dar am reușit să folosesc biblioteca DS1307 foarte bine în codul meu.
Primul set de cod pe care l-am preluat a început cu:
#include <DS1307RTC.h>
Al doilea set de coduri pe care am încercat să îl combin nu avea acest „include”, ci în schimb l-am folosit
RTC_DS1307 RTC;
așa cum se găsește aici:
https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/understanding-the-code
În calitate de programator novice, nu prea știu care este diferența dintre cele două moduri de mai sus de a apela această bibliotecă. Dar știu prima modalitate folosind „include”, dacă vreau să accesez ora curentă pe RTC, folosesc
RTC.get();
spre deosebire de a doua metodă ceea ce necesită:
RTC.now();
Și, deși a fost ușor să găsiți documentație pentru a sincroniza RTC cu timpul computerului prin cablul USB folosind acest bit de cod la îndemână:
// 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 }
Nu găsesc nicio alternativă ușoară folosind „#include DS1307RTC”
Am crezut mai întâi că diferența dintre RTC.now () și RTC .get () a fost doar o chestiune de substituire a cuvintelor. Dar mai târziu, când vreau să folosesc un apel „time_t” după inițializarea cu „RTC_DS1307 RTC;”
time_t timeNOW = RTC.now();
Primesc eroarea „nu se poate converti” DateTime ” la „time_t {aka long unsigned int}” în inițializare „
Deci, presupun că o metodă folosește„ DateTime ”și o metodă folosește„ time_t ”. Dar nu sunt sigur dacă acesta este cazul și, dacă da, cum să convertiți o valoare „DateTime” într-o valoare „time_t”.
Am două obiective în scrierea acestei postări.
1- Poate cineva să vă explice diferența dintre „#include DS1307RTC.h” și „RTC_DS1307 RTC;” și modul în care îmi afectează codul.
2- Aș dori să rămân cu „RTC_DS1307 RTC;”, doar pentru că pare ușor să îmi sincronizez RTC-ul cu computerul. Dar dacă o fac, primesc eroarea de mai sus. Așadar, poate cineva să-mi spună cum să convertesc un apel „RTC now ()” într-o valoare „time_t”? Sau problema este mai complicată decât o simplă conversie între tipurile de date?
Răspuns
A DateTime
este o clasă completă cu multe metode – un time_t
este doar un lung nesemnat.
time_t
este utilizat pentru a stoca numărul de secunde de la epoca (în mod normal 01/01/1970)
Biblioteca Arduino Time returnează un time_t
la funcția now()
– dar RTCLib returnează un obiect DateTime.
Obiectul DateTime are, totuși, un unixtime()
metodă care va returna o reprezentare time_t
a timpului stocat în obiectul DateTime.
Deci puteți face :
DateTime dt = RTC.now(); time_t time = dt.unixtime();