Valós idejű óra

Itt egy valós idejű óramodult (RTC) csatlakoztatunk Arduinonkhoz.
Az RTC-k akkumulátorokkal vannak szerelve, így áramkimaradás esetén is tovább számlálják a pontos időt. Mikrokontrollerekkel összeépítve óraként, időzítőként, adatgyűjtéshez, riasztókba használják.
Ebben a cikkben a DS1307 használjuk, ez az egyik legjobb minőségű RTC, és illeszthető 5V rendszerekhez. Általában készletként kapható, forraszd magad de nem kell megijedni tőle, gyorsan összerakható.

Az Arduino is tartalmaz beépített időzítő t- a millis() paranccsal előhívható de ez csak a bekapcsolástól eltelt időt számlálja ezredmásodpercben. Ezzel szemben az RTC akkor is tovább számol ha nincs külső tápellátás, számolja a másodpercet, percet, órát, és a pontos dátumot is. Számolja a szökőéveket, a hónapokat, heteket, egyet nem kezel a nyári időszámítást, ezt azért nem mert ez helyileg változik.

Alkatrészek:

- Arduino uno

- Usb kábel

- Próbapanel

- Összekötő vezetékek

- DS1307 RTC

Építsük meg az áramkört:

S1307 lábkiosztása:
5V: ide kötjük a tápfeszültséget
GND: a GND
SCL: az óra kimenet i2c, Arduinon kösd az analóg 5-ös kimenethez.
SDA: adat kimenet i2c, Arduinon kösd az analóg 4-es kimenethez.
SQW: opciónális négyszögjel kimenet, csak speciális eseteknél használjuk.


Lássuk a kódot:

Először is töltsük le és telepítsük az RTClib könyvtárat.
Letölthető a : https://github.com/adafruit/RTClib webhelyről az RTClib.zip-et a jobb oldalt alul
található Download ZIP gombra kattintva. Majd csomagoljuk ki az Arduino/examples mappájába,
így létrejön a Minták között egy RTClib-master könyvtár.


// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"//a könyvtárunk inicializálása

RTC_DS1307 RTC;

void setup () {
Serial.begin(57600);//soros monitor bitsebessége
Wire.begin();
RTC.begin();


if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");// ha nem érzékeli az RTC futását hibaüzenet jelenik meg
// először beállítjuk a kezdő dátumot és ídőt az RTC-n
RTC.adjust(DateTime(__DATE__, __TIME__));
}

}

void loop () {
DateTime now = RTC.now();
Serial.print(now.year(), DEC);// év lekérdezése és kiíratás
Serial.print('/');
Serial.print(now.month(), DEC);//hónap lekérdezése
Serial.print('/');
Serial.print(now.day(), DEC);//stb....
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(" since 1970 = ");
Serial.print(now.unixtime());// másodpercben kiirt dátum és idő
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");

//
DateTime future (now.unixtime() + 7 * 86400L + 30);//7nap ms-ben +30ms jövőidő

Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);//jövőidő kiszámitás
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();

Serial.println();
delay(3000);//3s várakozás az új ciklusig
}


Az RTC modulokról most röviden ennyit, további jó felhasználást.