Lekce 11 - Hodinový modul DS1307

15.03.2013 00:00

V minulém díle jsme si ukázali jak připojit LCD pomocí rozhraní I2C a dnes si ukážeme jak toto rozhraní využít k připojení modulu času k Arduinu. Tento modul RTC (Real Time Clock) jak můžete vidět na obrázku je malý s několika připojovacími piny. Nás budou opět zajímat SLC a SLA. O rozhraní I2C jsme si již psali minule tak není již potřeba vysvětlovat. Napájení je modulu také jasné a zřetelně popsané. 

Na obrázku vidíte modul jak z jedné strany tak i ze strany druhé.

Já jsem využil zapojení z předchozího dílu a k arduinu nechám připojen displej LCD přes I2C a k této sběrnici připojím i hodinový modul. Oproti minulému dílu ale použiju malé nepájivé kontaktní pole k vytvoření jakéhosi uzlu I2C a napájení. Dalších součástek není třeba. 

Z Arduina je vyvedeno pouze napájení a dva kabílky sběrnice I2C.

Ještě uvádím, jak již jsem psal v předchozím návodu, že sběrnice I2C je u modelu Mega na 20 a 21 pinu. U Arduino UNO je to na pinech A4 a A5. Nunto si přečíst dokumentaci k jednotlivým modelům.

Nyní ke knihovně. Ani nevím, zda již knihovna DS1307 ke správné funkci již byla mezi ostatními nebo ne. Já jsem jí v ardesáři libraries našel, ale po trochu bádání jsem zjistil, že mi moc nevyhovovala. Hledal jsem proto na internetu a našel jsem myslím pro nás to pravé a jednoduché k naprogramování. Ke stažení je knihovna zde a potom z mého google disku zde (tu i s našim programen nebo jejich modifikacemi). Nakopírujte si jí do adresáře libraries - tu původní smažte pokud tam bude.

Program je jednoduchý , řádně okomentovaný. Tento je pokud nemáte diplej LCD pro sběrnici I2C - viz minulý díl a čas je odesílán na serivý port, kde si ho můžete shlédnout pomocí SerialMonitor:

Výstup času na seriový port

V druhém případě, kdy jsme si z minulého dílu připojili displej s LCD I2C, bude program vypadat takto:

29: }

Zobrazení času na LCD I2C

Jak jste si všimli, v programu je funkce sprintf(cas, "%02d:%02d:%02d", rtc[2],rtc[1],rtc[0]);. Tu hned vysvětlim. Mnozí kteří ovladají programování v C již ví, že to slouží k formátování textu. Něco o tom jak se to pomocí funkce dělá si můžete přečíst zde. Pro použití hodnot k zobrazení času je důležité aby čísla byly dvouciferné. Ono zobrazení času v půl třetí ráno a 4 vteřiny, které by vypadalo takto - 2:30:4 - nevypadá nějak dobře. Náš vystup po zformátování bude tedy 02:30:04. A to nám udělá právě funkce sprintf. První proměná je cilové pole znaků, které jsme si v programu již definovali. Druhá proměná v uvozovkách je vlastní výstupní formát a třetí proměná ve fci jsou data která se budou kopírovat. 

Jenom krátký příklad jinak všechny formátovací řetezce najdete v dokumentaci jazyka c

int hodnota = 320;

sprintf(vystupni_data, "Aktuální hodnota je:%5d mA", hodnota);

// výstup je "Aktuální hodnota je:  320 mA"

sprintf(vystupni_data, "Aktuální hodnota je:%05d mA", hodnota);

// výstup je "Aktuální hodnota je:00320 mA"

 

Dále k hodnotám uložených v rtc:

  • 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 Vám čas zobrazuje nesprávně a je potřeba ho nastavit použijte tento kód v setup(), program nahrajte do arduina, čas se přepíše a potom ho zase z programu vymažte (správná čísla si dosďte sami :-):

 

  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

Pro nás je důležité, že vše funguje a doufám, že výsledek je stejný jako na mém videu.

 

Všechny obrázky zdrojové soubory a knihovny najdete na google disku zde.

 

Zpět

Diskusní téma: Lekce 11 - Hodinový modul DS1307

Datum
Vložil
Titulek

Nefunguje RTC

Dobrý den, pracuji na zaverecne praci , kde chci pouzit tento program , ale nefunguje mi , mam mega2560(cina),lcdkeypad 16x2 ,a Tiny RTC I2C AT24C32 DS1307 , dam program a zapojim (scl-scl , sda -sda , ++,-- klasicky :D ) ale na serial portu mi to ukazuje 00:00:00 misto casu ktery sem nastavil a tak porad dokola , nevi nekdo co stim ? dekuji za odpoved

Datum
Vložil
Titulek

Re: Nefunguje RTC

Když poprvé zapneš ten modul,tak neni nastaven a ani zapnut. Musí se nejdřív nějakým prográmkem oživit

Datum
Vložil
Titulek

Re: Re: Nefunguje RTC

Prosim hodite sem program na ozivenie dik

Datum
Vložil
Titulek

Re: Re: Re: Nefunguje RTC

to ozivenie sa mi zda ze je na konci postupu, kde je RTC.start() .. inak pokial to aj napriek nastavenemu casu hadze 00:00:00, tak bude skor chyba v kabloch, ked som to mal len prestrcene cez dierky v module tak to neslo, treba to vsetko zapajkovat a pojde to

Datum
Vložil
Titulek

Re: Re: Re: Re: Nefunguje RTC

Já měl právě stejný problém, psalo to pořád dokola 00:00:00, tak jsem zkusil program s knihovnou RTClib.h z https://uart.cz/383/arduino-a-obvod-realneho-casu/ a modul se rozeběhl.

Datum
Vložil
Titulek

Re: Re: Re: Re: Nefunguje RTC

Skouknete ten zlaty plisek co se s nim pricvakava baterka shora a druha strana plisku jde na plosak! Ten spodek plisku musi byt pripajen k plosacku, nam se to prave odlouplo a takle blblo

Datum
Vložil
Titulek

zimní a letní čas

Ahoj,moc chválím tyto stránky a děkuji autorovi.
Potřebuji naprogramovat arduino tak aby mi v určité dny v týdnu a určité hodiny spínalo výstupy,teď uvažuju jestli je vhodný modul DS1307,nezáleží na nějaké té sekundě ale zase bych nerad aby se to po čase rozcházelo třeba o 5 minut (zařízení bude namontované někde kde se moc nechodí.
Teď řeším jak na to se zimním a letním časem protože ten nevychází vždycky stejně(jestli to řešit nějakýma podmínkama),to samé přestupné roky a počet dnů v jednotlivých měsících-má tohle ten modul v sobě?

Datum
Vložil
Titulek

Re: zimní a letní čas

DS1307 umí pouze přestupné roky až do 2100. Pro práci s letním čase by čip musel obsahovat i veškerá světová časová pásma a hlavně začátky a konce letního času pro pásma a země ve kterých se používá. To je pro různé oblasti jiné. Další velký problém je, že začátek a konec letního času se může změnit. V ČR současný stav platí od roku 1996. Pokud by nastala v budoucnu změna, byly by všechny již vyrobené čipy vadné. Nicméně letní čas v ČR má jasně definovaný začátek a konec. Na letní čas se v ČR každý rok přechází poslední neděli v březnu, kdy po 01:59:59 SEČ (středoevropského času) následuje 03:00:00 SELČ (středoevropského letního času). Letní čas končí poslední neděli v říjnu, kdy se po 02:59:59 SELČ hodiny posunou na 02:00:00 SEČ. Doporučuji tedy používat buď UTC nebo SEČ čas (+1h) a na jeho základě vypočítat a případně zobrazovat letní čas. Je to jenom programování s kontrolou měsíců, dnů, a dne v týdnu (poslední neděle v měsíci).

Datum
Vložil
Titulek

modul s M41T81S

postavil jsem si modul s M41T81S - soucastky za babku, jenze nejsem schopen rozchodit hodiny. Pouzivam knihovnu na DS1302 a je asi jasne ze to nebude chodit. Nenasel by se nejaky "guru" ktery je schopen upravit knihovnu tak aby to chodilo. Programem zde uvedenym cas nastavim, ale je stale stejny. dekuji predem

Datum
Vložil
Titulek

Čas spěchá

Zdravím všechny techniky. Předem chci poděkovat autorovi za psaní tutoriálů na tomto webu. Mám RST modul JY-MCU založený na DS1307. Vše jsem pochopil (tedy doufám, že vše) a dle mého chápání zapojil. Mám Mega2560, displej zapojený bez I2C (klasicky) a zmíněný RTS modul přes I2C. Po zapojení a úpravách co kde se má zobrazit na displeji si nemohu poradit s tím, že se mi čas zobrazuje asi 2x až 3x rychleji. Nemá s tímto někdo zkušenost?

<< 1 | 2 | 3 | 4 | 5 >>

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.