KKM: PCF85063A RTC

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.

pcf85063 shema

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);
}
Leave a Reply