Početnik si s Croduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala e-radionice na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Croduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.
Što je RTC?
RTC je skraćenica za Real Time Clock iliti, u slobodnom prijevodu, sat stvarnog vremena. Jednostavno, RTC je računalni sat koji prati vrijeme. Izraz se koristi kako bi ga razlikovali od hardwerskih satova (timera) koje koristimo za signale i upravljanje digitalnom logikom. I takve timere možemo upotrijebiti za praćenje vremena, iako brojni su benefiti RTC-a: mala potrošnja struje, oslobađanje memorije, veća preciznost, skraćivanje startup vremena povezivanja na GPS uspoređivanjem trenutnog vremena i dr. Vjerovatno ste primjetili kako većina RTC satova spominje frekvenciju 32.768 kHz.Poseban je što upravo čini 2^15 ciklusa po sekundi, a uglavnom se postiže oscilatorom.
PCF85063A
Evo zašto smo odabrali PCF85063A za naš breakout. Od očekivanih stvari, IC je prilagođen maloj potrošnji (22uA pri 3.3V), čuva za nas sat i datum uključujući dan u tjednu i godinu, brojne automatizirane kalibracije, two-wire komunikaciju, širok spektar napajanja (0.9V - 5.5V), POR i drugo. Ajmo sada zašto je najbolji: Alarm prograbilan po sekundama, minutama, satima, danima i/ili danima u tjednu s mogućnosti interrupta, timer kojeg je moguće postaviti od 244uS do 4 sata i 15 minuta ponovno s interruptom, programabilni clock-out i drugima (pogledaj datasheet) pa i cijeni. Baterija služi kako bi vrijeme, datum, alarmi i ostale postavke ostali spremljeni na RTCu. Ne zaboravistaviti jednu!
Kako povezati?
Breakout povezujemo kao i svaki I2C uređaj do sada, pogledaj skicu. Ponavljamo, plus stranu spajamo do maksimalno 5.5V, a INT pin breakout je opcija za drugi primjer arduino koda u nastavku.
Arduino kod
Za korištenje modula trebamo preuzeti Arduino biblioteku s linka. Kada preuzmemo zip datoteku potrebno ju je raspakirati i dodati u Arduino library mapu. Ako ne znate gdje se nalazi Arduino library mapa pogledajte tutorijal kako instalirati novu biblioteku.
Prikazat ćemo osnovni primjer korištenja biblioteka postavljanje vremena i datuma s prikazom. Nakon toga i postavljanje alarma, kontrolera u sleep mode te buđenje pomoći interrupta. Ostala primjere korištenja pronađi, nakon instaliranja biblioteke, u Arduino IDE File-Examples-PCF85063A.
#include "PCF85063A.h" PCF85063A rtc; void setup() { Serial.begin(115200); // postavi vrijeme -> (sat, minuta, sekunda) rtc.setTime(6, 54, 00); // 24H mode, ex. 6:54:00 // postavi datum -> (dan u tjednu, dan, mjesec, godina) rtc.setDate(6, 16, 5, 2020); // 0 za NEdjelju, ex. Subota, 16.5.2020. } void loop() { printCurrentTime(); delay(1000); } void printCurrentTime() { switch( rtc.getWeekday() ) { case 0: Serial.print("Nedjelja, "); break; case 1: Serial.print("Ponedjeljak, "); break; case 2: Serial.print("Utorak, "); break; case 3: Serial.print("Srijeda, "); break; case 4: Serial.print("Cetvrtak, "); break; case 5: Serial.print("Petak , "); break; case 6: Serial.print("Subota , "); break; } Serial.print(rtc.getDay()); Serial.print("."); Serial.print(rtc.getMonth()); Serial.print("."); Serial.print(rtc.getYear()); Serial.print(". "); Serial.print(rtc.getHour()); Serial.print(":"); Serial.print(rtc.getMinute()); Serial.print(":"); Serial.println(rtc.getSecond()); }
Primjer koda s postavljanjem alarma i aktivacije vanjskog interrupta koji budi Croduino iz Sleep moda.
#include "PCF85063A.h" #include "PCF85063A.h" #include <avr/sleep.h> PCF85063A rtc; int wakePin = 2; // pin used for waking up void wakeUpNow() { sleep_disable(); // first thing after waking from sleep: disable sleep... detachInterrupt(0); // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time. } void setup() { Serial.begin(115200); pinMode(wakePin, INPUT_PULLUP); pinMode(LED_BUILTIN, OUTPUT); // setTime(hour, minute, sec); rtc.setTime(6, 54, 00); // 24H mode, ex. 6:54:00 // setDate(weekday, day, month, yr); rtc.setDate(6, 16, 5, 2020); // 0 for Sunday, ex. Saturday, 16.5.2020. // setAlarm(alarm_second, alarm_minute, alarm_hour, alarm_day, alarm_weekday); rtc.setAlarm(15, 54, 99, 99, 99); // use 99 if no alarm checkAlarm(); Serial.print("Now is:" ); } void loop() { printCurrentTime(); Serial.println("Entering sleep mode in 1 second"); delay(1000); sleepNow(); // sleep function called here Serial.print("Interrupt triggered on: "); } void printCurrentTime() { switch( rtc.getWeekday() ) { case 0: Serial.print("Sunday , "); break; case 1: Serial.print("Monday , "); break; case 2: Serial.print("Tuesday , "); break; case 3: Serial.print("Wednesday , "); break; case 4: Serial.print("Thursday , "); break; case 5: Serial.print("Friday , "); break; case 6: Serial.print("Saturday , "); break; } Serial.print(rtc.getDay()); Serial.print("."); Serial.print(rtc.getMonth()); Serial.print("."); Serial.print(rtc.getYear()); Serial.print(". "); Serial.print(rtc.getHour()); Serial.print(":"); Serial.print(rtc.getMinute()); Serial.print(":"); Serial.println(rtc.getSecond()); } void checkAlarm() { Serial.print("Alarm is set to match: "); switch( rtc.getAlarmWeekday() ) { case 0: Serial.print("Sunday , "); break; case 1: Serial.print("Monday , "); break; case 2: Serial.print("Tuesday , "); break; case 3: Serial.print("Wednesday , "); break; case 4: Serial.print("Thursday , "); break; case 5: Serial.print("Friday , "); break; case 6: Serial.print("Saturday , "); break; default: break; // for getAlarmWeekday=99 alarm is not set for a weekday, donnot print } if( rtc.getAlarmDay()!=99 ) { Serial.print("Date: "); Serial.print( rtc.getAlarmDay() ); } if( rtc.getAlarmHour()!=99 ) { Serial.print(" hour: "); Serial.print( rtc.getAlarmHour() ); } if(rtc.getAlarmMinute()!=99) { Serial.print(" minute: ");Serial.print(rtc.getAlarmMinute()); } if(rtc.getAlarmSecond()!=99) { Serial.print(" second: ");Serial.print(rtc.getAlarmSecond()); } Serial.println(""); } void sleepNow() { sleep_enable(); // enables the sleep bit in the mcucr register attachInterrupt(0,wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here digitalWrite(LED_BUILTIN, LOW); sleep_cpu(); // activating sleep // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP digitalWrite(LED_BUILTIN, HIGH); }