Lekce 11 - Hodinový modul DS1307
15.03.2013 00:00V 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 :-):
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ětDiskusní téma: Lekce 11 - Hodinový modul DS1307
Datum | 08.10.2014 |
---|---|
Vložil | Martin |
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 | 30.09.2014 |
---|---|
Vložil | Badatel |
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?
———
Datum | 09.09.2014 |
---|---|
Vložil | emanuel |
Titulek | Problém se dvěma řádky |
Upravil jsem program tak, aby na horním řádku byl čas a na dolním řádku datum a den v týdnu. Fungovalo to, ale blikalo podsvícení displeje tak, že se na to nedalo dívat. Zjistil jsem, že to způsobuje použití další funkce sprintf() pro naformátování datumu. Nakonec jsem to vyřešil zápisem datumu jen jednou za den hned po půlnoci. Tady jem také trochu narazil, funkce if ((rtc[2] == 0) && (rtc[1] == 0) && (rtc[0] == 5)) {} pro zápis datumu musí být před zobrazením času, jinak se datum objeví jen na jednu sekundu.
———
Datum | 14.09.2014 |
---|---|
Vložil | emanuel |
Titulek | Re: Problém se dvěma řádky |
Funkce sprintf() v tom byla nevinně, blikání podsvětlení displeje jsem způsobil já tím, že jsem vytvořil pro datum řetězec char datum[9] a datum má znaků 10. Zajímavé je, že se datum na displeji zobrazil celý a správně, tak mě to hned nenapadlo.
———
Datum | 05.09.2014 |
---|---|
Vložil | Diego |
Titulek | ds1307 + dcf77 |
Ahoj, věděli byste někdo jak udělat nastavení tohoto modulu pomocí dcf signálu?
Díky
———
Datum | 05.08.2014 |
---|---|
Vložil | Tomáš |
Titulek | Knihovna |
Dobrý den.
Chtěl bych se zeptat, k čemu slouží knihovna "WProgram.h" a kde by se dala stáhnou.
Děkuji.
———
Datum | 09.09.2014 |
---|---|
Vložil | emanuel |
Titulek | Re: Knihovna |
Já jsem ji v hlavičce smazal a program funguje i bez ní, takže je zbytečná. Nezjistil jsem žádný rozdíl ve funkci zkompilovaného programu s touto knihovnou a bez ní.
———
Datum | 16.12.2014 |
---|---|
Vložil | LuBoss |
Titulek | Re: Knihovna |
Od verze 1.0 arduina se tato knihovna pro jazyk Wiring přejmenovala na Arduino.h
———
Datum | 20.06.2014 |
---|---|
Vložil | Milan |
Titulek | neviem ďalej |
Neviete prosím kde mám chybu, trápim sa s tým už druhý deň. Neviem to napísať aby mi zoplo pin 13 v stanovený čas 17:15:00.
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
int rtc[7];
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop()
{
RTC.get(rtc,true);
char cas[9];
sprintf(cas, "%02d:%02d:%02d", rtc[2],rtc[1],rtc[0]);
if (cas)==(17:15:00)
{
digitalWrite(13,HIGH);
}
Serial.println(cas);
delay(1000);
}
———
Datum | 25.06.2014 |
---|---|
Vložil | mowe |
Titulek | Re: neviem ďalej |
if (((rtc[2] == 22) && (rtc[1] == 59) && (rtc[0] == 00)))
skus tohle hodiny minuty vteriny