Obsah:

Použitie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino: 3 kroky
Použitie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino: 3 kroky

Video: Použitie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino: 3 kroky

Video: Použitie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino: 3 kroky
Video: 🚀 RUTUBE и ТОЧКА. Разработка РУТУБА за 5 часов *БЕЗ ВОДЫ* [Next / React / Nest / PostgreSQL / Redux] 2024, November
Anonim
Používanie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino
Používanie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino
Použitie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino
Použitie hodinových modulov v reálnom čase DS1307 a DS3231 s Arduino

Stále dostávame žiadosti o to, ako používať moduly hodín v reálnom čase DS1307 a DS3231 s Arduino, z rôznych zdrojov-toto je teda prvý z dvojdielneho tutoriálu, ako ich používať. Pre tento tutoriál k Arduinu máme k dispozícii dva moduly hodín v reálnom čase, jeden založený na modeli Maxim DS1307 (štvorcový modul) a DS3231 (obdĺžnikový modul).

Existujú dva hlavné rozdiely medzi integrovanými obvodmi na moduloch hodín v reálnom čase, čo je presnosť dodržiavania času. DS1307 použitý v prvom module funguje veľmi dobre, ale vonkajšia teplota môže ovplyvniť frekvenciu obvodu oscilátora, ktorý poháňa interné počítadlo DS1307.

Môže to znieť ako problém, ale zvyčajne to bude dôsledkom toho, že hodiny budú vypnuté zhruba o päť minút mesačne. DS3231 je oveľa presnejší, pretože má interný oscilátor, ktorý nie je ovplyvnený vonkajšími faktormi - a je teda presný až na niekoľko minút za rok. Ak máte modul DS1307- necítite sa zle, je to stále cenovo výhodná doska, ktorá vám bude dobre slúžiť. Pri oboch moduloch je potrebná záložná batéria.

Je dobré kúpiť si novú batériu CR2032 a namontovať ju do modulu. Okrem sledovania času a dátumu majú tieto moduly aj malú EEPROM, funkciu alarmu (iba DS3231) a schopnosť generovať štvorcovú vlnu rôznych frekvencií-to všetko bude predmetom druhého tutoriálu.

Krok 1: Pripojenie modulu k Arduinu

Oba moduly používajú zbernicu I2C, čo veľmi uľahčuje pripojenie.

Najprv budete musieť zistiť, ktoré piny na doske Arduino alebo kompatibilných doskách sa používajú pre zbernicu I2C - budú známe ako SDA (alebo údaje) a SCL (alebo hodiny). Na doskách Arduino Uno alebo kompatibilných sú tieto piny A4 a A5 pre dáta a hodiny; Na Arduino Mega sú piny D20 a D21 pre dáta a hodiny; A ak používate kompatibilné s Pro Mini, kolíky sú A4 a A5 pre dáta a hodiny, ktoré sú rovnobežné s hlavnými kolíkmi.

Modul DS1307

Ak máte modul DS1307, budete musieť spájkovať vodiče k doske alebo spájkovať na niektorých vložených kolíkoch záhlavia, aby ste mohli použiť prepojovacie vodiče. Potom pripojte piny SCL a SDA k vášmu Arduinu a kolík Vcc k pinu 5V a GND k GND.

Modul DS3231

Pripojenie tohto modulu je jednoduché, pretože kolíky záhlavia sú na doske nainštalované vo výrobe. Jednoducho môžete znova prepojiť prepojovacie káble z SCL a SDA do Arduina a znova z pinov Vcc a GND modulu na 5 V alebo 3,3 V a GND na vašej doske. Na spájkovanie vlastných drôtov sú však duplikáty na druhej strane. Oba tieto moduly majú požadované výsuvné odpory, takže nemusíte pridávať svoje vlastné. Rovnako ako všetky zariadenia pripojené k zbernici I2C, skúste obmedziť dĺžku vodičov SDA a SCL na minimum.

Krok 2: Čítanie a zapisovanie času z vášho modulu RTC

Akonáhle zapojíte svoj modul RTC. zadajte a nahrajte nasledujúci náčrt. Napriek tomu, že poznámky a funkcie v náčrte sa týkajú iba DS3231, kód funguje aj s DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Previesť normálne desatinné čísla na binárne kódované desatinné bajty decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Previesť binárne kódované desatinné číslo na normálne desatinné čísla byte bcdToDec (bajtová hodnota) {return ((hodnota/16*10) + (hodnota%16)); } neplatné nastavenie () {Wire.begin (); Serial.begin (9600); // tu nastavte počiatočný čas: // DS3231 sekundy, minúty, hodiny, deň, dátum, mesiac, rok // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (bajt sekunda, bajt minúta, bajt hodina, bajt dayOfWeek, bajt dayOfMonth, bajt mesiac, byte rok) {// nastaví čas a dátum na DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nastavenie ďalšieho vstupu na začiatok v sekundovom registri Wire.write (decToBcd (druhý)); // nastavenie sekúnd Wire.write (decToBcd (minúta)); // nastavenie minút Wire.write (decToBcd (hodina)); // nastavenie hodín Wire.write (decToBcd (dayOfWeek)); // nastavený deň v týždni (1 = nedeľa, 7 = sobota) Wire.write (decToBcd (dayOfMonth)); // nastavenie dátumu (1 až 31) Wire.write (decToBcd (mesiac)); // nastavenie mesiaca Wire.write (decToBcd (rok)); // nastavenie roku (0 až 99) Wire.endTransmission (); } void readDS3231time (byte *sekunda, byte *minuta, byte *hodina, byte *dayOfWeek, byte *dayOfMonth, byte *mesiac, byte *rok) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nastavenie ukazovateľa registra DS3231 na 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // požiadavka na sedem bajtov dát z DS3231 počnúc registrom 00h *sekunda = bcdToDec (Wire.read () & 0x7f); *minúta = bcdToDec (Wire.read ()); *hodina = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mesiac = bcdToDec (Wire.read ()); *rok = bcdToDec (Wire.read ()); } void displayTime () {byte sekunda, minúta, hodina, dayOfWeek, dayOfMonth, mesiac, rok; // načítanie údajov z DS3231 na čítanie DS3231time (& sekundu, & minútu, & hodinu, & dayOfWeek, & dayOfMonth, & mesiac, & rok); // pošlite ho na sériový monitor Serial.print (hodina, DEC); // pri zobrazení Serial.print (":") previesť premennú bytu na desatinné číslo; if (minúta <10) {Serial.print ("0"); } Serial.print (minúta, DEC); Serial.print (":"); if (druhý <10) {Serial.print ("0"); } Serial.print (druhý, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (mesiac, DEC); Serial.print ("/"); Serial.print (rok, DEC); Serial.print („Deň v týždni:“); switch (dayOfWeek) {case 1: Serial.println ("Sunday"); prestávka; prípad 2: Serial.println („pondelok“); prestávka; prípad 3: Serial.println („utorok“); prestávka; prípad 4: Serial.println („streda“); prestávka; prípad 5: Serial.println („štvrtok“); prestávka; prípad 6: Serial.println („piatok“); prestávka; prípad 7: Serial.println („sobota“); prestávka; }} void loop () {displayTime (); // zobrazenie údajov hodín reálneho času na sériovom monitore, oneskorenie (1000); // každú sekundu}

Kódu môže byť veľa, ale dobre sa rozpadá na zvládnuteľné časti.

Najprv obsahuje knižnicu Wire, ktorá sa používa na komunikáciu po zbernici I2C, a potom definuje adresu zbernice pre RTC ako 0x68. Nasledujú dve funkcie, ktoré prevádzajú desatinné čísla na BCD (binárne kódované desatinné miesta) a naopak. Sú potrebné, pretože integrované obvody RTC fungujú v BCD, nie v desatinnom čísle.

Na nastavenie hodín sa používa funkcia setDS3231time (). Jeho použitie je veľmi jednoduché, jednoduché vložte hodnoty z roku na sekundu a od tohto času začne RTC. Ak napríklad chcete nastaviť nasledujúci dátum a čas - streda 26. novembra 2014 a 21:42 a 30 sekúnd - použili by ste:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Krok 3:

Čas je nastavený pomocou 24-hodinového času a štvrtým parametrom je „deň v týždni“. Čas je od 1 do 7, čo je od nedele do soboty. Tieto parametre sú bajtové hodnoty, ak nahrádzate svoje vlastné premenné.

Keď je funkcia raz spustená, je múdre ju predponovať // a znova nahrať kód, aby sa po cykle napájania alebo resetovaní mikrokontroléra neresetoval čas. Čítanie času z vášho RTC je rovnako jednoduché, v skutočnosti je možné tento proces úhľadne sledovať vo funkcii displayTime (). Na uloženie údajov z RTC budete musieť definovať sedem bajtových premenných, ktoré sa potom vložia do funkcie readDS3231time (). Ak sú vašimi premennými napríklad:

bajt sekunda, minúta, hodina, dayOfWeek, dayOfMonth, mesiac, rok;

… obnovili by ste ich aktuálnymi údajmi z RTC pomocou:

čítaťDS3232time (& sekundu, & minútu, & hodinu, & dayOfWeek, & dayOfMonth, & mesiac, & rok);

Potom môžete použiť premenné podľa vlastného uváženia, od odoslania času a dátumu na sériový monitor ako v prípade príkladu náčrtu - po prevod údajov do vhodnej podoby pre všetky druhy výstupných zariadení.

Aby ste sa presvedčili, že všetko funguje, zadajte do demonštračného náčrtu príslušný čas a dátum, nahrajte ho, okomentujte funkciu setDS3231time () a nahrajte ho znova. Potom otvorte sériový monitor a malo by sa vám zobraziť priebežné zobrazenie aktuálneho času a dátumu.

Od tohto bodu máte teraz softvérové nástroje na nastavenie údajov a ich načítanie z modulu hodín v reálnom čase a dúfame, že rozumiete tomu, ako tieto lacné moduly používať.

Viac informácií o konkrétnych integrovaných obvodoch hodín v reálnom čase nájdete na webových stránkach výrobcu-DS1307 a DS3231.

Tento príspevok vám prináša pmdway.com - všetko pre výrobcov a nadšencov elektroniky s bezplatným doručením do celého sveta.

Odporúča: