Tartalomjegyzék:

A DS1307 és DS3231 valós idejű óramodulok használata Arduino-val: 3 lépés
A DS1307 és DS3231 valós idejű óramodulok használata Arduino-val: 3 lépés

Videó: A DS1307 és DS3231 valós idejű óramodulok használata Arduino-val: 3 lépés

Videó: A DS1307 és DS3231 valós idejű óramodulok használata Arduino-val: 3 lépés
Videó: Урок 99. Создание цифровых часов Arduino с использованием ЖК-дисплея DS3231 и семисегментного дисплея. 2024, Július
Anonim
A DS1307 és DS3231 valós idejű óramodulok használata az Arduino segítségével
A DS1307 és DS3231 valós idejű óramodulok használata az Arduino segítségével
A DS1307 és DS3231 valós idejű óramodulok használata az Arduino segítségével
A DS1307 és DS3231 valós idejű óramodulok használata az Arduino segítségével

Folyamatosan kapunk kéréseket a DS1307 és DS3231 valós idejű óra modulok használatáról az Arduino-val különböző forrásokból-így ez az első két részből álló oktatóanyag a használatukról. Ehhez az Arduino oktatóanyaghoz két valós idejű óramodult használunk, az egyik a Maxim DS1307 (négyzet alakú modul) és a DS3231 (a téglalap alakú modul) alapján készült.

A valós idejű óra modulok IC-k között két fő különbség van, ez az időmérés pontossága. Az első modulban használt DS1307 nagyon jól működik, azonban a külső hőmérséklet befolyásolhatja a DS1307 belső számlálóját vezérlő oszcillátor áramkör frekvenciáját.

Ez problémának tűnhet, de általában azt eredményezi, hogy az óra havonta körülbelül öt percet áll le. A DS3231 sokkal pontosabb, mivel rendelkezik egy belső oszcillátorral, amelyet külső tényezők nem befolyásolnak - és így legfeljebb évente néhány percre pontos. Ha rendelkezik DS1307 modullal- ne érezze magát rosszul, ez még mindig nagy értékű tábla, és jól fog szolgálni. Mindkét modulhoz tartalék akkumulátorra van szükség.

Érdemes új CR2032 akkumulátort vásárolni és a modulhoz illeszteni. Az idő és a dátum nyomon követése mellett ezek a modulok kis EEPROM, riasztási funkcióval (csak DS3231) és különböző frekvenciájú négyzethullám generálásával is rendelkeznek-mindez egy második oktatóanyag tárgya lesz.

Lépés: Csatlakoztassa a modult egy Arduino -hoz

Mindkét modul az I2C buszt használja, ami nagyon megkönnyíti a csatlakoztatást.

Először meg kell határoznia, hogy az Arduino vagy a kompatibilis táblák mely csapjait használják az I2C buszhoz - ezeket SDA (vagy adat) és SCL (vagy óra) néven ismerik. Az Arduino Uno vagy kompatibilis táblákon ezek a tűk A4 és A5 az adatok és az óra számára; Az Arduino Mega esetében a tűk D20 és D21 az adatok és az óra számára; Ha pedig Pro Mini-kompatibilis, akkor az A4 és A5 méretű tűk adatokhoz és órához, amelyek párhuzamosak a fő csapokkal.

DS1307 modul

Ha rendelkezik DS1307 modullal, forrasztania kell a vezetékeket a táblához, vagy forrasztania kell néhány soros fejléc csapját, így használhatja az áthidaló vezetékeket. Ezután csatlakoztassa az SCL és SDA csapokat az Arduino -hoz, és a Vcc -tűt az 5 V -os, a GND pedig a GND -hez.

DS3231 modul

Ennek a modulnak a csatlakoztatása egyszerű, mivel a fejlécek a gyárilag a táblára vannak felszerelve. Egyszerűen újra futtathatja a jumper vezetékeket az SCL -ből és az SDA -ból az Arduino -ba, és ismét a modul Vcc és GND csapjaiból az alaplap 5V vagy 3.3. V és GND -jébe. Ezek azonban másolva vannak a másik oldalon a saját vezetékek forrasztásához. Mindkét modul rendelkezik a szükséges felhúzó ellenállásokkal, így nem kell hozzáadnia a sajátját. Mint minden I2C buszhoz csatlakoztatott eszköz, próbálja meg minimálisra csökkenteni az SDA és SCL vezetékek hosszát.

2. lépés: Az idő olvasása és írása az RTC modulból

Miután csatlakoztatta az RTC modult. írja be és töltse fel az alábbi vázlatot. Bár a vázlat megjegyzései és funkciói csak a DS3231 -re vonatkoznak, a kód a DS1307 -el is működik.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // A normál tizedes számok konvertálása binárisan kódolt decimális bájtra decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Konvertálja a binárisan kódolt tizedest normál tizedes számokká bájtba bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Sorozat.kezdet (9600); // itt állítsa be a kezdő időt: // DS3231 másodperc, perc, óra, nap, dátum, hónap, év // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (bájt másodperc, bájt perc, bájt óra, byte dayOfWeek, byte dayOfMonth, bájt hónap, bájt év) {// az idő- és dátumadatokat a DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS) értékre állítja; Wire.write (0); // állítsa be a következő bemenetet a másodperc regisztrációnál Wire.write (decToBcd (second)); // másodpercek beállítása Wire.write (decToBcd (perc)); // perc beállítása Wire.write (decToBcd (óra)); // órák beállítása Wire.write (decToBcd (dayOfWeek)); // a hét napjának beállítása (1 = vasárnap, 7 = szombat) Wire.write (decToBcd (dayOfMonth)); // dátum beállítása (1-31) Wire.write (decToBcd (hónap)); // a hónap beállítása Wire.write (decToBcd (év)); // set year (0 to 99) Wire.endTransmission (); } void readDS3231time (byte *másodperc, byte *perc, byte *óra, byte *dayOfWeek, byte *dayOfMonth, byte *hónap, byte *év) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Vezeték.írás (0); // állítsa a DS3231 regisztermutatót 00h Wire.endTransmission () értékre; Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // hét bájt adat kérése a DS3231 -től a 00h *second = bcdToDec (Wire.read () & 0x7f) regiszterből kiindulva; *perc = bcdToDec (Wire.read ()); *óra = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *hónap = bcdToDec (Wire.read ()); *év = bcdToDec (Wire.read ()); } void displayTime () {bájt másodperc, perc, óra, dayOfWeek, dayOfMonth, hónap, év; // adatok lekérése a DS3231 olvasásból DS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // küldje el a soros monitorra Serial.print (óra, DEC); // konvertálja a bájtváltozót tizedes számmá, ha megjelenik Serial.print (":"); if (perc <10) {Serial.print ("0"); } Soros.nyomtatás (perc, DEC); Serial.print (":"); if (második <10) {Soros.nyomtatás ("0"); } Serial.print (második, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Soros.nyomtatás ("/"); Sorozatnyomat (hónap, DEC); Soros.nyomtatás ("/"); Sorozatnyomat (év, DEC); Serial.print ("A hét napja:"); switch (dayOfWeek) {1. eset: Serial.println ("vasárnap"); szünet; 2. eset: Serial.println ("hétfő"); szünet; 3. eset: Serial.println ("kedd"); szünet; 4. eset: Serial.println ("szerda"); szünet; 5. eset: Serial.println ("csütörtök"); szünet; 6. eset: Serial.println ("péntek"); szünet; 7. eset: Serial.println ("szombat"); szünet; }} void loop () {displayTime (); // a valós idejű óra adatainak megjelenítése a soros monitoron, delay (1000); // minden másodperc }

Lehet, hogy sok kód van, de jól bontható kezelhető részekre.

Először tartalmazza a Wire könyvtárat, amelyet az I2C busz kommunikációjára használnak, majd az RTC buszcímét 0x68 -ban határozza meg. Ezeket két függvény követi, amelyek a tizedes számokat BCD-vé (binárisan kódolt decimálissá) alakítják át, és fordítva. Ezekre szükség van, mivel az RTC IC -k BCD -ben működnek, nem tizedes.

A setDS3231time () funkcióval állítható be az óra. Használata nagyon egyszerű, egyszerűen illessze be az értékeket évről másodpercre, és az RTC ettől az időponttól indul. Ha például a következő dátumot és időt szeretné beállítani - 2014. november 26., szerda és 21:42 és 30 másodperc -, akkor ezt használja:

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

3. lépés:

Vegye figyelembe, hogy az időt 24 órás időbeállítással állítják be, és a negyedik paraméter a „hét napja”. Ez 1 és 7 közé esik, azaz vasárnaptól szombatig. Ezek a paraméterek bájtértékek, ha saját változóit helyettesíti.

Ha egyszer futtatta a funkciót, akkor bölcs dolog előtaggal ellátni a // karakterrel, és újra feltölteni a kódot, így nem állítja vissza az időt, amikor a tápfeszültség ciklus vagy a mikrovezérlő visszaállítása megtörtént. Az idő leolvasása az RTC -ből ugyanolyan egyszerű, valójában a folyamat szépen követhető a displayTime () függvényben. Hét bájtos változót kell definiálnia az RTC -ből származó adatok tárolásához, majd ezeket beszúrja a readDS3231time () függvénybe. Például, ha a változók a következők:

bájt másodperc, perc, óra, dayOfWeek, dayOfMonth, hónap, év;

… Frissítené őket az RTC aktuális adataival a következők használatával:

readDS3232time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

Ezután használhatja a változókat, ahogy jónak látja, az idő és a dátum elküldésétől a soros monitorhoz, mint a példa vázlata - egészen az adatok megfelelő formába való átalakításáig mindenféle kimeneti eszköz számára.

Csak annak ellenőrzéséhez, hogy minden működik -e, írja be a megfelelő időt és dátumot a bemutató vázlatba, töltse fel, kommentálja a setDS3231time () függvényt, és töltse fel újra. Ezután nyissa meg a soros monitort, és el kell látnia az aktuális időt és dátumot.

Innentől kezdve már rendelkezésére állnak a szoftvereszközök az adatok beállításához és lekéréséhez a valós idejű óramodulból, és reméljük, hogy megérti ezeket az olcsó modulokat.

A gyártó valós idejű valós idejű órajeleit a DS1307 és a DS3231 webhelyről ismerheti meg.

Ezt a bejegyzést a pmdway.com hozta neked - mindent a gyártóknak és az elektronika rajongóinak, ingyenes szállítással világszerte.

Ajánlott: