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()
…
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 Vfeszü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 aznow
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ő asetSyncInterval()
függvényében. amikor a következőt kéri:hour()
, ha több idő telt el, mióta utoljára megkapta asetSyncInterval()
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. AtmElements_t
csak egy kényelmes módszer az összes csomagolására, ha át akarja adni egy másik funkciónak. CsakSerial.print(hour());