Arduino Time Library és RTC Libraries

Az RTClib.h és a TimeLib.h fájlokat Uno-val használom.

Napok óta küzdök a rendelkezésre álló különféle RTC könyvtárak megértésében és azok használatában az Arduino Időtárral.

1. kérdés .
Ha nem akarok minden egyes pillanatban új () objektumot létrehozni a cikluson keresztül, hogyan szinkronizálhatom az Időtárat az RTC-vel x másodpercenként? Bármikor megpróbálom használni az RTClib függvényt most. Óra most. Perc, stb., A DateTime now = RTC.now () használatára van szükség a now () objektum létrehozásához.

Van-e egyenértékű függvény az RTCLib-ben mint setSyncProvider (RTC.get) a DS1307RTC könyvtárban?

Van-e megfelelője a setSyncInterval (5000)

2. kérdés .
Melyik RTCLib-et hívjam meg? A példákban több is használható:

< RTClib.h >

” RTClib ” idézőjelek használatával

< RTCLib.h > nagybetűvel L

, és néha felhívja ezek egyikét is:

RTC_DS1307 RTC

vagy RTC_DS1307 rtc

vagy RTC_DS3231 rtc

3. kérdés
a. A tmElements_t tm része a DS1307RTC könyvtárnak?
b. Ezek tm.Hour tm.Minute az RTC-től?
c. Van-e megfelelője az RTClib.h-ben?

És végül az alábbiakban feltettem néhány kódot, csak hogy bemutassam a használatomat:

#include "RTClib.h" #include <Wire.h> #include <TimeLib.h> RTC_DS1307 RTC; void setup() { Serial.begin(9600); Wire.begin(); //sets up the I2C RTC.begin(); //initializes the I2C to the RTC if (! RTC.begin()) { Serial.println("Couldn"t find RTC"); } // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30)); //Set Arduino Time Library different than RTC time to see which is which setTime(9, 27, 05, 14, 07, 2015); } void loop() { /* // How do I sync Time Library to RTC after x seconds? setSyncProvider(RTC.get); // This is in the DS1307RTC.h Library setSyncInterval(5000); // Are there such functions in RTClib ? */ DateTime now = RTC.now(); // Pulls RTC time into now(). Does not sync with Time Library // Do not want to do this every loop. //Print RTC Time Serial.println(); Serial.print("RTC now.hour "); Serial.println(now.hour()); Serial.print("RTC now.minute "); Serial.println(now.minute()); Serial.print("RTC now.second: "); Serial.println(now.second()); Serial.println(); Serial.println(); //Print Arduino TimeLib Time Serial.print("Time Lib Hour: "); Serial.print(hour()); Serial.println(); Serial.print("Time Lib Min: "); Serial.print(minute()); Serial.println(); Serial.print("Time Lib Sec: "); Serial.print(second()); Serial.println(); Serial.println(); delay(1000); } 

Frissítve 2020. november 5.

Azt hiszem, már majdnem értem. Kérjük, tudassa velem, hogy ez a kód azt csinálja-e, amit gondolok, különösen:

A Beállításban:
Állítsa az RTC-t 5: 10: 30-ra.
Állítsa az Időkönyvtárat 9:27:05 a setTime () használatával.
A Time Library beállítása RTC időre a DateTime now használatával (9:27:05 írás közben)?
A Time Library változók beállítása RTC értékre a tm.Hour = now használatával. Óra stb.

Hurokban:
5 másodpercenként frissítse az órát (), percet () másodpercet () az RTC idővel.
Minden ciklus tm órát frissít az órával () , stb.

Tudom, hogy még mindig nem stimmel, mivel a soros nyomatok a tm.Hour, tm.Minute felváltva váltják az egyes hurkokat, ahogy az alul látható.

 #include "RTClib.h" #include <Wire.h> #include <TimeLib.h> RTC_DS1307 RTC; time_t time_provider() { return RTC.now().unixtime(); } tmElements_t tm; //part of Time Library void setup() { //setSyncProvider(time_provider); Serial.begin(9600); Wire.begin(); //sets up the I2C RTC.begin(); //initializes the I2C to the RTC if (! RTC.begin()) { Serial.println("Couldn"t find RTC"); } // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30)); //Set Arduino Time Library different than RTC time 9:27:05 setTime(9, 27, 05, 14, 07, 2015); //Setting Time Library to RTC time DateTime now = RTC.now(); tm.Hour = now.hour(); tm.Minute = now.minute(); tm.Second = now.second(); } void loop() { setSyncProvider(RTC.now); setSyncInterval(5000); //Time Library time updates to RTC every 5 seconds tm.Hour = hour(); tm.Minute = minute(); tm.Second = second(); Serial.print("tm.Hour: "); Serial.print(tm.Hour); Serial.println(); Serial.print("tm.Minute: "); Serial.print(tm.Minute); Serial.println(); Serial.print("tm.Seconds: "); Serial.print(tm.Second); Serial.println(); Serial.println(); delay(1000); }  

Soros nyomatok:

tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 

Válasz

Hadd adjak először néhány hátteret ezekről a könyvtárakról.

A Time könyvtár a millis() elemet használja időmérés. Mivel ez jelentős sodródásnak lehet kitéve, lehetőséget nyújt arra, hogy időnként szinkronizáljon egy külső időszolgáltatóval. Ezért a setSyncProvider() és a setSyncInterval() függvények.

Az RTClib egy RTC interfészt jelent. Önmagában nem nyújt időmérést: az aktuális időt úgy kapja meg, hogy lekérdez egy RTC-t “s now() módszerrel.

Ez a két könyvtár szépen kiegészítheti mindegyiket egyéb, mivel az RTClib használható az Idő könyvtár időszolgáltatójaként:

 // Provide the RTC time to the Time library. time_t time_provider() { return RTC.now().unixtime(); } void setup() { // ... setSyncProvider(time_provider); }  

Ha nem akarok új () objektumot létrehozni […]

Valójában DateTime objektumnak hívják.

Van-e ennek megfelelője [div id = ” 4f61ccafe6 “>

] az RTClib-ben

Igen, a DateTime osztály . Vegye figyelembe, hogy a tmElements_t szerkezettel ellentétben a DateTime adatmezői nem nyilvános, és a hozzáféréshez hozzáférőket kell használnia: year(), month(), day()

Alternatív időmérési módszer

Mivel Arduino Uno-t használ, létezik egy harmadik időmérési módszer is meg akarja fontolni. Ahelyett, hogy lekérdezné az RTC-t minden hurok iteráción (RTClib), vagy az RTC olvasmányait interpolálja az millis() (Időkönyvtár) segítségével, az RTC 1 Hz-es kimenetét megszakító tűhöz irányíthatja, és számolja a másodperceket az ISR-ben. Az avr-libc időzítési kódot úgy tervezték, hogy ilyen módon biztosítsa az időmérést. Minden a következőképpen alakul:

 // Initialize the system time from the RTC. set_system_time(RTC.now().secondstime()); // Keep the time in sync using the 1 Hz output of the RTC. pinMode(pin1Hz, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(pin1Hz), system_tick, FALLING);  

További részletekért lásd a vázlat példáját megszakítja az 1Hz.ino szolgáltatást az RTClib szolgáltatással.


1 : Megjegyzés megválaszolása

melyik csaphoz csatlakozik az [Arduino megszakító tű] az RTC-n?

Ez a használt RTC-től függ. Feltételezem, hogy ez egy DS1307, amint azt a kérdésében szereplő kód is tartalmazza. Vessen egy pillantást az RTC adatlapjára .A 6. oldalon található egy táblázat, amelynek címe „Tű leírása”. Ebből a táblázatból:

pin : 7
név : SQW / OUT
függvény : Szögletes hullám / kimeneti illesztőprogram. Ha engedélyezve van, az SQWE bit 1-re áll, az SQW / OUT tű a négy négyzethullámú frekvencia egyikét adja ki (1Hz, 4kHz, 8kHz, 32kHz). Az SQW / OUT csap nyitott lefolyású, és külső húzóellenállást igényel. Az SQW / OUT V CC vagy V BAT alkalmazással működik. A felhúzási feszültség legfeljebb 5,5 V lehet, függetlenül a V feszültségtől. Ha nem használjuk, akkor ezt a csapot lebegve hagyhatjuk.

Ha RTC modult használ, akkor ki kell derülnie. ott, ahol ez a tű ki van téve a modul csatlakozóján.

Mindenesetre engedélyeznie kell az 1 Hz-es négyzethullámú kimenetet a

 RTC.writeSqwPinMode(DS1307_SquareWave1HZ);  

2-es szerkesztést : A kérdés frissítésének kommentálása:

 // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30));  

Helyes.

 // Set Arduino Time Library different than RTC time 9:27:05 setTime(9, 27, 05, 14, 07, 2015);  

Helyes. A dátum 2015-07-14.

 // Setting Time Library to RTC time DateTime now = RTC.now(); tm.Hour = now.hour(); tm.Minute = now.minute(); tm.Second = now.second();  

Nem. Ez csak részben inicializálja az tm változó. Nincs hatása a Time könyvtár aktuális ideájára. Ne feledje, hogy az tm dátummezői ezen a ponton nincsenek inicializálva, és érvénytelenek lehetnek (például 23. hónap, 125. nap).

 setSyncProvider(RTC.now);  

Ez helytelen, és fordító figyelmeztetést kellett volna generálnia. A setSyncProvider() olyan funkciót vár, amely az aktuális időt Unix-időként adja vissza (egyszerű egész szám, time_t típusú). Olyan függvényt biztosít, amely az aktuális időt lebontva adja vissza (év, hónap …), a következő típus: DateTime. A Time könyvtár ezt nem fogja megérteni, és olyan szemetet adhat, mint például 18:00:00.

A RTC.now() által visszaadott idő konvertálható Unix időre a unixtime() módszerrel. Ezért adtam meg neked a time_provider() függvényt.

Ezenkívül nem szabad hívnod a setSyncProvider() és setSyncInterval() minden hurok iterációnál. Végezze el egyszer és mindenkorra a setup() mezőben.

 // Time Library time updates to RTC every 5 seconds tm.Hour = hour(); tm.Minute = minute(); tm.Second = second();  

Ismételten ez csak az tm változót frissíti. Nincs hatással arra, hogy a Time könyvtár szerint mi az aktuális idő.

Válasz

Van egy egyenértékű függvény az RTCLib-ben setSyncProvider (RTC.get) néven a DS1307RTC könyvtárban?

Van-e egyenértékű a setSyncInterval (5000)

Ezek TimeLib függvények. Nincsenek ” ekvivalensek a ” mivel használod a TimeLib-et.

Az első csak arra számít, hogy egy függvényre mutató r eturns a time_t. Az, hogy mi van ebben a funkcióban, rajtad múlik.

Melyik RTCLib-et hívjam meg? A példákban több is használható:

A nagybetűknek meg kell egyezniük a fejlécfájl nevével. A Windows nem érdekli, és az OS X általában nem érdekli, de konfigurálható. A Linux gondoskodik ról és szüksége van rá, hogy megfeleljen. Ha azt akarja, hogy a kód hordozható legyen, akkor a nagybetűket meg kell őriznie, mint a fájlt.

és néha az alábbiak egyikét is ki kell hívnia:

Létre kell hoznia egy objektumot, amely megfelel a fizikai RTC-nek.

a. A tmElements_t tm része a DS1307RTC könyvtárnak?

Nem. A TimeLib részei.

b. Ezek tm.Hour tm.Minute az RTC-ből? Csak változók. Bármit tartalmazhatnak.

c. Van megfelelője az RTClib.h-ben?

Nem. De akkor nem kell ott lennie, ha a TimeLib-et használja.

Tehát:

  • létre kell hoznia egy olyan függvényt, amely az RTC-től kap időt az összes használni kívánt könyvtáron keresztül (például RTCLib), és kiszámítja a másodpercek számát 00:00:00 után 1970.01.01-ig, amelyet ezután time_t néven ad vissza.
  • Adja át a TimeLib-nek “s setSyncProvider()
  • Állítson be szinkronizálási gyakoriságot a következővel: setSyncInterval().

Megjegyzések

  • now az az idő, amely az RTC-től származik abban a pillanatban, amikor az now objektumot hozzárendeli. .hour() csak az az óra, amelyet az objektum tartalmaz. hour() a TimeLib könyvtárból származó idő, igen. setSyncProvider () doesn ‘ ne küldjön semmit az RTC-nek, rendszeresen megkapja az időt az RTC-től, és frissíti a TimeLib-et az aktuális idővel.
  • Ez ‘ sa ennél kicsit bonyolultabb. A TimeLib millis() hogy nyomon kövesse az időt. Rendszeresen frissíti belső elképzelését arról, hogy mi az idő a setSyncInterval() függvényében. amikor a következőt kéri: hour(), ha több idő telt el, mióta utoljára megkapta a setSyncInterval() mezőben megadott valós időt, akkor megkapja az idő az RTC-től. Ellenkező esetben csak megmondja, hogy mit gondol az idő a saját belső számításai szerint.
  • Frissítettem a bejegyzést a segítséggel. Szinte megértette.
  • Mivel ‘ folyamatosan változtatja a szinkronizálási szolgáltatót és az intervallumot. Ezeket egyszer és egyszer csak a beállítás során állíthatja be, és soha többé.
  • Ez jól néz ki, igen. Bár egyáltalán nem kell ‘ szüksége a tmElements_t struktúrára, mivel minden ‘ foglalkozik az egyszerű számokkal. A tmElements_t csak egy kényelmes módszer az összes csomagolására, ha át akarja adni egy másik funkciónak. Csak Serial.print(hour());

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük