Při pokusech s Arduinem jsem se dostal do okamžiku, kdy by se hodilo využít skutečný čas. Naštěstí existuje hotový obvod DS1307, což je I2C modul reálného času zálohovaný baterií a sériová I2C paměť EEPROM. Zapojení modulu je velice jednoduché - 2 vodiče napájení a SDA a SCL pro I2C sběrnici (ty zapojte dle typu svého Adruina). Já mám na I2C ještě připojený LCD displej 4x20 znaků.
Program je jednoduchý a okomentovaný. Program provádí čtení aktuálního času a data a jeho výpis na LCD.
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
#include <Wire.h>
#include <DS1307.h>
// vytvoří objekt lcd a nastaví jeho adresu
// 0x27 a 20 zanků na 4 řádcích
LiquidCrystal_I2C lcd(0x27,20,4);
// vytvoří pole čísel do kterých se bude ukládat čas
int rtc[7];
void setup()
{
lcd.init();// inicializuje displej
lcd.backlight(); // zapne podsvětlení
lcd.setCursor(4,0); // nastaví kurzor na pozici
lcd.print("Aktualni cas:"); // vypíše text
}
void loop()
{
// zapíše data z modulu do pole čísel rtc
RTC.get(rtc,true);
// připraví pole znaků pro čas
char cas[9];
// zapíše do pole znaků cas hodnoty z rtc
sprintf(cas, "%02d:%02d:%02d", rtc[2],rtc[1],rtc[0]);
lcd.setCursor(6,1); // nastaví kurzor na pozici
lcd.print(cas); // vypíše cas na displej
//připraví pole znaků pro datum
char dat[11];
//zapíše do pole znaků dat hodnoty z rtc
sprintf(dat, "%02d.%02d.%4d" ,rtc[4],rtc[5],rtc[6]);
lcd.setCursor(4,2); //nastaví kurzor
lcd.print("Dnesni datum:"); //vypíše text
lcd.setCursor(5,3); //nastaví kurzor
lcd.print(dat); //vypíše datum
delay(1000); //počká jednu vteřinu
}
Program je ke stažení zde
V modulu jsou k dispozici tyto hodnoty:
rtc[0] - vteřiny
rtc[1] - minuty
rtc[2] - hodiny
rtc[3] - den v týdnu
rtc[4] - den v měsíci
rtc[5] - měsíc
rtc[6] - rok
Pokud se zobrazuje špatný čas, je třeba ho nastavit.
Do programu do void setup() přidejte tyto řádky a upravte je na aktuální čas.
RTC.stop(); // zastaví čas
RTC.set(DS1307_SEC,1); //nastaví sekundy
RTC.set(DS1307_MIN,57); // nastaví minuty
RTC.set(DS1307_HR,17); // nastaví hodiny
RTC.set(DS1307_DOW,2); // nastaví den v týdnu
RTC.set(DS1307_DATE,18); // nastaví den v měsíci
RTC.set(DS1307_MTH,1); // nastaví měsíc
RTC.set(DS1307_YR,10); // nastaví rok
RTC.start(); // spustí čas
Po nahrání programu se aktualizuje čas dle vašeho nastavení. Nezapomeňte po nastavení času přepsat program do původního stavu jinak se vám bude po každém restartu arduina přepisovat.