DIY hodiny na arduino uno. Velké nástěnné hodiny s automatickým jasem na Arduinu


Takové hodiny budou na stěně vypadat velmi originálně, mají LED ručičky napodobující analogové hodiny, LED hodiny uprostřed a krásné RGB podsvícení. Provedení takového domácího projektu lze stěží nazvat jednoduchým, ale vynaložený čas a úsilí nebudou ztraceny.

Materiály pouzdra:
- Černé akrylové desky 300x300x3 mm 3ks
- Transparentní akrylové podsvícení 300x300x3 mm 1 kus
- Leštící prostředek na akrylové desky
- Lepidlo
- Distanční pouzdra 15 mm se závitem m3 20 ks
- šrouby M3 s podložkami 20 ks
- Obrazový rám 300x300 mm 1 kus

Elektronické materiály:
- Posuvný registr CD74HC595 8ks
- LED ovladač TLC5940 1ks
- Hodiny reálného času (RTC) DS1307 1ks
- Lineární regulátor LM317 1 kus
- Bipolární tranzistor BD139 8ks
- Elektrolytický kondenzátor 1 uF 2ks
- Kondenzátor 0,1 uF 1 kus
- Rezistory 120 Ohm 60ks
- Rezistory 10 kOhm 9ks
- Rezistor 2 kOhm 1 kus
- Rezistory 1 kOhm 9ks
- Rezistor 330 Ohm 1 kus
- LED 480ks
- 4místný LED digitální indikátor (se společnými anodami) 1 ks.
- LED RGB pásek (se společnou anodou) 1 ks (dlouhý po obvod ciferníku)
- Arduino Mega ADK modul (Rev3) 1ks
- 12V baterie 1ks

Krok první. Výroba karoserie.
Nejprve se akrylátové desky nařežou a vyvrtají podle výkresu. Dále se přední černý plech těla přilepí na spojovací díl (průhledný) a na desku pro LED.

Krok dva. Dokončovací práce na těle.
Pro lepší stabilitu autor na zadní stranu rámu obrazu nalepí jednu akrylovou desku, sklo z rámu se nejprve odstraní a již nebude potřeba.
K desce jsou přišroubovány čtyři 15mm pouzdra jako na fotografii. Nyní je možné přilepit pouzdra z rámu na přední desku. Tyto lepené průchodky se pak odšroubují pro budoucí použití.

Krok tři. LED vložka.
Nejprve se LED vloží do první řady otvorů (1 řada vyžaduje 60 LED). Katody jsou připájeny k sobě kolem desky pomocí 0,8 mm měděného drátu a anody jsou ohnuté do strany. Tento postup se opakuje pro zbývajících 7 řádků. Nyní, když jsou anody uspořádány v jednom sloupci, jsou také pájeny dohromady. Výsledkem tedy byla matice o 8 řádcích a 60 sloupcích.

Krok čtyři. Pájení kabelů k matrici.
K tomuto kroku se používají 8-žilové kabelové konektory, z nichž jeden je připájen ke katodám na matrici. Osm takových konektorů bylo připájeno k 60 anodovým sloupkům. Vzhledem k tomu, že autor použil 8vodičové konektory, dostal kabel s 64 žilami, což znamená, že zbyly 4, byly omotané elektropáskou. Autor také doporučuje použít sedm 8vodičových konektorů a jeden 4vodičový konektor získat přesně 60.

Krok pět. Připojení indikátoru.
V akrylové desce je vytvořen otvor ve formě disku a indikátor je pro pohodlí přilepen předpájenými dráty.

Krok šest. Platit.
Z kusu prkénka většího, než je požadováno, odřízněte 2 kusy tak, aby se vešly do rámu obrazu. Dále sami vyrobí několik konektorů, jak je vidět na fotografii níže.

Krok sedm. Montáž hodinek.
Dále jsou všechny díly instalovány do krytu podle níže přiloženého schématu. Autor do hodinek osadil 1000 mAh dobíjecí baterii, aby mohly fungovat bez externího kabelu. Arduino se instaluje s kódem programu připojeným ve spodní části článku. Jsou tedy nainstalovány knihovny pro modul hodin reálného času a ovladač TLC5940 LED, které jsou rovněž přiloženy pod článkem. Schéma dobrého rozlišení: (Staženo: 293)

Takové hodiny lze v případě potřeby upgradovat automatickým ovládáním jasu pomocí fotorezistoru nebo manuální úpravou jasu pomocí 10 kOhm potenciometru. Je zde prostor pro instalaci tlačítka a s jeho pomocí lze přepínat mezi různými programy. Navíc je možné nainstalovat LED pásek, který osvětlí průhlednou plastovou část předního panelu.

Video s částečnou montáží a ukázka fungování hodin

  • Charakteristické rysy:
  • Výpočet reálného času v sekundách, minutách, hodinách, datech v měsíci, měsících, dnech v týdnu a letech, s přihlédnutím k výši aktuálního roku až do roku 2100.
  • Dalších 31 x 8 RAM pro ukládání dat
  • Sériový vstup - výstupní informace pro snížení počtu pinů mikroobvodu
  • Všechny funkce provádějte s napájecím napětím 2,0-5,5 V
    - výkon všech funkcí při napětí 2,0-5,5 V na přídavném napájecím výstupu
  • Spotřeba ne více než 300 nA při napájení 2,5 V
  • Čtení a zápis informací o jednom bajtu nebo proudu
  • Provedení v 8pinovém DIP pouzdře a na přání také v 8pinovém SOIC pouzdru pro povrchovou montáž
  • Jednoduché 3vodičové rozhraní
  • Kompatibilní s čipy TTL (Vcc= 5V)
  • K dispozici v průmyslovém teplotním rozsahu: -40°C až +85°C
  • Kompatibilní s DS1202
  • Rozdíly od DS1202:
    možnost připojení vestavěného nabíjecího obvodu na pin Vcc1
    dva výkonové výstupy pro připojení hlavního a záložního zdroje energie
    RAM se zvětšila o 7 bajtů

Popis pinů:

X1, X2připojení křemenného rezonátoru 32,768 kHz
GNDVšeobecné
RSTresetovat
I/Ovstup dat - výstup
SCLKsynchronizace sériové komunikace
VCC1, VCC2napájecí kolíky

Blokové schéma DS1302:

Obecný popis:

Čip DS1302 obsahuje hodiny reálného času s kalendářem a 31 bajtů statické paměti RAM. S mikroprocesorem komunikuje přes jednoduché sériové rozhraní. Informace o reálném čase a kalendáři jsou uvedeny v sekundách, minutách, hodinách, dni, datu, měsíci a roce. Pokud aktuální měsíc obsahuje méně než 31 dní, pak čip automaticky určí počet dní v měsíci s přihlédnutím k výši aktuálního roku. Hodiny pracují ve 24hodinovém nebo 12hodinovém formátu s indikátorem AM/PM (am/pm). Připojení DS1302 k mikroprocesoru je zjednodušeno díky synchronní sériové komunikaci. Vyžaduje pouze 3 vodiče: (1) RST (reset), (2) I/O (datová linka) a (3) SCLK (hodiny sériové komunikace). Data lze přenášet po jednom bajtu nebo v sekvenci až 31 bajtů DS1302 je navrženo tak, aby spotřebovávalo nízkou spotřebu a uchovávalo data a informace o hodinách při spotřebě méně než 1 µW. DS1302 je nástupcem DS1202. Kromě základních funkcí ukládání času DS1202 má DS1302 dva napájecí piny pro připojení primárního a záložního zdroje, možnost připojit programovatelný nabíjecí obvod na pin VCC1 a sedm dalších bajtů paměti RAM.

Spojení:

Připojení DS1307 k Arduinu:

RTC DS1307Arduino UNO
GNDGND
VCC+5V
S.D.A.A4
SCLA5

Připojení DS1302 k Arduinu:

RTC DS1302Arduino UNO
GNDGND
VCC+5V
RST6 (lze změnit na jiné v náčrtu)
CLK7 (lze změnit na jiné v náčrtu)
DAT

(Lze změnit na jiné v náčrtu)

Připojení DS3231 k Arduinu:

RTC DS3231Arduino UNO
GNDGND
VCC+5V
S.D.A.A4
SCLA5

Modul DS1302 hodiny reálného času na Aliexpress http://ali.pub/1br52w

Programový kód pro modul 1302 a displej 1602 I2C

V závislosti na tom, který modul připojujete, musíte zadat v programu

Pro DS1302 :

čas. begin(RTC_DS1302, 10, 13, 12);

#zahrnout

virtuabotixRTC myRTC(6, 7, 8); //CLK, DAT, RST

Program

#zahrnout

#zahrnout

LiquidCrystal_I2C lcd(0x3F ,2,1,0,4,5,6,7,3, POZITIVNÍ);

void setup() (

lcd.begin(16,2);

//myRTC.setDS1302Time(00.04, 12, 06, 18, 04, 2017);

void loop() (

myRTC.updateTime();

lcd.setCursor(0, 0);

lcd.print("datum: ");

lcd.print(myRTC.dayofmonth);

lcd.print("/");

lcd.print(myRTC.month);

lcd.print("/");

lcd.print(myRTC.year);

lcd.print(" ");

lcd.setCursor(0, 1);

lcd.print("čas: ");

lcd.print(myRTC.hodiny);

lcd.print(":");

lcd.print(myRTC.minutes);

lcd.print(":");

lcd.print(myRTC.seconds);

lcd.println(" ");

Nezapomínáme ani na úsporu při nákupu zboží na Aliexpress pomocí cashbacku

Výhody knihovny:

Knihovna má interní funkce pro hardwarové zpracování protokolů přenosu dat I2C a SPI, a proto nevyžaduje připojení dalších knihoven, ale ani s nimi nekoliduje, pokud jsou připojeny.

Knihovna má vnitřní funkce jako program pro zpracování protokolu 3-Wire přenosu dat

Chcete-li inicializovat modul, musíte zavolat funkci begin s názvem modulu.

Moduly jsou připojeny k hardwarovým pinům arduino použité sběrnice (s výjimkou 3-Wire)

Snadné nastavení a čtení času pomocí funkcí settime a gettime

Funkce settime může nastavit datum a čas, buď zcela nebo částečně (například pouze minuty nebo pouze den atd.)

Funkce gettime funguje jako funkce datum v php, vrací řetězec s časem, ale pokud je volána bez parametru, funkce nic nevrátí a čas lze číst z proměnných jako čísla.

Knihovna je rozšiřitelná, to znamená, že aby mohla pracovat s novým modulem, je potřeba specifikovat parametry tohoto modulu ve stávajících polích souboru RTC.h (typ sběrnice, frekvence sběrnice v kHz, provozní režimy, registrovat adresy atd.), jak je to vše popsáno v souboru přípona.txt

Přidáním nového modulu do knihovny tedy zvětšíme pouze oblast obsazené dynamické paměti o ~ 36 bajtů, aniž bychom ovlivnili oblast paměti programu.

Při volání funkce begin knihovna načte příznaky registrů modulu a v případě potřeby je nastaví nebo resetuje tak, aby modul mohl pracovat na bateriové napájení a na programovatelném obdélníkovém pinu se nastaví frekvence 1 Hz (pokud modul má jeden), pak lze tento pin použít jako externí sekundové přerušení.

Při práci s modulem DS1302 nejsou potřeba žádné rezistory na pinu GND (které jsou potřeba pro jeho spolupráci s dalšími knihovnami tohoto modulu), toho je dosaženo tím, že pro 3- je specifikována specifická frekvence 10 kHz Drátová sběrnice, bez ohledu na frekvenci CPU Arduino.

Knihovna implementuje ještě jednu volitelný funkce period, přičemž jako jediný argument bere počet minut (od 1 do 255)

pokud byla funkce gettime volána několikrát během zadaného času, pak bude požadavek na modul přes sběrnici odeslán pouze poprvé a odpověď na všechny ostatní požadavky bude součtem času poslední odpovědi modulu a čas, který uplynul od této odpovědi.

Funkci periody stačí zavolat pouze jednou.

Detailní popis:

} // POPIS PARAMETRŮ FUNKCÍ:// // Připojení knihovny:// #zahrnout // iarduino_RTC time(jméno modulu [, SS/RST pin [, CLK pin [, DAT pin]]]);// pokud modul pracuje na sběrnici I2C nebo SPI, pak stačí zadat 1 parametr, např.: iarduino_RTC time(RTC_DS3231);// pokud modul pracuje na sběrnici SPI a hardwarový SS pin je obsazen, pak číslo přiřazeného SS pinu pro modul je indikováno druhým parametrem, například: iarduino_RTC time(RTC_DS1305,22);// pokud modul pracuje na třívodičové sběrnici, pak jsou uvedena čísla všech pinů, například: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT// // Pro práci s moduly knihovna implementuje 5 funkcí:// spuštění modulu begin();// zadejte čas settime(sekundy [, minuty [, hodiny [, den [, měsíc [, rok [, den v týdnu]]]]]]);// získání času gettime("řetězec s parametry");// doba mrknutí Doba mrknutí (0-neblikání / 1-blik_sec / 2-mrknutí_min / 3-blink_hour / 4-blink_days / 5-blink_month / 6-blink_year / 7-blink_days_of-week / 8-blink_poledne)// uvolnění periody sběrnice (minuty);// // Funkce begin(): // funkce inicializuje modul: zkontroluje registry modulu, spustí generátor modulu atd.// // Čas nastavení funkce (sekundy [, minuty [, hodiny [, den [, měsíc [, rok [, den v týdnu]]]]]):// zapíše čas do modulu// rok je uveden bez zohlednění století ve formátu 0-99// hodiny jsou uvedeny ve 24hodinovém formátu, od 0 do 23// den v týdnu je zadán jako číslo od 0-neděle do 6-sobota// pokud musí být předchozí parametr ponechán beze změny, můžete zadat zápornou nebo zjevně větší hodnotu// příklad: settime(-1, 10); nastaví 10 minut a ponechá sekundy, hodiny a datum beze změny// příklad: settime(0, 5, 13); nastaví 13 hodin, 5 minut, 0 sekund a datum ponechá beze změny// příklad: settime(-1, -1, -1, 1, 10, 15); nastaví datum na 10/01/2015 a čas a den v týdnu ponechá beze změny// // Funkce gettime("řetězec s parametry"):// funkce přijme a zobrazí řetězec, který nahradí níže popsané znaky aktuálním časem// příklad: gettime("d-m-Y, H:i:s, D"); odpoví řádkem "01-10-2015, 14:00:05, Čt"// příklad: gettime("s"); odpoví řádkem "05"// uvedené znaky jsou totožné se znaky pro funkci date() v PHP// s sekund od 00 do 59 (dvě číslice)// i minut od 00 do 59 (dva znaky)// h hodin ve 12hodinovém formátu od 01 do 12 (dvě číslice)// H hodin ve 24hodinovém formátu od 00 do 23 (dvě číslice)// d den v měsíci od 01 do 31 (dva znaky)// w den v týdnu od 0 do 6 (jedno znamení: 0-neděle, 6-sobota)// Název dne v týdnu od Po do Ne (tři znaky: Po Út St Čt Pá So Ne)// m měsíc od 01 do 12 (dvě číslice)// Název měsíce od ledna do prosince (tři znaky: led únor březen duben květen červen červenec srpen září říjen listopad prosinec)// Rok Y od 2000 do 2099 (čtyři číslice)// y rok od 00 do 99 (dvě číslice)// poledne nebo odpoledne (dva znaky, malá písmena)// poledne nebo odpoledne (dvě číslice, velká písmena)// řádek by neměl přesáhnout 50 znaků// // pokud potřebujete získat čas ve formě čísel, můžete zavolat funkci gettime() bez parametru a poté získat čas z proměnných// sekund sekundy 0-59// minuty minuty 0-59 // hodiny hodiny 1-12 // hodiny hodiny 0-23

Hodiny reálného času jsou modul, který ukládá aktuální datum a neresetuje ho po vypnutí napájení díky vestavěné baterii. Možná jste slyšeli o hodinkách založených na čipu DS1307. Tento čip má extrémně nízkou přesnost hodin. Zpoždění jedné hodiny denně je příliš mnoho. Doporučuji použít modul založený na vysoce přesném čipu DS3231, který je vybaven teploměrem pro úpravu taktu v závislosti na teplotě. Přesnost hodin tohoto čipu je na úrovni dobrých náramkových hodinek a je 2ppm při okolní teplotě 0°-40°. Modul je zároveň kompatibilní se všemi knihovnami napsanými pro modul založený na čipu DS1307. Článek hovoří o připojení modulu k Arduinu a interakci s nimi pomocí knihovny Time. Takový modul si můžete zakoupit u mnou ověřeného prodejce.

Připojení hodin reálného času

Hodiny jsou připojeny pomocí protokolu I2C pomocí pouhých dvou vodičů. Svorky, ke kterým jsou hodiny připojeny k napájecí liště, je nutné dodatečně dotáhnout pomocí odporů 2 KΩ. Výstupy hodin vypadají takto:

Piny 32K a SQW lze ignorovat. Jejich účel není v tomto článku diskutován. SCL a SDA jsou piny rozhraní I2C. Musí být připojeny k ovladači. VCC a GND jsou +5V a zem.

SCL a SDA jsou umístěny na různých pinech na různých deskách:

Uno, Nano A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)

SDA kolík hodin je připojen ke kolíku SDA ovladače. Hodiny SDL do řadiče SDL. Po připojení vodičů byste měli získat následující obrázek:

Nejpohodlnějším způsobem práce s modulem hodin reálného času je použití knihovny. Nejpohodlnější v tomto ohledu se nazývá: Čas ( Angličtina čas).
Knihovna je „obalem“ další oblíbené knihovny pro práci s hodinovým modulem: DS1307RTC. Navzdory skutečnosti, že knihovna byla vyvinuta pro čip DS1307, funguje perfektně s DS3231, protože komunikační protokoly jsou kompatibilní.

Stáhněte si obě knihovny.

Po stažení umístěte obsah archivů do složky libraries, která se nachází ve složce s vývojovým prostředím Arduino. Spusťte Arduino IDE a otevřete standardní ukázkovou knihovnu: Příklady->Čas->TimeRTC
Nebo stačí zkopírovat tento kód:

#zahrnout #zahrnout #zahrnout void setup() ( Serial.begin(9600); while (!Serial) ; // počkejte, až Arduino Serial Monitor otevře setSyncProvider(RTC.get); // funkce pro získání času z RTC if(timeStatus()! = timeSet) Serial.println("Nelze synchronizovat s RTC" else Serial.println("RTC nastavil systémový čas" void loop() ( if (timeStatus() == timeSet) ( digitalClockDisplay( )); ; ) else ( Serial.println("Čas nebyl nastaven. Spusťte prosím čas"); Serial.println("Příklad TimeRTCSet nebo příklad DS1307RTC SetTime."); Serial.println(); delay(4000) ; ) delay(1000 ) void digitalClockDisplay())( // zobrazení času pomocí digitálních hodin Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.print(" "); ); "); if(číslice< 10) Serial.print("0"); Serial.print(digits); }

#zahrnout

#zahrnout

#zahrnout

void setup() (

Seriál. začít(9600);

zatímco (! Seriál) ; // počkejte, až se otevře Arduino Serial Monitor

setSyncProvider(RTC.get); // funkce pro získání času z RTC

if (timeStatus() != timeSet)

Seriál. println("Nelze synchronizovat s RTC");

jiný

Seriál. println("RTC nastavil systémový čas");

void loop()

if (timeStatus() == timeSet) (

digitalClockDisplay();

) jinak (

Seriál. println( "Čas nebyl nastaven. Spusťte prosím čas") ;

Seriál. println( "Příklad TimeRTCSet nebo příklad DS1307RTC SetTime.") ;

Seriál. println();

zpoždění(4000);

zpoždění(1000);

void digitalClockDisplay() (

// digitální hodiny zobrazující čas

Seriál. print(hodina());

printDigits(minuta());

printDigits(second());

Seriál. tisk (" " ) ;

Seriál. print(den());

Seriál. tisk (" " ) ;

Seriál. print(mesic());

Seriál. tisk (" " ) ;

Seriál. print(rok());

Seriál. println();

void printDigits (int digits) (

// obslužná funkce pro zobrazení digitálních hodin: vytiskne před dvojtečku a úvodní 0

Seriál. tisk(":");

if (číslice< 10 )

Seriál. print("0");

Seriál. tisknout(číslice);

Po nahrání skici do desky spusťte monitor portu (Nástroje->monitor portu). Uvidíte zprávy z knihovny. Zobrazený čas bude nesprávný nebo si knihovna bude stěžovat, že hodiny nejsou nakonfigurovány. Chcete-li nastavit hodiny, načtěte do desky příklad z knihovny „SetTime“ DS1307RTC (Příklady->DS1307RTC->SetTime). Načtěte tento příklad do své desky. Po stažení se hodinky nastaví na čas sestavení skici. Prodleva mezi kompilací a úplným stažením bude velmi krátká, což bude stačit na jemně vyladěné hodiny. Pokud však odpojíte a znovu připojíte napájení desky, dokonce i po několika hodinách, čas hodin bude stále resetován na čas kompilace a bude nesprávný. Tento příklad tedy používejte pouze pro nastavení, po nastavení vypněte hodiny nebo nahrajte na desku další skicu.

Jedním z prvních projektů, který začátečníci staví pomocí desky Arduino, jsou jednoduché hodiny, které udržují čas. V podstatě jsou takové hodiny založeny na modulu RTC (Real Time Clock) připojeném k Arduinu. Dnes jsou na trhu elektronických součástek k dispozici různé modely RTC, které se liší přesností a cenou. Mezi běžné modely patří DS1302, DS1307, DS3231.



Ale můžete vytvořit hodiny na Arduinu bez použití RTC, zvláště pokud takové moduly nemůžete získat. Přesnost v tomto případě bude samozřejmě nízká, takže projekt by měl být spíše považován za vzdělávací projekt.


Princip fungování takových hodinek je poměrně jednoduchý. Pokaždé, když tyto hodiny Arduino zapnete, budete je muset nastavit na aktuální čas, stejně jako jakékoli analogové hodiny. Určitě je lepší takové hodinky v běžném životě nepoužívat, pokud jsou delší dobu aktivní bez restartu a další úpravy, protože desynchronizace s aktuálním časem při dlouhodobém používání může být značná.


Tyto hodiny lze sestavit na běžné prkénko, protože nevyžadují mnoho komponent. Naším hlavním odkazem zde bude deska Arduino Uno. Pro zobrazení času si můžete vzít LCD displej 16x2. Chcete-li změnit nastavení času, musíte připojit dvě tlačítka (pro hodiny a minuty). Tlačítka jsou k Aduinu připojena přes odpory 10KΩ. Pro změnu jasu displeje budete potřebovat 10 kOhm potenciometr. Schéma připojení všech těchto komponent k desce Arduino Uno je uvedeno níže.



Nyní musíte naprogramovat Arduino. Jednoduchý kód (náčrt), který umožňuje zobrazit čas na LCD obrazovce, je uveden níže.


#zahrnout LiquidCrystal lcd(12,11,5,4,3,2); int h=12; int m; int s; příznak int; int TIME; const int hs=8; const int ms=9; int stav1; int stav2; void setup() ( lcd.begin(16,2); ) void loop() ( lcd.setCursor(0,0); s=s+1; lcd.print("TIME:"); lcd.print(h lcd.print(":");<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(příznak==24)příznak=0; zpoždění(1000); lcd.clear(); if(s==60)( s=0; m=m+1; ) if(m==60) ( m=0; h=h+1; vlajka=vlajka+1; ) if(h==13 ) (h=1; ) lcd.setCursor(0,1); lcd.print("HEZKÝ DEN"); //-------Čas // nastavení-------// stav1=digitalRead(hs); if(stav1==1) (h=h+1; příznak=příznak+1; if(příznak<12)lcd.print("AM"); if(flag==12)lcd.print("PM"); if(flag>12)lcd.print("PM"); if(příznak==24)příznak=0; if(h==13)h=1; ) state2=digitalRead(ms); if(stav2==1)( s=0; m=m+1; ) )

   Děkujeme za váš zájem o informační projekt webových stránek.
   Pokud chcete, aby byly zajímavé a užitečné materiály zveřejňovány častěji as menší reklamou,
   Náš projekt můžete podpořit libovolnou částkou na jeho rozvoj.

V tomto článku se seznámíte s vynikajícím modulem hodin reálného času napájeným baterií.

S tímto modulem můžete sledovat čas ve svých projektech Arduino i v případě přeprogramování nebo výpadku napájení. Jedná se o jeden z nezbytných prvků pro projekty budíků, alarmů a odečítání odečtů ze senzorů v reálném čase. Jeden z nejpopulárnějších modelů hodin reálného času je DS1307. To je místo, kde se zaměříme. Modul se perfektně hodí k mikrokontrolérům Arduino, které mají logické napájení 5 V.

Vlastnosti modulu od výrobní společnosti Adafruit (Číňané nabízejí podobné možnosti třikrát až čtyřikrát levnější):

  • Vše je v ceně: čip, postroj, baterie;
  • Snadná montáž a snadné použití;
  • Instaluje se na jakékoli prkénko nebo se připojuje přímo pomocí vodičů;
  • Existují vynikající knihovny a ukázkové skici;
  • Dva otvory pro montáž;
  • Doba trvání práce - asi pět let!

Modul hodin reálného času může být již připájen, nebo může být prodáván ve formě samostatných součástek, jejichž pájení zabere asi 15 minut, ne více.

Co jsou hodiny reálného času?

Hodiny reálného času jsou... hodiny. Modul funguje na autonomní napájení – baterie a pokračuje v odpočítávání času, i když dojde ke ztrátě energie na vašem projektu Arduino. Pomocí modulu v reálném čase můžete sledovat čas, i když chcete provést změny v náčrtu a přeprogramovat mikrokontrolér.

Většina mikrokontrolérů, včetně Arduina, má vestavěný čítač času s názvem millis(). V čipu jsou také zabudované časovače, které mohou sledovat delší časové úseky (minuty nebo dny). Proč tedy potřebujete samostatný modul hodin? Hlavním problémem je, že millis() sleduje pouze čas od okamžiku, kdy je Arduino připojeno k napájení. Čili jakmile odpojíte desku, časovač se vynuluje na 0. Vši Arduino neví, co je například čtvrtek nebo 8. března. Z vestavěného počítadla můžete získat pouze „14 000 milisekund uplynulo od posledního zapnutí“.

Vytvořili jste například program a chcete od tohoto okamžiku odpočítávat čas. Pokud vypnete napájení mikrokontroléru, počítadlo času se ztratí. Podobně jako u levných čínských hodinek: když se vybije baterie, začnou ve 12:00 blikat.

V některých projektech Arduino budete potřebovat spolehlivou kontrolu času bez přerušení. Právě v takových případech se používá externí modul hodin reálného času. Čip, který se v takových hodinkách používá, sleduje roky a dokonce ví, kolik dní má měsíc (jediná věc, která se obvykle nebere v úvahu, je přechod na letní a zimní čas, protože tyto převody se liší v různé části světa).

Obrázek níže ukazuje základní desku počítače s hodinami reálného času DS1387. Hodinky používají lithiovou baterii, takže narostly.

Podíváme se na příklad pomocí hodin reálného času DS1307. Jedná se o levný, snadno použitelný modul, který na malou baterii vydrží několik let.

Dokud se baterie v modulu sama nevybije, bude DS1307 udržovat čas, i když je Arduino odpojeno nebo přeprogramováno.

Uzly, které tvoří modul hodin reálného času

Podrobnosti o modulu hodin reálného času Adafruit DS1307
Výkres Označení Popis Výrobce Množství
IC2 Čip hodin reálného času DS1307 1
Q1 32,768 KHz, 12,5 pF krystal Obecný 1
R1, R2 1/4W 5% 2,2kohm rezistor červená, červená, červená, zlatá Obecný 2
C1 0,1uF keramický kondenzátor Obecný 1
5kolíková lišta (1x5) Obecný 1
baterie 12mm 3V lithiová baterie CR1220 1
12mm držák na mince Keystone 3001 1
Platit Adafruit Industries 1

Sestavení modulu hodin reálného času

Sestavení hodin reálného času Adafruit DS1307
Fotografie Vysvětlivky

Připravte se na montáž. Zkontrolujte, zda máte všechny potřebné díly a nástroje. Umístěte obvodovou desku do svěráku.

Naneste trochu pájky na záporný pól baterie.

Nainstalujte dva odpory 2,2 kΩ a keramický kondenzátor. Jak přesně je uspořádáte, není důležité. Na polaritě nezáleží. Poté nainstalujte krystal (rovněž symetricky), držák (držák) pro baterii a čip hodin reálného času. Čip modulu reálného času musí být instalován tak, aby značka (drážka) na čipu byla umístěna v souladu s označením na desce plošných spojů. Podívejte se pozorně na fotografii vlevo, čip je nainstalován správně.


Aby držák baterie nevypadl, je lepší jej připájet nahoře. Poté desku otočte a připájejte zbývající kolíky.

Odstraňte zbývající kontakty z rezistorů, krystalu a kondenzátoru.

Pokud chcete použít kolíky k montáži modulu na nepájivou desku s plošnými spoji, nainstalujte kolíkovou lištu na prkénko, modul RTC nahoru a připájejte kolíky.

Nainstalujte baterii. Plochá část baterie by měla být nahoře. V průměru baterie vydrží asi 5 let. I když je baterie vybitá, nenechávejte slot baterie prázdný.

Knihovna Arduino pro práci s DS1307

DS1307 se snadno připojí k jakémukoli mikrokontroléru s 5V logickým napájením a I2C konektivitou. Podíváme se na připojení a použití tohoto modulu s Arduinem.

K získání a konfiguraci odečtů z DS1307 použijeme knihovnu RTClib. Máte-li dotazy ohledně instalace dalších knihoven Arduino, podívejte se na tyto pokyny.

Článek pojednává o příkladu hodin reálného času od Adafruit, ale stejně snadno můžete použít čínské analogy. Princip fungování a zapojení se neliší.

  • KOUPIT Arduino Uno R3;
  • KOUPIT Breadboard ;
  • KOUPIT modul hodin reálného času DS1307;

Na skutečných hodinách je 5 pinů: 5V, GND, SCL, SDA a SQW.

  • 5V se používá k napájení čipu modulu hodin reálného času, když se dotazujete na časové údaje. Pokud není přiveden signál 5V, čip přejde do režimu spánku.
  • GND - společná zem. Musí být zapojen do obvodu.
  • SCL - i2c clock contact - je nezbytný pro výměnu dat s hodinami reálného času.
  • SDA je kontakt, přes který se přes i2c přenášejí data z hodin reálného času.
  • SQW umožňuje konfigurovat výstup dat ve formě obdélníkové vlny. Ve většině případů se tento kontakt nepoužívá.

Pokud jste nakonfigurovali analogový pin 3 (digitální 17) jako OUTPUT a HIGH a analogový pin 2 (digitální 16) jako OUTPUT a LOW, můžete napájet hodiny reálného času přímo z těchto pinů!

Připojte analogový pin 4 na Arduinu k SDA. Připojte analogový pin 5 na Arduinu k SCL.


Skica pro Arduino

Kontrola hodin reálného času

První skica, která se spustí, je program, který bude číst data z modulu hodin reálného času jednou za sekundu.

Nejprve se podívejme, co se stane, když vyjmeme baterii a vyměníme ji za jinou, zatímco Arduino není připojeno k USB. Počkejte 3 sekundy a vyjměte baterii. V důsledku toho se čip na hodinách reálného času restartuje. Poté vložte kód níže (kód lze také nahrát do Příklady→RTClib→ds1307 v Arduino IDE) a nahrajte jej do Arduina.

Dále budete potřebovat knihovnu OneWire.h, můžete si ji stáhnout

.

// funkce data a času pomocí hodin reálného času DS1307 připojených přes I2C. Skica používá knihovnu Wire lib

#include <Wire.h>

#include "RTClib.h"

Serial.begin(57600);

if (!RTC.isrunning()) (

Serial.println("RTC NENÍ spuštěno!");

// RTC.adjust(DateTime(__DATE__, __TIME__));

DateTime now = RTC.now();

Serial.print("/");

Serial.print("/");

Serial.print(now.day(), DEC);

Serial.print(" ");

Serial.print(":");

Serial.print(":");

Serial.println();

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.println("d");

// výpočet data: 7 dní a 30 sekund

DateTime future(now.unixtime() + 7 * 86400L + 30);

Serial.print(" now + 7d + 30s: ");

Serial.print(future.year(), DEC);

Serial.print("/");

Serial.print(future.month(), DEC);

Serial.print("/");

Serial.print(future.day(), DEC);

Serial.print(" ");

Serial.print(future.hour(), DEC);

Serial.print(":");

Serial.print(future.minute(), DEC);

Serial.print(":");

Serial.print(future.second(), DEC);

Serial.println();

Serial.println();

Nyní otevřete okno sériového monitoru a ujistěte se, že je správně nastavena přenosová rychlost: 57600 bps.

V důsledku toho byste v okně sériového monitoru měli vidět něco takového:


Pokud hodiny reálného času ztratí napájení, zobrazí se 0:0:0. Sekundy se přestanou počítat. Po nastavení času začne nové odpočítávání. Z tohoto důvodu nelze baterii vyjmout, když je modul hodin reálného času spuštěný.

Nastavení času na hodinovém modulu

Ve stejné skice odkomentujte řádek, který začíná RTC.adjust:

// řádek níže slouží k nastavení data a času hodin

RTC.adjust(DateTime(__DATE__, __TIME__));

Proces nastavení data a času je velmi elegantní. Tento řádek obsahuje data z vašeho počítadla na vašem osobním počítači (v době, kdy je kód kompilován). Tato data se používají k flashování vašeho modulu hodin reálného času. To znamená, že pokud je čas na vašem PC nastaven špatně, doporučujeme nejprve opravit tuto chybu a poté přejít na flashování hodinového modulu pro Arduino.

Po nastavení otevřete sériový monitor a ujistěte se, že jsou hodiny správně nastaveny:


Všechno. Od nynějška a několik příštích let nebude potřeba DS1307 konfigurovat.

Doba čtení z DS1307

Jakmile jsou hodiny reálného času DS1307 nakonfigurovány, mohou na ně odesílat dotazy. Podívejme se na část náčrtu, která tyto dotazy implementuje.

DateTime now = RTC.now();

Serial.print(nyní.rok(), DEC);

Serial.print("/");

Serial.print(now.month(), DEC);

Serial.print("/");

Serial.print(now.day(), DEC);

Serial.print(" ");

Serial.print(now.hour(), DEC);

Serial.print(":");

Serial.print(now.minute(), DEC);

Serial.print(":");

Serial.print(now.second(), DEC);

Serial.println();

V podstatě existuje jedna možnost, jak získat čas pomocí hodin reálného času. K tomu použijte funkci now(), která vrací objekt DateTime. Tento objekt obsahuje údaje o roce, měsíci, dni, hodině, minutě a sekundě.

Existuje řada knihoven hodin reálného času, které poskytují funkce jako RTC.year() a RTC.hour(). Tyto funkce vytáhnou samostatně rok a hodinu. Jejich použití však přináší řadu problémů: pokud zadáte požadavek na zobrazení minut najednou, například 3:14:59, to znamená těsně předtím, než by se hodnota minut měla rovnat „15“ (3:15: 00), výsledný údaj bude roven 3:14:00 - to znamená, že ztratíte jednu minutu.

Obecně platí, že použití samostatných funkcí pro vyvolání hodiny nebo roku je oprávněné pouze v případě, že přesnost časového řízení s rozpětím jedné minuty/rok není pro váš projekt kritická (zpravidla je to v případech, kdy se odečítají údaje zřídka - jednou denně, jednou týdně). V každém případě, pokud se chcete vyhnout chybám v odečtech, použijte now() a z přijatých dat extrahujte odečty, které potřebujete (minuty, roky atd.).

Existuje další formát dat, který se můžeme naučit – počet sekund od půlnoci 1. ledna 1970. K tomu slouží funkce unixtime():

Serial.print(" od roku 1970 = ");

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.print(now.unixtime() / 86400L);

Serial.println("d");

Protože jeden den je 60*60*24 = 86400 sekund, můžete výslednou hodnotu převést na dny a roky. Velmi pohodlná možnost, pokud potřebujete sledovat, kolik času uplynulo od poslední žádosti. Pokud například uplynulo 5 minut od posledního přístupu Arduina k hodinám reálného času DS1307, hodnota vrácená funkcí unixtime() bude větší než 300.

Níže zanechte své komentáře, dotazy a podělte se o své osobní zkušenosti. V diskuzích se často rodí nové nápady a projekty!