Hodiny reálného času DS1307

Když chcete obohatit svůj projekt o práci s reálným časem, je výhodné využít obvod reálného času (v angličtině RTC – Real Time Clock). V tomto návodu jsou uvedeny informace o modulu pro Arduino s obvodem DS1307. Tento obvod reálného času umožňuje komunikaci po sběrnici I2C a je energeticky velmi nenáročný. Pokud tedy vložíte na druhé straně modulu kvalitní baterii LIR2032, může tento obvod DS1307 běžet bez připojení napájení podle údajů výrobce minimálně 9 let. Mezi další výhody také patří detekce přestupných roků či přesný kalendář až do roku 2100, díky kterému snadno zjistíme i den v týdnu.

Pro úspěšné propojení s Arduino deskou stačí využít 4 propojovacích vodičů. Připojíme Vcc na +5 V, GND na zem, SDA na A4 a SCL na A5. Piny SDA a SCL slouží pro přenos přes I2C sběrnici a při využití jiného mikroprocesoru (například Arduino Mega) bude nutné dohledat I2C piny na zvolené desce.

Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu RTClib, návod jak na to je uveden zde. Ukázkový kód obsahuje příklad pro první nastavení času a dále tisk informací o aktuálním čase a datu přes Sériovou linku. Na začátku programu připojíme knihovny Wire pro práci s I2C a dále RTClib pro práci s obvodem reálného času DS1307. Jako další vytvoříme instanci DS1307 z knihovny RTClib a pole seznamDni se všemi dny v týdnu. V podprogramu setup nejprve nastavíme komunikaci po Sériové lince a následně zjistíme, jestli je modul s obvodem reálného času připojen a poté jestli jsou spuštěny hodiny. Jako další se v kódu nachází příkaz DS1307.adjust(..), kterým při prvním nahrání programu nastavíme aktuální čas, který bude nastaven v obvodu reálného času. Při dalším nahrávání programu do Arduina už bude nutné tento řádek s DS1307.adjust(..) zakomentovat, abychom si znovu nepřepsali nastavený čas a datum. V nekonečné smyčce loop pak vždy do proměnné datumCas nahrajeme aktuální informace a ty poté vytiskneme po Sériové lince.

// Hodiny reálného času DS1307

// připojení knihoven
#include <Wire.h>
#include "RTClib.h"

// vytvoření instance DS1307 z knihovny RTClib
RTC_DS1307 DS1307;

// vytvoření pole seznamDni s názvy jednotlivých dní
char seznamDni[7][8] = {"nedele", "pondeli", "utery", "streda", "ctvrtek", "patek", "sobota"};

void setup () {
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600);
  // kontrola připojeného obvodu reálného času
  if (! DS1307.begin()) {
    Serial.println("Hodiny nejsou pripojeny!");
    while (1);
  }
  // kontrolu spuštění obvodu reálného času
  if (! DS1307.isrunning()) {
    Serial.println("Hodiny nejsou spusteny! Spoustim nyni..");
  }
  // pro nastavení času v obvodu reálného času použijte jednorázově(!)
  // následující příkaz v pořadí rok, měsíc, den, hodina, minuta, vteřina
  // příklad: 26.4.2016 9:10:11
  DS1307.adjust(DateTime(2016, 4, 26, 9, 10, 11));
}

void loop () {
  // načtení aktuálního času a data do proměnné datumCas
  DateTime datumCas = DS1307.now();
  // vypsání informací o aktuálním času a datu po sériové lince
  Serial.print("Aktualni cas ");
  Serial.print(datumCas.hour());
  Serial.print(':');
  Serial.print(datumCas.minute());
  Serial.print(':');
  Serial.print(datumCas.second());
  Serial.print(", ");
  Serial.print(seznamDni[datumCas.dayOfTheWeek()]);
  Serial.print(" ");
  Serial.print(datumCas.day());
  Serial.print('.');
  Serial.print(datumCas.month());
  Serial.print('.');
  Serial.print(datumCas.year());
  Serial.println();
  // pauza mezi výpisy
  delay(2000);
}

Po nahrání programu do Arduino desky dostaneme například tento výpis:

Aktualni cas 9:10:11, utery 26.4.2016
Aktualni cas 9:10:13, utery 26.4.2016
Aktualni cas 9:10:15, utery 26.4.2016
Aktualni cas 9:10:17, utery 26.4.2016
Aktualni cas 9:10:19, utery 26.4.2016
Aktualni cas 9:10:21, utery 26.4.2016
Aktualni cas 9:10:23, utery 26.4.2016
Aktualni cas 9:10:25, utery 26.4.2016

Modul s obvodem reálného času DS1307 v kombinaci s využitou knihovnou RTClib mohu doporučit každému, kdo si chce vyzkoušet práci s reálným časem ve svém Arduino projektu. Obvod DS1307 může nalézt uplatnění například v domácí meteostanici či hodinách se sedmi-segmentovým displejem. A při využití záložní baterie se nemusíme bát ztráty informace o čase ani při odpojení napájení od Arduino desky.

Seznam použitých komponent:

http://dratek.cz/arduino-vstupni-periferie/842-arduino-hodiny-realneho-casu.html

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino-kabelaz-propoje-rozsireni/827-arduino-vodice-samec-samec-65-kusu.html

Další podobné články