Narazil jsem na problém, který se pokoušel zkombinovat 2 různé projekty časovače Arduino, které jsem našel online.
U obou projektů používám DS3231 RTC, ale v mém kódu jsem mohl použít knihovnu DS1307.
První sada kódu, kterou jsem zachytil, začala:
#include <DS1307RTC.h>
Druhá sada kódu, kterou jsem se pokusil zkombinovat, neměla tento „include“, ale místo toho byla použita
RTC_DS1307 RTC;
jak je zde nalezeno:
https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/understanding-the-code
Jako začínající kodér si nejsem úplně jistý, jaký je rozdíl mezi výše uvedenými dvěma způsoby, jak tuto knihovnu nazvat. Ale znám první způsob pomocí „include“, pokud chci získat přístup k aktuálnímu času v RTC, používám
RTC.get();
na rozdíl od druhé metody což vyžaduje:
RTC.now();
A zatímco bylo snadné najít dokumentaci k synchronizaci RTC s časem počítače pomocí kabelu USB pomocí tohoto šikovného kódu:
// 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 }
Nemohu najít snadnou alternativu pomocí „#include DS1307RTC“
Nejprve jsem si myslel, že rozdíl mezi RTC.now () a RTC .get () bylo jen otázkou nahrazení slov. Ale později, když chci použít volání „time_t“ po inicializaci pomocí „RTC_DS1307 RTC;“
time_t timeNOW = RTC.now();
Zobrazuje se mi chyba „nelze převést“ DateTime “ na „time_t {aka long unsigned int}“ při inicializaci „
Takže předpokládám, že jedna metoda používá“ DateTime „a jedna metoda používá“ time_t „. Ale nejsem si jistý, jestli je tomu tak , a pokud ano, jak převést hodnotu „DateTime“ na hodnotu „time_t“.
Při psaní tohoto příspěvku mám dva cíle.
1- Může mi někdo prosím vysvětlit mě rozdíl mezi „#include DS1307RTC.h“ a „RTC_DS1307 RTC;“ a jak to ovlivní můj kód.
2- Rád bych zůstal při používání „“ RTC_DS1307 RTC; “, jen proto, že se zdá snadné synchronizovat můj RTC s mým počítačem. Ale pokud ano, dostanu výše uvedenou chybu. Může mi někdo prosím říct, jak převést volání „RTC now ()“ na hodnotu „time_t“? Nebo je problém složitější než pouhá konverze mezi datovými typy?
Odpověď
A DateTime
je úplná třída se spoustou metod – time_t
je pouze nepodepsaný dlouhý.
time_t
slouží k uložení počtu sekund od epochy (obvykle 1. 1. 1970)
Knihovna Arduino Time vrací time_t
do funkce now()
– ale RTCLib vrátí objekt DateTime.
Objekt DateTime však má unixtime()
metoda, která vrátí time_t
reprezentaci času uloženého v objektu DateTime.
Takže můžete udělat :
DateTime dt = RTC.now(); time_t time = dt.unixtime();