Hodiny sú navrhnuté na vysoko presnom (extrémne presnom I2C) čipe DS3231. Hodiny na mikrokontroléri DS3231 a AVR

  • 04.11.2019

V mnohých projektoch Arduino je potrebné sledovať a zaznamenávať čas výskytu určitých udalostí. Modul hodín reálneho času, vybavený prídavnou batériou, umožňuje uložiť aktuálny dátum bez ohľadu na prítomnosť napájania na samotnom zariadení. V tomto článku si povieme o najbežnejších moduloch DS1307, DS1302, DS3231 RTC, ktoré je možné použiť s doskou Arduino.

Hodinový modul je malá doska obsahujúca spravidla jeden z mikroobvodov DS1307, DS1302, DS3231. Okrem toho na doske takmer nájdete mechanizmus na inštaláciu napájacej batérie. Takéto tabule sa často používajú na započítanie času, dátumu, dňa v týždni a iných chronometrických parametrov. Moduly fungujú na autonómne napájanie - batérie, akumulátory a pokračujú v počítaní, aj keď je napájanie Arduina vypnuté. Najbežnejšie modely hodiniek sú DS1302, DS1307, DS3231. Sú založené na module RTC (Real Time Clock) pripojenom k ​​Arduinu.

Hodiny počítajú v jednotkách, ktoré sú vhodné pre bežného človeka – minúty, hodiny, dni v týždni a iné, na rozdiel od bežných počítadiel a generátorov hodín, ktoré čítajú „tikania“. Arduino má špeciálnu funkciu millis(), ktorá dokáže čítať aj rôzne časové intervaly. Hlavnou nevýhodou tejto funkcie je však resetovanie na nulu, keď je časovač zapnutý. S jeho pomocou sa dá len odčítať čas, nedá sa nastaviť dátum ani deň v týždni. Na vyriešenie tohto problému sa používajú moduly hodín v reálnom čase.

Elektronický obvod obsahuje mikroobvod, napájací zdroj, kremenný rezonátor a odpory. Kremenný rezonátor pracuje na frekvencii 32768 Hz, čo je vhodné pre konvenčný binárny čítač. Obvod DS3231 má zabudovaný kryštál a tepelnú stabilizáciu, čo umožňuje získať vysoké hodnoty presnosti.

Porovnanie populárnych RTC modulov DS1302, DS1307, DS3231

V tejto tabuľke sme uviedli zoznam najpopulárnejších modulov a ich hlavné charakteristiky.

názov Frekvencia Presnosť Podporované protokoly
DS1307 1 Hz, 4,096 kHz, 8,192 kHz, 32,768 kHz Závisí od kremeňa - zvyčajne hodnota dosahuje 2,5 sekundy za deň, nie je možné dosiahnuť presnosť vyššiu ako 1 sekundu za deň. Presnosť tiež závisí od teploty. I2C
DS1302 32,768 kHz 5 sekúnd denne I2C, SPI
DS3231 Dva výstupy - prvý na 32,768 kHz, druhý - programovateľný od 1 Hz do 8,192 kHz ±2 ppm pri teplotách od 0 °C do 40 °C.

±3,5 ppm pri teplotách od -40C do 85C.

Presnosť merania teploty – ±3С

I2C

Modul DS1307

DS1307 je modul, ktorý sa používa na časovanie. Je zostavený na základe čipu DS1307ZN, napájaný lítiovou batériou, aby bola realizovaná autonómna prevádzka po dlhú dobu. Batéria na doske je namontovaná na zadnej strane. Modul má čip AT24C32 - jedná sa o energeticky nezávislú pamäť EEPROM s veľkosťou 32 Kbytes. Oba mikroobvody sú vzájomne prepojené zbernicou I2C. DS1307 je nízkoenergetický a obsahuje hodiny a kalendár až do roku 2100.

Modul má nasledujúce parametre:

  • Napájanie - 5V;
  • Rozsah prevádzkovej teploty od -40 C do 85 C;
  • 56 bajtov pamäte;
  • lítiová batéria LIR2032;
  • Implementuje 12- a 24-hodinové režimy;
  • Podpora rozhrania I2C.

Modul je opodstatnené použiť v prípadoch, keď sa údaje čítajú pomerne zriedkavo, s intervalom týždňa a viac. To vám umožní ušetriť energiu, pretože počas nepretržitého používania budete musieť minúť viac napätia, dokonca aj s batériou. Prítomnosť pamäte umožňuje registrovať rôzne parametre (napríklad meranie teploty) a čítať informácie prijaté z modulu.

Interakcia s inými zariadeniami a výmena informácií s nimi sa vykonáva pomocou rozhrania I2C z kontaktov SCL a SDA. V obvode sú inštalované odpory, ktoré vám umožňujú poskytnúť požadovanú úroveň signálu. Na doske je tiež špeciálne miesto pre montáž snímača teploty DS18B20 Kontakty sú rozdelené do 2 skupín, rozstup 2,54 mm. Prvá skupina kontaktov obsahuje tieto závery:

  • DS - výstup pre snímač DS18B20;
  • SCL - hodinová linka;
  • SDA - dátová linka;
  • VCC - 5V;

V druhej skupine kontaktov sú:

  • SQ - 1 MHz;
  • BAT - Vstup lítiovej batérie.

Na pripojenie k Arduino doske potrebujete samotnú dosku (v tomto prípade prichádza do úvahy Arduino Uno), modul hodín reálneho času RTC DS1307, vodiče a USB kábel.

Na pripojenie ovládača k Arduinu slúžia 4 piny - VCC, zem, SCL, SDA.

Ak chcete začať pracovať s modulom hodín, musíte si nainštalovať knižnice DS1307RTC, TimeLib a Wire. Môže byť použitý pre prácu a RTCLib.

Kontrola modulu RTC

Keď spustíte prvý kód, program načíta dáta z modulu raz za sekundu. Najprv môžete vidieť, ako sa program bude správať, ak vyberiete batériu z modulu a vymeníte ju za inú, zatiaľ čo doska Arduino nie je pripojená k počítaču. Musíte počkať niekoľko sekúnd a vytiahnuť batériu, v dôsledku toho sa hodiny reštartujú. Potom musíte vybrať príklad z ponuky Príklady→RTClib→ds1307. Dôležité je správne nastaviť prenosovú rýchlosť na 57600 bps.

Keď otvoríte okno sériového monitora, mali by sa objaviť nasledujúce riadky:

Ukáže čas 0:0:0. Je to spôsobené tým, že hodiny strácajú energiu a odpočítavanie sa zastaví. Z tohto dôvodu sa batéria počas prevádzky modulu nesmie vyberať.

Ak chcete nastaviť čas na module, musíte nájsť čiaru v náčrte

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

Tento riadok bude obsahovať údaje z počítača, ktorý sa používa na flashovanie modulu hodín reálneho času. Pre správnu činnosť je potrebné najskôr skontrolovať správnosť dátumu a času v počítači a až potom začať blikať modul hodín. Po nastavení sa na monitore zobrazia nasledujúce údaje:

Nastavenie bolo vykonané správne a nie je potrebné dodatočne prestavovať hodiny reálneho času.

Čítanie času. Po nakonfigurovaní modulu môžete odosielať požiadavky na získanie času. Na tento účel použite funkciu now(), ktorá vráti objekt DateTime, ktorý obsahuje informácie o čase a dátume. Existuje množstvo knižníc, ktoré sa používajú na čítanie času. Napríklad RTC.year() a RTC.hour() - samostatne dostávajú informácie o roku a hodine. Pri práci s nimi môže nastať problém: napríklad požiadavka na zobrazenie času bude vykonaná o 1:19:59. Pred zobrazením času 1:20:00 hodiny zobrazia čas 1:19:00, to znamená, že v skutočnosti dôjde k strate jednej minúty. Preto je vhodné použiť tieto knižnice v prípadoch, keď sa čítanie vyskytuje zriedkavo – raz za niekoľko dní. Existujú aj ďalšie funkcie na volanie času, ale ak potrebujete znížiť alebo sa vyhnúť chybám, je lepšie použiť teraz () a už z neho vytiahnuť potrebné údaje.

Vzorový projekt s modulom hodín i2C a displejom

Projekt sú bežné hodiny, indikátor zobrazuje presný čas a dvojbodka medzi číslicami bude blikať v intervale raz za sekundu. Na realizáciu projektu budete potrebovať dosku Arduino Uno, digitálny indikátor, hodiny reálneho času (v tomto prípade modul ds1307 popísaný vyššie), štít na pripojenie (v tomto prípade je použitý štít Troyka Shield), batéria hodín a káble.

Projekt využíva jednoduchý štvormiestny indikátor na čipe TM1637. Zariadenie má dvojvodičové rozhranie a poskytuje 8 úrovní jasu monitora. Používa sa len na zobrazenie času vo formáte hodiny:minúty. Indikátor sa ľahko používa a ľahko sa pripája. Je výhodné ho použiť pre projekty, kde nie je potrebná minútová alebo hodinová validácia údajov. Na získanie kompletnejších informácií o čase a dátume sa používajú monitory z tekutých kryštálov.

Modul hodín je pripojený na piny SCL/SDA, ktoré súvisia so zbernicou I2C. Musíte tiež pripojiť uzemnenie a napájanie. K Arduinu sa pripája rovnakým spôsobom, ako je popísané vyššie: SDA - A4, SCL - A5, zem z modulu na zem s Arduinom, VCC -5V.

Indikátor sa pripája jednoducho - výstupy z neho CLK a DIO sú pripojené na ľubovoľné digitálne piny na doske.

Skica. Na písanie kódu sa používa funkcia nastavenia, ktorá vám umožňuje inicializovať hodiny a indikátor, zaznamenať čas kompilácie. Zobrazenie času na obrazovke sa uskutoční pomocou slučky.

#include #include "TM1637.h" #include "DS1307.h" //musíte zahrnúť všetky potrebné knižnice na prácu s hodinami a displejom. čas kompilácie znakov = __TIME__; //čas kompilácie. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 // čísla z Arduino výstupov, ku ktorým je pripojená obrazovka; void setup() ( display.set(); display.init(); //pripojenie a nastavenie obrazovky. clock.begin(); //zapnutie hodín. byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 2); byte second = getInt(compileTime, 4); // získanie času. hodiny. fillByHMS(hodina, minúta, sekunda); // príprava na zápis do časového modulu. hodiny. setTime( ); // prebieha zápis prijatých informácií do internej pamäte, začnite čítať čas. ) void loop() ( int8_t timeDisp; //zobrazenie na každej zo štyroch číslic. clock.getTime();//požiadavka na získanie time. timeDisp = clock.hour / 10; timeDisp = clock.hour % 10; timeDisp = clock.minute / 10; timeDisp = clock.minute % 10; //rôzne operácie na získanie desiatok, jednotiek hodín, minút atď. display.display(timeDisp); //zobrazenie času na indikátore display.point(clock.second % 2 ? POINT_ON: POINT_OFF);//Zapnutie a vypnutie dvojbodky po sekunde. ) char getInt(const char* reťazec, int startIndex) ( return int(string - "0") * 1 0 + int(reťazec) - "0"; //akcie na správne zaznamenanie času v dvojcifernom celom čísle. V opačnom prípade sa na obrazovke zobrazí iba niekoľko znakov. )

Potom je potrebné načítať náčrt a čas sa zobrazí na monitore.

Program je možné mierne upgradovať. Keď je napájanie vypnuté, náčrt napísaný vyššie spôsobí, že po zapnutí sa na displeji zobrazí čas, ktorý bol nastavený počas kompilácie. Funkcia nastavenia vždy vypočíta čas, ktorý uplynul od 00:00:00 do začiatku kompilácie. Tento hash sa porovná s tým, čo je uložené v EEPROM, ktoré sa uloží po vypnutí napájania.

Ak chcete zapisovať a čítať čas do energeticky nezávislej pamäte alebo z nej, musíte pridať funkcie EEPROMWriteInt a EEPROMReadInt. Sú potrebné na kontrolu, či sa hash zhoduje/nezhoduje s hashom uloženým v EEPROM.

Projekt je možné vylepšiť. Ak používate monitor z tekutých kryštálov, môžete vytvoriť projekt, ktorý bude zobrazovať dátum a čas na obrazovke. Zapojenie všetkých prvkov je znázornené na obrázku.

V dôsledku toho budete musieť v kóde zadať novú knižnicu (pre obrazovky z tekutých kryštálov je to LiquidCrystal) a pridať riadky do funkcie loop(), aby ste získali dátum.

Algoritmus práce je nasledujúci:

  • Spojenie všetkých komponentov;
  • Skontrolujte - na obrazovke monitora by sa čas a dátum mali meniť každú sekundu. Ak sa na obrazovke zobrazuje nesprávny čas, musíte do náčrtu pridať funkciu RTC.write (tmElements_t tm). Problémy s nesprávnym časom sú spôsobené tým, že modul hodín pri vypnutí prestavil dátum a čas na 00:00:00 01.01.2000.
  • Funkcia zápisu vám umožňuje získať dátum a čas z počítača, po ktorom sa na obrazovke zobrazia správne parametre.

Záver

Moduly hodín sa používajú v mnohých projektoch. Sú potrebné pre systémy zaznamenávania údajov, pri vytváraní časovačov a ovládacích zariadení, ktoré pracujú podľa daného harmonogramu, v domácich spotrebičoch. So široko dostupnými a lacnými modulmi môžete vytvárať projekty ako budík alebo záznamník dát zo senzorov, zapisovať informácie na SD kartu alebo zobrazovať čas na displeji. V tomto článku sme sa pozreli na typické prípady použitia a možnosti pripojenia najpopulárnejších typov modulov.

Popis

Modul hodín reálneho času s nezávislým napájaním. Arduino/Genuino ovládače nemajú zabudované hodiny reálneho času. Na prácu s časom je tu funkcia millis(). Pri projektoch, ktoré vyžadujú čas a dátum, však možnosti tejto funkcie nestačia a na pomoc prichádzajú hodiny reálneho času.

DS3231 sú lacné, presné I2C hodiny reálneho času s teplotnou kompenzáciou TCXO. Zariadenie obsahuje konektor pre batériu CR2032 a udržiava presné časovanie pri prerušení napájania zariadenia. Hodinky podporujú informácie o sekundách, minútach, hodinách, dni, mesiaci a roku. Dátum na konci mesiaca sa automaticky opraví pre mesiace s menej ako 31 dňami vrátane korekcie na priestupný rok. Pracujú v jednom z režimov: 24- alebo 12-hodinový formát (s indikátorom AM/PM). Majú dva programovateľné budíky.

Hlavné vlastnosti hodiniek:

    Hodiny reálneho času s počítaním sekúnd, minút, hodín, dní, mesiacov a rokov (s korekciou dátumu vrátane priestupného roku až do 2100)

    Chyba jazdy: ±2 minúty za rok

    Snímač teploty s chybou ± 3 ° С

    Dva budíky

technické údaje

    Pracovná teplota: -40°С - +85°С

    Napájacie napätie: 2,3 - 5,5 V

    Napájacie napätie batérie: 2,3 - 5,5 V

    Maximálny odber prúdu: 650 nA

Fyzické rozmery

    Modul (D x Š x V): 45 x 23 x 15 mm

Výhody používania

    Vysoká presnosť hodín

    K dispozícii sú dva budíky s funkciou prerušenia

    Široký rozsah prevádzkových teplôt

Nevýhody používania

    Drahšie ako niektoré analógy

Knižnica pre prácu s modulom

Príklady zapojenia a použitia

Príklad 1: Príklad ilustruje pripojenie hodinového modulu k ovládaču, nastavenie času a dátumu na hodinách, výstup času, dátumu a dňa v týždni na monitor sériového portu a získanie teploty z aktuálneho modulu. (Príklady testované na ovládači Smart UNO)

Elektrické schéma:

Stiahnuť náčrt:

//Vrátane knižníc#include #include "DS3231.h" DS3231 RTC; //Vytvorte objekt DS3231 char týždeňDeň [ 4 ] = ( "Ne", "Po", "Utorok" , ​​"Str" , "Štv", "Piatok", "So"); //Vytvorte pole dní v týždni //Vytvorenie premennej typu DateTime na nastavenie dátumu vo formáte: //rok, mesiac, deň, hodina, minúta, sekunda a deň v týždni (od 0 - nedeľa do 6 - sobota) DateTime dt(2016 , 8 , 22 , 16 , 10 , 0 , 1 ); void setup() ( Serial .begin (9600) ; //inicializácia sériového portu Wire.begin(); //inicializácia drôtovej knižnice RTC.begin(); //inicializácia hodín RTC.adjust (dt) ; //Nastavenie dátumu a času tak, ako je nastavený v premennej dt) void loop () ( DateTime now = RTC.now () ; // získanie aktuálneho dátumu a času //vypíše prijatý rok Serial .print(now.year() , DEC) ; Serial .print("/" ) ; //vypis mesiaca Serial .print (now.month () , DEC) ; Serial .print("/" ) ; //dňa Serial .print (now.date () , DEC) ; Serial.print(""); //hodiny Serial .print (now.hour () , DEC) ; Serial .print(":" ) ; //minúty Serial .print (now.minute () , DEC) ; Serial .print(":" ) ; //sekundy Serial .print (now.second () , DEC) ; Serial.println(); //deň v týždni Serial .print (weekDay[ now.dayOfWeek () ] ) ; Serial.println(); oneskorenie(1000) ; //oneskorenie 1 sek RTC.convertTemperature(); //prevod aktuálnej teploty v registroch Serial .print (RTC.getTemperature () ) ; //prečítanie registrov a výstup prijatej teploty Serial.println("C"); oneskorenie(1000) ; //oneskorenie 1 sek }

Charakteristické rysy:

  • Presnosť ±2 ppm v teplotnom rozsahu od 0°C do +40°C
  • Presnosť ±3,5 ppm v teplotnom rozsahu od -40°C do +85°C
  • Vstup pre pripojenie nezávislého zdroja energie umožňujúci nepretržitú prevádzku
  • Rozsah prevádzkových teplôt Komerčné: 0 °C až +70 °C Priemyselné: -40 °C až +85 °C
  • Nízka spotreba
  • Hodiny reálneho času počítajúce sekundy, minúty, hodiny, dni v týždni, dni v mesiaci, mesiaci a roku s korekciou na priestupný rok až do 2100
  • Dva denné budíky
  • Štvorcový výstup s programovateľnou frekvenciou
  • Rýchla odozva (400 kHz) I 2 C rozhranie
  • Napájanie 3,3V
  • Digitálny snímač teploty s presnosťou merania ±3°C
  • Register obsahujúci údaje o potrebnej úprave
  • nonRST reset vstupu/výstupu

Aplikácia:

  • Servery
  • Elektronické elektromery
  • Telematické zariadenia
  • GPS systémy

Typická schéma zapojenia DS3231:

Všeobecný popis:

DS3231 sú vysoko presné hodiny reálneho času (RTC) so vstavaným rozhraním I 2 C, teplotne kompenzovaným kryštálovým oscilátorom (TCXO) a kryštálovým oscilátorom. Zariadenie má vstup pre pripojenie záložného autonómneho zdroja, ktorý umožňuje meranie času a teploty aj pri odpojení hlavného zdroja. Vstavaný kremenný rezonátor zvyšuje životnosť nástroja a znižuje počet potrebných externých komponentov. DS3231 je dostupný v komerčných a priemyselných teplotných triedach a je zabalený v 300 mil 16-pinovom SO balení.

RTC poskytuje sekundy, minúty, hodiny, dni v týždni, dni v mesiaci a roky. Dátum konca mesiaca sa určuje automaticky s prihliadnutím na priestupný rok. Hodiny reálneho času pracujú v 24 alebo 12 hodinovom formáte s vyznačením aktuálnej polovice dňa (AM/PM). Zariadenie má dva denné alarmy a výstup so štvorcovými vlnami s programovateľnou frekvenciou. Výmena dát so zariadením prebieha cez vstavané sériové I 2 C kompatibilné rozhranie.

". Zoznámime sa s modulom hodín reálneho času DS3231. Článok obsahuje video návody, výpisy programov, účel a spôsoby pripojenia modulov z rodiny DS k Arduinu.

Modul hodín reálneho času DS3231

Čo je modul hodín reálneho času DS3231?

Modul hodín reálneho času- ide o elektronický obvod určený na zaznamenávanie chronometrických údajov (aktuálny čas, dátum, deň v týždni a pod.), je to systém z autonómneho zdroja energie a účtovné zariadenie.

modul DS3231 V podstate ide len o bežné hodinky. Dosky Arduino už majú zabudované hodiny Millis funguje to však len vtedy, keď je na dosku privedené napájanie. Vypnutím a opätovným zapnutím Arduina sa čas milis vynuluje. A DS3231 má na doske batériu, ktorá, aj keď je doska Arduino vypnutá, naďalej „napája“ modul, čo mu umožňuje merať čas.

Modul je možné použiť ako hodiny alebo budík na báze dosiek Arduino. Alebo ako výstraha pre rôzne systémy, napríklad v Smart Home.

Špecifikácie DS3231:

  • modul počíta hodiny, minúty, sekundy, dátumy, mesiace, roky (prestupné roky sa berú do úvahy do roku 2100);
  • pre pripojenie k rôznym zariadeniam sa hodiny pripájajú cez rozhranie I2C.

32 tis- Výstup určený na napájanie externého napájania > 12V.

SQW- Programovateľný výstup signálu Square-Wave.

SCL– Prostredníctvom tohto pinu sa dáta vymieňajú s hodinami cez rozhranie I2C.

SDA– Cez tento pin sa prenášajú dáta z hodín.

VCC- Napájanie hodín reálneho času, potrebuje 5 voltov. Ak na tento kolík nie je privedené žiadne napätie, hodiny prejdú do režimu spánku.

GND- Zem.

Schéma zapojenia hodín reálneho času DS3231 a jednoduchý program

Piny SDA a SCL na rôznych doskách Arduino:

SDA SCL
OSN A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Pripojme modul hodín reálneho času k Arduino UNO. SDA - kolík A4, SCL - kolík A5.

Nasledujúci program je vhodný pre fungovanie modelu (program môžete jednoducho skopírovať do Arduino IDE):

#include

void setup()(
oneskorenie(300);
Serial.begin(9600);
time.begin();
}
void loop()(



}
}

Tento náčrt je len odpočítavanie.

V prvom rade v scenári prepojenie knižnice arduino_RTC.h.

Na tom istom mieste uveďte presný názov vášho modulu pre správnu prácu s ním.

Výsledkom je, že dostaneme výstup času z modulu DS3231 na monitor portu. Zobrazuje hodiny, minúty, sekundy.

V ďalšom náčrte pridáme funkciu nastav čas, čo vám umožní nastaviť počiatočný čas odpočítavania.

#include
iarduino_RTC time(RTC_DS3231);
void setup()(
oneskorenie(300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 sekúnd, 0 minút, 18 hodín, 24. apríla 2017, pondelok
}
void loop()(
if(millis()%1000==0)( // ak uplynula 1 sekunda
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // čas výstupu
oneskorenie(1); // pauza na 1 ms, aby sa čas nezobrazoval niekoľkokrát za 1 ms
}
}

V príklade sa čas začína počítať od 0 sekúnd, 0 minút, 18 hodín, 24. apríla 2017, pondelok.

Príspevky z lekcie:

  1. Prvá hodina: .
  2. Druhá lekcia: .
  3. Tretia lekcia: .
  4. Štvrtá lekcia: .
  5. Piata lekcia: .
  6. Šiesta lekcia: .
  7. Siedma lekcia: .
  8. Ôsma lekcia: .
  9. Deviata lekcia: