Lekce 28
Hodiny reálného času

Úvod

V jedné z předešlých lekcí jsme postavili stopky, tak proč se nyní nepustit do celých hodin. Modul Arduino umí pracovat s časovými údaji. Problém ale nastane, když se Arduino odpojí od elektřiny. Po opětovném zapojení ke zdroji rázem zapomene časové údaje a začíná vše od začátku. Právě pro zachování časových údajů používají tzv. moduly reálného času. Jsou to vlastně hodiny zálohované svou vlastní baterií a tak po výpadku napájení nebo restartu modulu Arduino mohou potřebné „ztracené“ časové údaje poskytnout. Existuje mnoho různých modulů hodin reálného času (RTC), jako je např. DS1302, DS1307, PCF8485 atd. Jsou široce používány vzhledem k jejich nízké ceně a jednoduchému použití. V této lekci budeme používat DS1302 modul hodin reálného času.

Použité komponenty

  • modul Arduino
  • USB kabel
  • DS1302 (modul reálného času)
  • LCD displej s I²C převodníkem
  • nepájivé pole
  • vodiče pro nepájivé pole + vodiče typu „samec-samice“

Princip

Obvod udržovacích hodin DS1302 obsahuje hodiny reálného času, kalendáře a 31 B statickou paměť RAM. Záložní běh hodin zajišťuje 3 V baterie, přesnost je dána použitým krystalem. RTC modul komunikuje s okolím přes jednoduché sériové rozhraní. Hodiny reálného času poskytují sekundy, minuty, hodiny, den v týdnu, den v měsíci, měsíc a rok. Konec měsíce je automaticky přizpůsobován u měsíců s méně než 31 dny, včetně korekce přestupného roku. Hodiny pracují v 24-hodinovém nebo 12-hodinovém režimu s indikátorem AM/PM.

RTC modul DS1302

Pro komunikaci s hodinami/pamětí jsou použity pouze tři vodiče: RST, DAT (sériová data) a CLK (hodinový signál). Data mohou být přenesena z/do modulu hodin nebo paměti. DS1302 je navržen pro velmi malou spotřebu a udržení dat při příkonu menším, než 1 μW.


Postup experimentu

Krok 1: Sestavíme si obvod podle následujícího obrázku nebo schématu. I²C LCD displej připojíme stejně, jako v předešlých lekcích. Níže uvedené tabulky uvádějí propojení modulu Arduino, I²C LCD displeje a modulu reálných hodin DS1302.

Blokové schéma

Blokove schema

Elektronické schéma

Elektronicke schema
I²C LCD1602 modul Arduino
UNO Mega
SDA A4 20
SCL A5 21
UCC 5V 5V
GND GND GND

DS1302 modul Arduino
RST 2
DAT 3
CLK 4
VCC 5V
GND GND

Krok 2: V prostředí mBlock vytvoříme následující program. Při tvorbě programu je třeba znát adresu použitého I²C LCD displeje, neboť u každého příkazů pro LCD je třeba nastavit aktuální adresu. (viz rozbalovací pole „adr.“). V tomto programu se opět použije několik podprogramů, proto začneme nejdříve s nimi, hlavní program je uveden až na závěr.

podprogram v prostredi mBlock

poprogram v prostredi mBlock


ikona vysvetleni Vysvětlení kódu

Podprogram „print2digits“ se vstupním parametrem number vypisuje na aktuální místo na LCD displeji (tam, kde je právě nastavena pozice kurzoru) zadané číslo ve dvouznakovém formátu. To znamená, že dvouciferné číslo vypíše normálně, jednocifernému přidá na začátek 0. Provedení tohoto konkrétního podprogramu je takové, že kdyby náhodu bylo zadané troj a víceciferné číslo, budou vždy zobrazeny jen jeho první dvě číslice. Na první pohled poněkud zvláštní řešení pomocí převodu čísla na text vychází z problému, že prostředí mBlock považuje všechna čísla jako reálná a na LCD displeji se všechna reálná čísla vypisují s dvěma desetinnými místy.

Druhý podprogram „Den-týdnu“ se vstupním parametrem den dělá přesně to, co jeho název napovídá. Dle zadaného pořadového čísla dne vypíše jeho název. Jen je třeba si upozornit, že podle anglické normy, ve které se v časových údajích modulu Arduino pracuje, je prvním dnem v týdnu neděle. Pondělí má tedy číslo 2, úterý číslo 3… až sobota číslo 7. Podprogram „Den-týdnu“ nejen převádí anglické pořadové číslo na český název, ale hned jej i vypisuje na danou na aktuální místo na LCD displeji.

Hlavní program ve své první části nastavuje řídicí piny RTC modulu reálného času, stejně jako nastavuje potřebné nastavení LCD displeje. Důležitým příkazem je v této části načtení časových údajů z RTC modulu do modulu Arduino. V hlavní nekonečné smyčce „opakuj stále“ je pracováno s potřebnými časovými údaji v modulu Arduino. První podmínka testuje, zda je počet hodin větší než devět (tedy dvojciferný), pokud ano, je počet hodin vytištěn od prvního sloupce. Pokud je aktuální počet hodin jednociferný, je počet hodin vytištěn až do druhého sloupce. Toto řešení dělá přesný opak toho, co podprogram „print2digits“. Komu by se totiž líbil aktuální čas třeba 08:23:10? Takto číslovka počtu hodin zabírá dvě místa, ale u jednociferného počtu je na začátku mezera, tedy _8:23:10. Na zbylé číslovky, tedy na počet minut a vteřin je naopak podprogram „print2digits“ aplikován. Zbytek programu je na principu získání časové informace a jejího výpisu na LCD displej. Údaje jsou doplňovány dvojtečkami a tečkami, aby byl celkový výsledek na LCD displeji co nejvíce podobný skutečným digitálním hodinám.


V lekci, kde jsme konstruovali stopky, byla o problému nuly na začátku zmínka. Tento problém tam ale byl ponechán k samostatnému bádání. Tak nyní je zde uvedeno jedno z jeho možných řešení v podobě úvodní podmínky testující počet hodin (v případě stopek by se stejným způsobem testoval počet uplynulých vteřin).


Krok 3: Zkompilujeme kód a nahrajeme do modulu Arduino tlačítkem tlacitko nahrat.

Krok 4: Po spuštění programu funguje modul Arduino jako hodiny, dokonce i s datem. Potřebné údaje se zobrazují na LCD displeji. Při vypnutí zdroje se sice modul Arduino vynuluje, ale čas běží v RTC modulu (reálných hodin) díky vestavěné baterii dále. Po opětovném zapnutí napájení modulu Arduino se na displeji opět objeví správný čas.

Pohled na experiment