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 | 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
———
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 | 27.04.2014 |
---|---|
Vložil | Petr K |
Titulek | modul DS1307 pozor |
Zdravím, dostal se mi do rukou tento modul DS1307 ale měl jen lithiovou baterii - to by mohl být problém s vybitými bateriemi. Modul je připraven na dobíjecí baterii.
odkaz na článek se schématem a úpravou: https://www.instructables.com/id/Arduino-Shower-Monitor-2/
jinak modul obsahuje ještě EEprom 4096x8bit na I2C
..... petr.kolc@tiscali.cz
———
Datum | 25.06.2014 |
---|---|
Vložil | Crowley |
Titulek | Re: knihovna |
Pokud Ti nevadí angličtina, tak vzsvětlení je tady: https://arduino.cc/en/Hacking/LibraryTutorial
Chápu to tak, že Arduino IDE neumí rozpoznat, co je v jaké knihovně vlastně definované - a proto to neumí zvýraznit.
Jako pomoc používá soubor keywords.txt, kam autor knihovny musí zadat co a jak má IDE zvýraznit.
V Tvém případě si autor/autoři knihoven WProgram a DS1307 nedali tolik práce, jako autoři kninoven LiquidCrystal_I2C a Wire.
———
Datum | 25.03.2014 |
---|---|
Vložil | Kempa |
Titulek | knihovna |
Proč se mi knihovna WProgram.h a DS1307.h neoznačí, nezbarví oranžově jako LiquidCrystal_I2C.h a Wire.h
Jsou to jennom nějake jine druhy souboru ?
Jinak vše funguje suprově....... :-)
———
Datum | 22.04.2014 |
---|---|
Vložil | adam |
Titulek | Re: Názvy dnů |
přes if, kterej ti to změní
třeba máme proměnou denvtydnu, kde mas to cislo a promenou den, kde bude den:
if(denvtydnu == 1)
{
den = "Pondeli";
}
else if(denvtydnu == 2)
{
den = "Utery";
}
....
dál už na to přídeš sám :)
———
Datum | 19.02.2014 |
---|---|
Vložil | tomveve |
Titulek | Názvy dnů |
Dobrý den,
nevíte někdo jak udělat, aby se místo čísel dnů v týdnu psaly názvy?
———
Datum | 04.02.2014 |
---|---|
Vložil | Kempa |
Titulek | začátečník |
Dobrej, prosím mám DALLAS DS12887A
Real time
Dá se to nějak použít s arduinem ?
———
Datum | 02.10.2014 |
---|---|
Vložil | Reno |
Titulek | Re: Re: Re: čas 45:85:85 bez incrementu |
DS1302 potřebuje jinou knihovnu. A také nejede na I2C rozhraní.
———
Datum | 16.09.2014 |
---|---|
Vložil | Ondřej |
Titulek | Re: Re: čas 45:85:85 bez incrementu |
Ahoj, mám stejnej problém 45:85:85 akorát u verze DS1302, nenašel jsi nějaké řešení ?