Obsah:

Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduino: 3 kroky
Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduino: 3 kroky

Video: Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduino: 3 kroky

Video: Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduino: 3 kroky
Video: Okamžitá cesta k provozním analýzám v reálném čase 2024, Listopad
Anonim
Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduinem
Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduinem
Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduinem
Použití hodinových modulů v reálném čase DS1307 a DS3231 s Arduinem

Stále dostáváme žádosti o to, jak používat moduly hodin reálného času DS1307 a DS3231 s Arduinem, z různých zdrojů-toto je tedy první ze dvoudílného tutoriálu, jak je používat. Pro tento výukový program Arduino máme k použití dva moduly hodin v reálném čase, jeden založený na modelu Maxim DS1307 (čtvercový modul) a DS3231 (obdélníkový modul).

Existují dva hlavní rozdíly mezi integrovanými obvody na modulech hodin reálného času, což je přesnost udržování času. DS1307 použitý v prvním modulu funguje velmi dobře, ale vnější teplota může ovlivnit frekvenci obvodu oscilátoru, který pohání interní čítač DS1307.

Může to znít jako problém, ale obvykle to bude mít za následek vypnutí hodin zhruba o pět minut za měsíc. DS3231 je mnohem přesnější, protože má interní oscilátor, který není ovlivněn vnějšími faktory - a je tedy přesný až na několik minut za rok. Pokud máte modul DS1307- necítíte se špatně, je to stále deska s vysokou hodnotou a bude vám dobře sloužit. U obou modulů je nutná záložní baterie.

Je vhodné koupit novou baterii CR2032 a namontovat ji do modulu. Spolu se sledováním času a data mají tyto moduly také malou EEPROM, funkci alarmu (pouze DS3231) a schopnost generovat čtvercovou vlnu různých frekvencí-to vše bude předmětem druhého tutoriálu.

Krok 1: Připojení modulu k Arduinu

Oba moduly používají sběrnici I2C, což umožňuje velmi snadné připojení.

Nejprve budete muset určit, které piny na vašich deskách Arduino nebo kompatibilních deskách jsou použity pro sběrnici I2C - ty budou známy jako SDA (nebo data) a SCL (nebo hodiny). Na deskách Arduino Uno nebo kompatibilních jsou tyto piny pro data a hodiny A4 a A5; na Arduino Mega jsou piny pro data a hodiny D20 a D21; A pokud používáte kompatibilní s Pro Mini, piny jsou A4 a A5 pro data a hodiny, které jsou rovnoběžné s hlavními piny.

Modul DS1307

Pokud máte modul DS1307, budete muset připájet vodiče k desce nebo pájet na některé vložené kolíkové kolíky, abyste mohli použít propojovací vodiče. Poté připojte piny SCL a SDA k vašemu Arduinu a pin Vcc ke kolíku 5V a GND k GND.

Modul DS3231

Připojení tohoto modulu je snadné, protože kolíky záhlaví jsou na desce nainstalovány ve výrobě. Jednoduše můžete znovu propojit propojovací kabely z SCL a SDA do Arduina a znovu z pinů Vcc a GND modulu na 5V nebo 3,3V a GND vaší desky. Pro pájení vlastních vodičů jsou však na druhé straně duplikovány. Oba tyto moduly mají požadované výsuvné odpory, takže nemusíte přidávat vlastní. Stejně jako všechna zařízení připojená ke sběrnici I2C zkuste omezit délku vodičů SDA a SCL na minimum.

Krok 2: Čtení a zápis času z vašeho modulu RTC

Jakmile zapojíte modul RTC. zadejte a nahrajte následující skicu. Ačkoli poznámky a funkce v náčrtu se týkají pouze DS3231, kód funguje také s DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Převod normálních desetinných čísel na binární kódované desetinné bajty decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Převod binárních kódovaných desetinných čísel na normální desetinná čísla byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } neplatné nastavení () {Wire.begin (); Serial.begin (9600); // zde nastavte počáteční čas: // DS3231 sekundy, minuty, hodiny, den, datum, měsíc, rok // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (bajt sekunda, bajt minuta, bajt hodina, bajt dayOfWeek, bajt dayOfMonth, bajt měsíc, byte rok) {// nastaví čas a datum na DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nastavení dalšího vstupu na začátek v sekundovém registru Wire.write (decToBcd (druhý)); // nastavení sekund Wire.write (decToBcd (minuta)); // nastavení minut Wire.write (decToBcd (hodina)); // nastavení hodin Wire.write (decToBcd (dayOfWeek)); // nastavený den v týdnu (1 = neděle, 7 = sobota) Wire.write (decToBcd (dayOfMonth)); // nastavení data (1 až 31) Wire.write (decToBcd (měsíc)); // nastavení měsíce Wire.write (decToBcd (rok)); // nastavení roku (0 až 99) Wire.endTransmission (); } void readDS3231time (byte *sekunda, byte *minuta, byte *hodina, byte *dayOfWeek, byte *dayOfMonth, byte *měsíc, byte *rok) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nastavení ukazatele registru DS3231 na 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // požadavek na sedm bytů dat z DS3231 počínaje registrem 00h *sekunda = bcdToDec (Wire.read () & 0x7f); *minuta = bcdToDec (Wire.read ()); *hodina = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *měsíc = bcdToDec (Wire.read ()); *rok = bcdToDec (Wire.read ()); } void displayTime () {byte sekunda, minuta, hodina, dayOfWeek, dayOfMonth, měsíc, rok; // načíst data z DS3231 čístDS3231time (& sekunda, & minuta, & hodina, & denOfWeek, & denOdMěsíc, & měsíc, & rok); // poslat na sériový monitor Serial.print (hodina, DEC); // při zobrazení Serial.print (":") převede proměnnou bytu na desítkové číslo; if (minuta <10) {Serial.print ("0"); } Serial.print (minuta, DEC); Serial.print (":"); if (druhý <10) {Serial.print ("0"); } Serial.print (druhý, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (měsíc, DEC); Serial.print ("/"); Serial.print (rok, DEC); Serial.print („Den v týdnu:“); switch (dayOfWeek) {case 1: Serial.println ("Sunday"); přestávka; případ 2: Serial.println („pondělí“); přestávka; případ 3: Serial.println („úterý“); přestávka; případ 4: Serial.println („středa“); přestávka; případ 5: Serial.println („čtvrtek“); přestávka; případ 6: Serial.println („pátek“); přestávka; případ 7: Serial.println („sobota“); přestávka; }} void loop () {displayTime (); // zobrazení dat hodin reálného času na sériovém monitoru, zpoždění (1000); // každou sekundu}

Může existovat mnoho kódu, ale dobře se rozděluje na zvládnutelné části.

Nejprve obsahuje knihovnu Wire, která se používá pro komunikaci po sběrnici I2C, a poté definuje adresu sběrnice pro RTC jako 0x68. Následují dvě funkce, které převádějí desetinná čísla na BCD (binárně kódovaná desetinná místa) a naopak. To jsou nezbytné, protože integrované obvody RTC pracují v BCD, nikoli v desítkové soustavě.

K nastavení hodin slouží funkce setDS3231time (). Jeho použití je velmi snadné, jednoduše vložte hodnoty od roku dolů do vteřiny a od té doby začne RTC. Pokud například chcete nastavit následující datum a čas - středa 26. listopadu 2014 a 21:42 a 30 sekund - použili byste:

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

Krok 3:

Všimněte si, že čas je nastaven pomocí 24hodinového času a čtvrtým parametrem je „den v týdnu“. To se pohybuje mezi 1 a 7, což je neděle až sobota. Tyto parametry jsou bajtovými hodnotami, pokud zadáváte vlastní proměnné.

Jakmile funkci jednou spustíte, je rozumné ji předponovat // a znovu nahrát kód, takže po cyklování napájení nebo resetování mikrokontroléru neresetuje čas. Čtení času z vašeho RTC je stejně jednoduché, ve skutečnosti lze proces úhledně sledovat uvnitř funkce displayTime (). K uložení dat z RTC budete muset definovat sedm bajtových proměnných, které se poté vloží do funkce readDS3231time (). Například pokud jsou vaše proměnné:

bajt sekunda, minuta, hodina, dayOfWeek, dayOfMonth, měsíc, rok;

… obnovili byste je aktuálními daty z RTC pomocí:

čístDS3232time (& sekundu, & minutu, & hodinu, & dayOfWeek, & dayOfMonth, & měsíc, & rok);

Pak můžete použít proměnné, jak uznáte za vhodné, od odeslání času a data na sériový monitor jako v příkladu skici - po převod dat do vhodné podoby pro všechny druhy výstupních zařízení.

Chcete -li zkontrolovat, zda vše funguje, zadejte do ukázkového náčrtu příslušný čas a datum, nahrajte jej, okomentujte funkci setDS3231time () a nahrajte jej znovu. Poté otevřete sériový monitor a mělo by vám být poskytnuto běžící zobrazení aktuálního času a data.

Od tohoto okamžiku máte nyní softwarové nástroje pro nastavení dat a jejich načítání z modulu hodin reálného času a doufáme, že rozumíte tomu, jak tyto levné moduly používat.

Další informace o konkrétních integrovaných obvodech hodin v reálném čase naleznete na webových stránkách výrobce-DS1307 a DS3231.

Tento příspěvek vám přinesl web pmdway.com - vše pro výrobce a nadšence do elektroniky s doručením zdarma po celém světě.

Doporučuje: