LAKI PINGVINI
Real Time Clock
Pozovi RTC radi vremena
Dejan PETROVIĆ
1. april 2021.

Tolstoj je davno napisao da su dva najmoćnija ratnika strpljenje i vreme. Mi, mejkeri, u konstantnoj smo borbi sa njima. Iako nam se čini da možemo da ih pobedimo, to se, nažalost, još nije desilo. Ali, ako ih ne možemo pobediti, možemo ih izmeriti. Barem vreme, a za strpljenje strpljivo čekamo odgovarajući senzor.

Šalu na stranu, vreme je vrlo bitan faktor u skoro svim projektima. Bez obzira na to da li govorimo o trenutnom, tačnom vremenu ili vremenu proteklom između događaja. To može biti i vreme vezano za deep sleep ili tačno vreme slanja podataka na server, upisa na mikro-SD karticu ili zalivanja bašte. Ovaj put ćemo se dotaći nekoliko načina uz čiju pomoć možemo odrediti tačno vreme. U embedded terminologiji, ovaj termin naziva se Real Time Clock ili skraćeno - RTC. Neretko smo pominjali ovaj termin, pa čak i koristili neke module usputno. Sada ćemo probati da to malo podrobnije obradimo.

DS1302

Postoji više integralnih kola koja nam omogućavaju precizno merenje vremena. Jedno od njih je i DS1302. Ovo integralno kolo ima osam pinova, a sa mikrokontrolerom komunicira putem 3-wire interfejsa. Čip ima dva VCC pina, a u verziji kompanije Maxim Integrate čip može da radi na naponima od 3,3 i pet volti preko VCC2. Za takozvanu Low Power Operation Run Time potrebno je dodati bateriju sa naponom između dva i pet volti na pin VCC1. Čip će automatski prebacivati napajanje na viši napon. To znači da, ako imamo CR2032 bateriju, sve dok nam napajanje čipa ne padne ispod tri volta, baterija se neće koristiti. Međutim, ako padne ispod, koristiće se baterija. Govorimo isključivo o napajanju čipa. Na ovaj način prethodno podešeno vreme nastaviće da odbrojava i dalje, čak i kada je isključen uređaj sa kojim je čip povezan.

DS1302 traži i eksterni kristal od 32,768 kiloherca koji povezujemo na X1 i X2 pinove. S obzirom na to da spoljašnji kristal biva izložen spoljašnim temperaturnim promenama, dolazi i do uticaja na takt, što dalje vodi do netačnog vremena. DS1302 se sa mikrokontrolerom povezuje preko CE, I/O i SCLK. Ovaj čip ne zahteva nikakvu drugu dodatnu komponentu, međutim, ne može se pohvaliti preciznošću. Iz tog razloga se ređe koristi.

Nabavili smo RTC u formi modula sa pet izvedenih pinova. VCC i GND povezujemo na odgovarajuće naponske pinove našeg Arduina. CLK, DAT i RST povezujemo na 6, 7 i 8 GPIO Arduina. Postoji nekoliko biblioteka koje možemo koristiti sa DS1302. Mi smo koristili ArduinoRTCLibrary i RTC by Makuna i sa obe smo zadovoljni. U primeru ispod koristimo ovu prvu. Ono što je bitno jeste funkcija setDS1302Time(). Preko ove funkcije postavljamo trenutni datum i vreme, a nakon toga je potrebno ponovo prebaciti skeč na mikrokontroler, ali ovu liniju izbrisati (ili pretvoriti u komentar) da se ne bi svaki put postavljalo vreme upisano u skeču, prilikom svakog reseta ili nestanka struje. Baterija će postavljeno vreme čuvati i čip će odbrojavati dalje.

#include <virtuabotixRTC.h> //Library used

virtuabotixRTC myRTC(6, 7, 8); //SCK, DAT, RST

void setup() {

Serial.begin(9600);

// seconds, minutes, hours, day of the week, day of the month, month, year

myRTC.setDS1302Time(19, 13, 19, 6, 20, 3, 2021); //Here you write your actual time/date as shown above

}

void loop() {

myRTC.updateTime();

Serial.print("Trenutan Datum / Vreme: ");

Serial.print(myRTC.dayofmonth);

Serial.print("/");

Serial.print(myRTC.month);

Serial.print("/");

Serial.print(myRTC.year);

Serial.print(" ");

Serial.print(myRTC.hours);

Serial.print(":");

Serial.print(myRTC.minutes);

Serial.print(":");

Serial.println(myRTC.seconds);

delay(1000);

}

DS3231

Dosta bolji izbor bio bi DS3231, integralno kolo koje, takođe, dolazi iz firme Maxim Integrated. DS3231 pravi razliku u broju dana u mesecu, kao i u 24 i 12-časovnom formatu dana. Ovaj čip dolazi u pakovanjima sa različitim brojem pinova, međutim, koristi se uvek isti broj njih. Ostali su NC (not connected). DS3231 se sa mikrokontrolerom povezujem putem I2C interfejsa, ali ima i još par kečeva u rukavu.

S obzirom na to da koristi ugrađeni kristal, DS3231, takođe, ima i temperaturni senzor radi kompenzovanja takta u odnosu na temperaturu. Ovu temperaturu možemo očitati. Precizno određen, uz kompenzaciju temperature, odrediće se i referentni napon, što će dovesti do automatskog prebacivanja na veći izvor napajanja, na sličan način kao i kod jednostavnijeg DS1302, s tim što kompenzovanje temperature uz ugrađen kristal ujedno znači i preciznije odbrojavanje vremena, zaštićeno od spoljnih uticaja.

Sam čip traži par komponenata više od DS1302. Pull-up otpornici na I2C linijama se podrazumevaju. Pin 32KHz je output i trebalo bi ga povezati sa pull-up otpornikom ako ćemo ga koristiti. Ako ne, ostavljamo ga nepovezanog. INT/SQW pin je aktivni LOW output, bilo kao interrupt, bilo kao output kvadratnog talasa. Možemo programirati bilo šta od jedan, četiri, osam ili 32 kiloherca. Kao interrupt, možemo ga koristiti kao alarm ili za buđenje mikrokontrolera iz deep sleep. Ako će se koristiti, koristimo pull-up otpornik na ovom pinu. RST pin možemo povezati sa tasterom ili GPIO, ako želimo da resetujemo čip. DS3231 za čuvanje početnog vremena, takođe, koristi bateriju, obično tipa CR2032.

Modul koji se može nabaviti uglavnom dolazi sa još jednim dodatkom, EEPROM AT24C32 memorijom, kojoj možemo pristupiti putem istog I2C interfejsa (druga adresa). Imamo header sa 32K(Hz), SQW(INT), SCL, SDA, VCC i GND. Na suprotnom kraju su naponski i I2C pinovi za dodavanje drugih uređaja na I2C liniju. Na modulu postoje i padovi za promenu I2C adrese EEPROM-a. Ako ćemo modul koristiti samo za vreme, tada povezujemo samo naponske i I2C pinove. Koristimo RTClib, a u primeru ispod imamo automatsku opciju za učitavanje vremena ako je čip ostao bez napajanja. Jedno je da vreme pokupi sa računara, a drugo je da se ručno unese. Nije potrebno ponovo uploadovati skeč sa ovom opcijom isključenom. Primer će ujedno ispisati i temperaturu koju je temperaturni senzor očitao.

#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Nedelja", "Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota"};

void setup () {

Serial.begin(9600);

if (rtc.lostPower()) {

Serial.println("RTC je ostao bez napajanja, ispravljamo vreme.");

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

// rtc.adjust(DateTime(2021, 3, 20, 20, 14, 0));

}

}

void loop () {

DateTime now = rtc.now();

Serial.print(now.year(), DEC);

Serial.print(’/’);

Serial.print(now.month(), DEC);

Serial.print(’/’);

Serial.print(now.day(), DEC);

Serial.print(" (");

Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);

Serial.print(") ");

Serial.print(now.hour(), DEC);

Serial.print(’:’);

Serial.print(now.minute(), DEC);

Serial.print(’:’);

Serial.print(now.second(), DEC);

Serial.println();

Serial.print("Temperatura: ");

Serial.print(rtc.getTemperature());

Serial.println(" C");

Serial.println();

delay(3000);

}

Sodaq_DS3231 biblioteka nudi implementiran i interrupt. U primeru biblioteke interrupts imamo funkciju enableInterrupts() gde možemo izabrati kada će se oni aktivirati. To može biti svake sekunde, minute ili sata. Isto tako možemo zadati tačno vreme u toku dana, što je prilično zgodno ako želimo da u određeno vreme zalijemo baštu, upalimo svetlo ili otvorimo kapiju. Podrazumeva se da SQW pin povežemo na interrupt pin Arduina i propisno ga označimo. O interrupt funkcijama biće više reči u nekom od narednih brojeva. O EEPROM memoriji je bilo reči ranije (SK 4/2018, i.sk.rs/14988).

Arduino macros

U primeru iznad možete videti da jedan od dva načina „štelovanja” vremena koristi i macro. Mi uvek možemo da pokupimo tačno vreme sa računara ako želimo da dodamo vreme kompajliranja skeča u naš projekat. Vreme možemo prikazati samo jednom linijom:

Serial.println( "Kompajlirano: " __DATE__ ", " __TIME__ ", " __VERSION__);

Ovo će ispisati datum, vreme, kao i verziju kompajlera. Treba znati da je macro „hardkodovan” i da se redosled dan/mesec i slično, ne može menjati.

Internet NTP

Network Time Protocol je standardni internet protokol koji se koristi za sinhronizovanje vremena. Za pristup ovom servisu nam je, naravno, potreban pristup internetu, bilo preko nekog Wi-Fi enabled mikrokontrolera, bilo putem Etherneta. U primeru ispod, koristeći ESP32, pristupamo NTP serveru i ispisujemo vreme. Biblioteka je NTPClient (taranais fork) koja omogućava, osim vremena, prikazivanje i datuma. Dobijen format sa T deli datum od vremena, što se lako može razdvojiti.

#include <NTPClient.h>

#include <WiFi.h>

#include <WiFiUdp.h>

const char *ssid = "dekip_network";

const char *password = "I23AS6T8";

WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);

void setup(){

Serial.begin(9600);

WiFi.begin(ssid, password);

while ( WiFi.status() != WL_CONNECTED ) {

delay (500);

Serial.print (".");

}

timeClient.begin();

}

void loop() {

timeClient.update();

Serial.println(timeClient.getFormattedTime());

Serial.println(timeClient.getFormattedDate());

delay(1000);

}

ESP32

Mnogi mikrokontroleri imaju ugrađen RTC. Ako zanemarimo koliko su precizni, mogu biti od velike koristi. Jedan od njih je nama dobro poznati ESP32. U primerima vezanim za sam ESP32 u okviru Arduino IDE je i primer gde se povezujemo na internet, pristupamo pomenutom NTP serveru, „kupimo” datum i vreme, isključujemo Wi-Fi i prikazujemo datum i vreme direktno sa RTC mikrokontrolera. Primer prenosimo u celosti.

#include <WiFi.h>

#include "time.h"

const char* ssid = "ssid";

const char* password = "pass";

const char* ntpServer = "pool.ntp.org";

const long gmtOffset_sec = 3600;

const int daylightOffset_sec = 3600;

void printLocalTime(){

struct tm timeinfo;

if(!getLocalTime(&timeinfo)){

Serial.println("Failed to obtain time");

return;

}

Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");

}

void setup(){

Serial.begin(115200);

//connect to WiFi

Serial.printf("Connecting to %s ", ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

Serial.print(".");

}

Serial.println(" CONNECTED");

//init and get the time

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

printLocalTime();

//disconnect WiFi as it’s no longer needed

WiFi.disconnect(true);

WiFi.mode(WIFI_OFF);

}

void loop(){

delay(1000);

printLocalTime();

}

Ako govorimo o RTC modulima i integralnim kolima, svakako da ova dva koja smo opisali nisu jedini. Situacija sa poštarinama je takva kakva jeste, ali ćemo se potruditi da u dogledno vreme dođemo i do drugih modela. Najsvežija mikrokontrolerska ploča Rpi Pico, takođe, dolazi sa ugrađenim RTC-om, međutim, machine.RTC() trenutno još uvek nije implementiran na Pico. Jedini način je pristup direktno kroz registre, za šta postoje primeri na GitHubu. Ako i vi imate kakve predloge ili rešenja za RTC i vreme na mikrokontrolerima, adresu SK foruma znate.


PRETHODNI TEKST
SLEDEĆI TEKST
Najčitanije
Igre
Telefoni
Hardver
Softver
Nauka
Aktuelno štampano izdanje
JUN 2025
Doom: The Dark Ages
Doom iz mračnog doba drugačiji je od svih drugih Doomova, jer je Slayer koncipiran kao tenk sa štitom...
Clair Obscur: Expedition 33
Estetika Belle Époquea, gameplay u skladu sa kanonima JRPG-a, vrhunsko pripovedanje i ljubav prema igrama...
Computex 2025, Tajpej, Tajvan
AI NEXT
Ovaj, nekada ultra-PC-specifični sajam, odavno se proširio na srodne tehnologije, biznis rešenja i digitalne usluge, postavši varijanta azijskog C...
Gigabyte GeForce RTX 5070 Gaming OC 12G
Višak samopouzdanja
Kartica je sa hardverske strane vrlo kvalitetna, ali ništa ne može da nadomesti nedostatak snage „pod haubom”...
Asus ProArt P16 (H7606WP)
Pronalazak neverovatnog
Novi ProArt P16 donosi moderna rešenja, u dobro usaglašenom odnosu gabarita i performansi – alatka koju ćete sa ponosom nosati sa sobom...
Logitech ProX Superlight 2
Sve udvostručeno
Ovaj miš predstavlja jasnu indikaciju da najveći proizvođač ne želi da napusti nijedan segment tržišta...
Winhance 25.05
Popravka Prozora
U pitanju je alatka koja omogućava da se brzo rešite (većine) bloatwarea, ali i da obavite optimizaciju rada Windowsa...
TCL NXTPAPER 11 Plus
Momak za sve
Ovo bi bio najbolji tablet „za te pare” i da košta 100 evra više...
.rs: Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije
Unapređeno e Zakazivanje
Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije
Google Mariner, Google Astra i AI autonomni agenti
Uspon tihog softvera
Umesto kliktanja stručnog lica, softver će, već ove godine, u tihom, gotovo nečujnom načinu rada - završavati posao...
Fatal Fury: City of the Wolves
Fatal Fury je oduvek bio čudna cvećka u svetu borilačkih igara; takav je i ostao...
Arc Raiders
Novi extraction shooter iz pera autora dobrih delova franšize Battlefield (i potcenjenog The Finals)...
© 2025 Svet kompjutera. Sva prava zadrzana.
Novi broj - Arhiva - Forum - O nama