Szinkronizálja az időt a DS3231 modulon a számítógéppel. DS3231 - valós idejű óra kapcsolat

Miért van szükség erre?

60 mp * 60 perc * 24 óra * 365 nap = 31 536 000 másodperc évente.

E milliók mindegyikéhez 2 másodperc telhet el egyik vagy másik irányba. 31,5 millió osztva egy millióval és szorozva 2-vel: évi 63 másodpercet kapunk (maximum). Elfogadható opció? Nagyon. De félévente egyszer szinkronizálnám az időt, hogy beleférjen 1 percbe.

Hogyan lehet beállítani az időt a modul óráján?

Hagyományosan, a DS3107 modultól kezdve az időt a könyvtár használati eseteiből származó Arduino vázlat segítségével állítottuk be. Az algoritmus a következő: nyissa meg a vázlatot, kattintson a "fordítás és feltöltés" gombra, és a vezérlő első indításakor beállítja az időt. A kérdés továbbra is fennáll: hány órakor? Honnan tudja az Arduino, hogy mennyi időt állítson be? És nagyon egyszerűen - a vázlat összeállításának ideje. Ennek a megközelítésnek azonban több hátrányát is látok:
  • a fordítási idő a számítógép „teljesítményétől” függ;
  • a feltöltési idő az összeállított vázlat Arduino táblára való átvitelének sebességétől függ;
  • a feltöltött vázlat „egyszeri” (közvetlenül az Arduino-ba való feltöltés után elavult).
Hogyan lehet „kikerülni” ezeket a korlátozásokat? Nos, például a fordítási idő ismeretében (kísérletileg beállítva), ekkorra már „előre lehet hajtani” a számítógép óráját. Ezután futtassa az összeállítást, villogtassa a táblát, és beállítja az időt. A módszer előnye viszonylagos egyszerűsége. Hátrányok - viszonylag kényelmetlen, viszonylag pontatlan, egyszeri módszer.

Mi másra gondolhat? A vázlatban például manuálisan beállíthatja a kívánt időt, megadhat egy gombot, amelynek megnyomásával megfelelő pillanat„kézzel” beállítja a megadott időt, például az aktuális pillanattól számított 2 perc elteltével: amíg a vázlat „betelik”, miközben a gombnyomás legmegfelelőbb pillanatának manuális követésére készülünk, éppen ez a pár perc pass. Aztán a számítógépben lévő órára nézve várja meg a gomb megnyomásának „ugyanazt” a pillanatát. Előnyök - bonyolultabb, mint az előző módszer, de még mindig viszonylag egyszerű, de pontosabb, mint az első módszer. Hátrányok - ez a módszer még kényelmetlenebb, hosszabb, még mindig "egyszeri" vázlat.

Ki a hibás és mit kell tenni?

Miután feltettem magamnak ezt a két költői kérdést, az interneten rákerestem, hogy ki írta már az óramodul időszinkronizálását a számítógéppel. És mint tudod, aki keres, az mindig talál. Talált egy lehetőséget a következővel: . Elméletileg minden egyszerű: a szokásos „batch fájl” elemzi az „első” módszerrel kapott aktuális teljes időt (mert az idő mellett a dátumra is szükség van), megnöveli az időt 2 másodperccel, és „ meghajtja” az üres ciklust, amíg ez az új meg nem jön , „plus_two_seconds”, az idő, hogy „dobjon” adatokat a COM-portba. Sőt, az „új plusz_két_másodperc” időt más módon követi nyomon (az idő%-on keresztül, ha valakit érdekel). De egy ilyen döntés „jambjairól” később. A COM portra "kidobott" adatokat az Arduino elemzi, majd beállítja az időt a modulban. Minden egyszerűnek, logikusnak és kényelmesnek tűnik. De van egy nagyon rossz szó "DE". Mindezt úgy tűnik, hogy egy német írta, és a Windows regionális szabványai eltérnek a „miénktől”, és különösen a tört részt pont választja el, nem vessző. Hazai regionális szabványokkal indítva a kötegfájl nem működik, mert abban az üres ciklusból való kilépési időt az XX:XX:XX.xxx összehasonlítási feltétel írja le. Nos, pont helyett vesszőt kell tenni – és ennyi: "Mindent javítottam". És ez még nem minden (ellenőrizheti, hogy ki emlékszik még, milyen gonoszság kötegfájlokba programozni). Komolyabban kell javítani a kötegfájlt. És javítottam a "mats-rewind" és a "manual" segítségével DOS-hoz. Javítottam a kötegfájlt, de a vázlat még mindig nem működött - az idő nincs beállítva. Vagyis adatokat küldtek a portra, az Arduino látta őket, de "valami elromlott".

Nézzük meg, mit küld a kötegfájl az Arduino-nak, és milyen formátumban (referenciaként).

83. eset: //S = 68. második eset: //D = perc (perzsa nyelven Daghigheh) 72. eset: //H = 84. óra eset: //T = hónap napja (németül címke) 77. eset: /// M = 74. hónap eset: /// J = év (Jahr németül)
Az adatok S**~D**~H**~T*~M**~J****~ formátumban kerülnek elküldésre, ahol a ~ 2 kocsivisszaadási bájt. Összesen 31 bájt. Kicsit úgy tűnik, gyorsan elküldik az adatokat.

Van azonban egy kellemetlenség is - amint látja, a hét napját nem küldik el. Csak a hónap napja. A hét napjaitól függő ébresztőórák megvalósításához egy „tüske” lesz. A hét napját „fogantyúkkal” kell beállítani a vázlatban, ami ismét valamilyen „egyszeri” vázlatra, annak alsóbbrendűségére utal.

Összeadva a tényezőket - a "gyári" vázlat alsóbbrendűsége, a normál működés megtagadása, a "kötegelt fájl" kijavításának szükségessége a "mi" szélességi fokokhoz - úgy döntöttem, hogy mindent saját magam fejlesztek. És ha igen, akkor kiküszöbölhetem a hiányosságokat és optimalizálhatom az adatformátumot.

Szoftver és hardver.

Ahhoz, hogy minden működjön, 2 komponens kell: egy Windows-os program és egy Arduino hardver-szoftver köteg.

Először is, általános adatok a csereprotokollról. Mivel szabadon választhattam meg a küldés adatformátumát, úgy döntöttem, hogy 31 bájtnyi információ küldése nem racionális, és a továbbított adatot 4 bájtra csökkentettem. És mi volt elég? Mi fér bele 4 bájtba? Igen, ez elég. Minden a helyén van, amire szüksége van. Biztosan sokan kitalálták, mi az a 4 bájt. Aki nem sejtette, idézek egy cikk töredékét a Wikipédiából:

UNIX idő (POSIX idő) - az időpillanatok leírására szolgáló rendszer, UNIX-ban és más POSIX-kompatibilis rendszerben operációs rendszer. Az 1970. január 1-je (csütörtök) éjfél (00:00:00 UTC) óta eltelt másodpercek száma.
A UNIX-idő egész számként jelenik meg, amely minden másodperccel növekszik anélkül, hogy számításokra lenne szükség az év, hónap, nap, óra vagy perc meghatározásához az emberi olvashatóság érdekében. A modern UNIX idő összhangban van az UTC-vel – a visszaszámlálás SI másodpercben történik.

Tehát egy UNIX-időt tároló egész szám 4 bájtot vesz igénybe, ami akár 2 147 483 648 másodpercig elegendő. És akkor lehetséges potencionális problémák. Miért potenciális? Mert ez az a küszöb, amelynél a szám Talán negatívnak kell értelmezni (mint sok kíváncsi elvtárs iPhone-ja egy időben). Lehet, de nem feltétlenül – ez attól függ, hogy a programozók keze kinő-e a természet adta helyről. A megadott másodpercek száma 2038. január 19-én 03:14:08-nak felel meg. Addig is lassan át lehet váltani az operációs rendszer 64 bites verziójára, ahol egy 8 bájtos változóban tárolódik az idő, ami a következő 292 milliárd évre is gond nélkül elegendő lesz. Lehetséges, hogy ez életünkre elég lesz. Ezután frissítenie kell a UNIX 128 bites verziójára.

Milyen problémákat oldottam meg azzal, hogy ezt a lehetőséget választottam? Először is jelentősen csökkentettem a továbbított bájtok számát, ami ezredmásodpercekkel növeli az időbeállítás pontosságát. Ez nagyszerű, igaz? Másodszor pedig (valószínűleg) megkönnyítettem a Linux kompatibilitást. Szégyenemre nem tudom megszokni a Linuxot, és többnyire csak Windowst használok. Ugyanerre a Windowsra tudok továbbítót írni, de Linuxra nem. De úgy gondolom, hogy Linuxban sokkal könnyebben megkaphatja a UNIX idő értékét, mint a Windowsban, és elküldheti ezt a számot a COM portra.

Egyik sem további adatokat, például a hét napjait és így tovább, nem kell továbbítani. Csak UNIX idő. Minden más Arduino-ban történik.

Most egy kis konkrétumot közvetlenül a első komponens - egy program a Windows számára. A program a jó öreg Delphiben van megírva. Indításkor egy felugró ablak kéri, hogy válasszon COM portot az adatok küldéséhez. Választ. A többi beállítást alapértelmezetten kell hagyni.

Hogyan működik a program? Az időformátumból újraszámol Windows adatok UNIX formátumra, vagyis 1970. január 1. éjfél óta eltelt másodpercek száma. Ezután hozzáad 3 másodpercet, és "beesik" egy üres hurokba (nyilván kevesebb, mint az a plusz 3 másodperc), amelyből a kilépés a szükséges másodpercek alatt, a lehető legközelebb 000 ezredmásodpercben történik. Más szóval, a második idő kezdetének kezdetét figyelik, amelynek értékét el kell küldeni az Arduinónak. Egyetért azzal, hogy nem lenne helyes olyan adat küldése, hogy például most XXXXXXXXX5 másodperc, miközben valójában már például XXXXXXXXX5 és 756 ezred (például) másodperc. Ezért az adatátvitel megkezdéséhez követnie kell a második legelejét. Az adatátvitel után a program barátságosan "Kész:)" állapotot jelez. Ezzel lezárult a program küldetése.


Második komponens - hardver-szoftver rész - Arduino. 2 van fajták hardver ehhez a projekthez: "teljes" verzió képernyővel és gombbal, valamint "csupaszított" verzió gyors telepítés modulidő, "szarból és botokból" összerakva. A különbségeket lásd alább. A "teljes" verzió egy Arduino Nano-ból, egy 1602-es pajzsból, egy I2C árnyékoló "adapterrel", egy opcionális Arduino reset gombból és egy tűfejből (anya) áll az óramodul csatlakoztatásához. Valamint opcionálisan a készülék testéről egy "cuki" matricával. A "lecsupaszított" verzió egy Arduino-ból (Uno, Nano, Pro Mini + a "helyes" USB-hez DTR-el) és 4 vezetékből áll az óramodul csatlakoztatásához.



Amint az az ábrákon látható, a „teljes” változat a „csonka” mellett egy reset gombot és egy „adapterrel” ellátott 1602-es képernyőt is tartalmaz.Mindkét verzió a fő funkcionalitást tekintve teljesen megegyezik - a A képernyő csak a folyamat szakaszainak megjelenítéséhez szükséges, és az időbeállítási folyamat végén a frissen beállított idő, dátum és a hét napjának megjelenítéséhez. magából az óramodulból olvassa le.A "csonka" változatban az Arduino kártyába épített LED képernyőként működik: az új idő beállítási folyamatának végén világítani kezd. Ez az egész jelzés.

Mire való a reset gomb? Azért, ami benne van teljes verzió az idő beállítása után az Arduino egy végtelen ciklusba lép, hogy megjelenítse azt a nagyon frissen beállított időt, vagyis valójában egy óra lesz. Sőt, órák készült sietősen, mellyel kapcsolatban több okból sem tudják majd kicserélni a normál órát (a másodpercek kiválasztása késleltetéssel valósul meg, az idő kijelzése az áram kikapcsolásakor eltűnik). Hiszen a cél az, hogy az idő helyesen legyen szinkronizálva, semmi több. Ezért a következő óramodul szinkronizálásához nem nélkülözheti a visszaállítást (pontosabban megteheti, ha „torzítja” USB kábel). Más szóval, a gomb célja tisztán haszonelvű. Ha akarod, megteheted nélküle is.

Hogyan lehet flashelni az Arduino-t, mert a hardvernek két verziója van, és egy vázlat? A „helyes” firmware-verzió összeállításához be kell állítani a kívánt paraméterértéket a vázlatfejlécben teljes verzió: igaz a "teljes" verzióhoz, ill hamis - "csonka"-ra. A fordító tehát meghatározza, hogy melyik hardververzióhoz fordítsa le a firmware-t.

Tehát van egy kapcsolási rajz, kell egy vázlatkód. Kérjük, vegye figyelembe, hogy a normál működés a "teljes" verziójú vázlathoz könyvtár kell LiquidCrystal I2Círta: Frank de Brabander(telepítve a tárból a Library Manager segítségével). Az óramodult támogató könyvtár is kell, és nem is akármilyen :). Töltse le itt: . A könyvtárakkal foglalkoztunk.

Íme a vázlat kódja:

//====================================== módosítható beállítás === = ==================================== #define fullVersion true //true = "teljes" verzió képernyővel ; false = "csupaszított" verzió beépített LED-del //================================= Használt és változó könyvtárak nyilatkozatok = ================================= #include #beleértve #ha (fullVersion) #include #endif előjel nélküli hosszú t1 = 0; //változó a vételi időre előjel nélküli long t2 = 0; //változó a fogadott időbájthoz; // puffer az adatok fogadásához COM port#if (fullVersion) byte day = 0; #endif DS3231 óra; RTCDateTime dátum1; #if (teljesVerzió) LiquidCrystal_I2C lcd(0x3F,16,2); //A kínaiak szerették az i2c-ből a képernyőre mutató „adapterek” új címét #endif //============================== = ================================================== ================================ void setup()( #if (!fullVersion) //csak a következőre vonatkozik csonka" verzió - a kódszakasz eleje pinMode(13, OUTPUT); digitalWrite(13,LOW); #endif //csak a "csonkított" verzióra vonatkozik - a kódszakasz vége clock.begin(); Serial .begin(9600); #if (fullVersion) //csak a "teljes" verzióra vonatkozik - a kódszakasz eleje lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd .print("COMport 9600 8N1"); //tipp, hogy mely COM port paramétereket kell kiválasztani a programban lcd.setCursor(0,1); lcd.print("Szinkronizálásra kész"); //állapotüzenet - készen áll a szinkronizálásra delay(1000); #endif //csak a "teljes" verzióra vonatkozik - a kódszakasz vége ) void loop()( if (Serial.available())( //ha "puskapor van a lombikban" a COM port Serial.readBytes(b,4); //mind a 4 bájt beolvasása (nem várunk mást) t1 =b; t2=(t1<<24); //поместить значение байта в 4-байтную переменную и передвинуть его на 3 байта влево t1=b; t2+=(t1<<16); //поместить значение байта в 4-байтную переменную и передвинуть его на 2 байта влево t1=b; t2+=(t1<<8); //поместить значение байта в 4-байтную переменную и передвинуть его на 1 байт влево t2+=b; //поместить значение байта в 4-байтную переменную clock.setDateTime(t2); //установить полученное время на DS3231 #if (fullVersion) //актуально только для "полной" версии - начало участка кода lcd.clear(); lcd.setCursor(0,0); lcd.print("Done:) : :"); while (true){ //начало бесконечного цикла по отображению свежеустановленных времени и даты dat1 = clock.getDateTime(); if (dat1.day != day){ day = dat1.day; lcd.setCursor(0,1); if (dat1.day < 10) lcd.print("0"); lcd.print(day); lcd.print("-"); switch (dat1.month){ //выбираем буквенное соответствие месяца по цифре case 1:{ lcd.print("Jan"); break; } case 2:{ lcd.print("Feb"); break; } case 3:{ lcd.print("Mar"); break; } case 4:{ lcd.print("Apr"); break; } case 5:{ lcd.print("May"); break; } case 6:{ lcd.print("Jun"); break; } case 7:{ lcd.print("Jul"); break; } case 8:{ lcd.print("Aug"); break; } case 9:{ lcd.print("Sep"); break; } case 10:{ lcd.print("Oct"); break; } case 11:{ lcd.print("Nov"); break; } case 12:{ lcd.print("Dec"); break; } default:{ lcd.print("???"); break; } }//switch month lcd.print("-"); lcd.print(dat1.year); lcd.print(" "); switch(dat1.dayOfWeek){ //выбираем буквенное соответствие дня недели по цифре case 1:{ lcd.print("Mon"); break; } case 2:{ lcd.print("Tue"); break; } case 3:{ lcd.print("Wed"); break; } case 4:{ lcd.print("Thu"); break; } case 5:{ lcd.print("Fri"); break; } case 6:{ lcd.print("Sat"); break; } case 7:{ lcd.print("Sun"); break; } default:{ lcd.print("???"); break; } }//switch dayOfWeek }//if date changed lcd.setCursor(8,0); if (dat1.hour < 10) lcd.print("0"); lcd.print(dat1.hour); lcd.setCursor(11,0); if (dat1.minute < 10) lcd.print("0"); lcd.print(dat1.minute); lcd.setCursor(14,0); if (dat1.second < 10) lcd.print("0"); lcd.print(dat1.second); delay(995); }//while #else //актуально только для "урезанной" версии - начало участка кода digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); #endif //актуально только для "полной" версии - конец участка кода }//if Serial }//loop


Pár fotó a kész készülék "teljes" verziójáról.


És végül egy videó a készülék működéséről:

Honnan tudom letölteni a vázlatot és a programot?

Vázlat letöltése (Dropbox).
Töltse le a programot Windowshoz (Dropbox).

"Előnyök és hátrányok".

Ebben az esetben nehéz megfogalmazni az "előnyöket" és a "hátrányokat". Ezért mindenki maga dönti el, mi a jó és mi a rossz.

Teljes.

Nagyon tetszett, ahogy most modulokban van beállítva az idő! Ha be kell állítani az időt, akkor nem kell minden alkalommal emlékeznem arra, hogy milyen vázlatra van szükségem, és arra gondolnom, hogy a modulban milyen pontosan lesz beállítva az idő. Sőt, hamarosan lesz egy ismertető a házi készítésű órákról is, ahol beépítettem egy ilyen szinkronizálási módszert - nagyon tetszett a módszer. Remélem az olvasók egy része is jól jön majd.

A projekt ingyenes, nem kereskedelmi. Mindenkinek joga van a felülvizsgálatból származó adatokat a kereskedelmi céltól eltérő célra felhasználni.

Minden rendben.

+48 vásárlását tervezem Add hozzá a kedvencekhez Tetszett a vélemény +60 +114

A DS3231 egy nagy pontosságú valós idejű RTC óra, amely beépített hőmérséklet-kompenzált kristályoszcillátorral rendelkezik, ami évente mindössze ±2 perces driftet eredményez. Ezen kívül ébresztőóra funkció van megvalósítva, van megszakítási kimenet is. Az óra Arduino-hoz kész modulként vásárolható meg pántos elemekkel és elemtartóval.

Itt rendeltem meg a modult. A diagram az alábbi képen látható:


A chip a széles körben használt . A szabványos (100 kHz) és a magas (400 kHz) adatátviteli sebességek támogatottak. A chip címe (7 bit) az I2C buszon 1101000. Ezenkívül a modul rendelkezik I2C memóriával (24C32), amely nem látható a diagramon.

Energiagazdálkodási módok

A mikroáramkör tápfeszültsége 2,3 ... 5,5 V tartományban lehet, két tápvezeték van, külső forráshoz (Vcc vonal), valamint akkumulátorhoz (Vbat). A külső forrás feszültségét folyamatosan figyelik, amikor a Vpf=2,5V küszöb alá csökken, átkapcsol az akkumulátor vezetékre. Az alábbi táblázat az elektromos vezetékek közötti váltás feltételeit mutatja be:

Az óra pontosságát a környezeti hőmérséklet figyelésével tartják fenn. A mikroáramkör elindít egy belső eljárást az óragenerátor frekvenciájának beállítására, a beállítás mértékét a frekvencia hőmérséklettől való függésének speciális grafikonja határozza meg. Az eljárás a bekapcsolás után kezdődik, majd 64 másodpercenként lefut.

A töltés megtakarítása érdekében, amikor az akkumulátor csatlakoztatva van (feszültség van a Vbat vezetékre), az óragenerátor addig nem indul el, amíg a Vcc vonal feszültsége nem haladja meg a Vpf küszöbértéket, vagy az I2C interfészen keresztül a helyes chipcímet továbbítják. . Az óragenerátor indítási ideje kevesebb, mint egy másodperc. Körülbelül 2 másodperccel a tápfeszültség (Vcc) bekapcsolása vagy az I2C interfészen keresztüli cím fogadása után elindul a frekvenciakorrekciós eljárás. Miután az óragenerátor elindult, tovább működik, amíg a Vcc vagy a Vbat jelen van. Az első bekapcsoláskor a dátum- és időregiszterek alaphelyzetbe állnak, és a következő értékeket mutatják: 01/01/00 - 01 - 00/00/00 (nap/hónap/év/ - a hét napja - óra/perc/másodperc ).

Az áramfelvétel 3,63 V-os akkumulátorral 3 μA, az I2C interfészen keresztüli adatátvitel hiányában. A maximális áramfelvétel elérheti a 300 uA-t külső 5,5 V-os tápegység és magas I2C adatátviteli sebesség használata esetén.

Külső reset funkció

Az RST vonal külső resetre használható, és alacsony feszültségű riasztási funkcióval is rendelkezik. A vezetéket egy belső ellenálláson keresztül magasra húzzák, nincs szükség külső felhúzásra. A külső reset funkció használatához az RST vonal és a közös vezeték közé egy nyomógomb csatlakoztatható, a mikroáramkör érintkezéspattanás elleni védelemmel rendelkezik. A riasztási funkció akkor aktiválódik, ha a Vcc tápfeszültség a Vpf küszöbérték alá esik, miközben az RST vonal lecsökken.

A regiszterek leírása DS3231

Az alábbi táblázat a valós idejű óraregiszterek listáját mutatja:

CímD7D6D5D4D3D2D1D0Funkcióhatárait
0x000 10 másodpercMásodpercekMásodpercek00-59
0x010 10 percpercekpercek00-59
0x020 12/24 DÉLELŐTT DÉLUTÁN10 óraÓraNéz1-12 + AM/PM vagy 00-23
10 óra
0x030 0 0 0 0 NapA hét napja1-7
0x040 0 10. számSzámdátum01-31
0x05Század0 0 10 hónapHónapHónapok/század01-12 + Század
0x0610 évÉvévek00-99
0x07A1M110 másodpercMásodpercekMásodpercek, 1. riasztás00-59
0x08A1M210 percpercekPercek, 1. riasztás00-59
0x09A1M312/24 DÉLELŐTT DÉLUTÁN10 óraÓraÓra, 1. ébresztő1-12 + AM/PM vagy 00-23
10 óra
0x0AA1M4DY/DT10. számNapA hét napja, 1. riasztás1-7
SzámDátum, 1. riasztás01-31
0x0BA2M210 percpercekPercek, 2. riasztás00-59
0x0CA2M312/24 DÉLELŐTT DÉLUTÁN10 óraÓraÓra, 2. ébresztő1-12 + AM/PM vagy 00-23
10 óra
0x0DA2M4DY/DT10. számNapA hét napja, 2. riasztás1-7
SzámDátum, 2. riasztás01-31
0x0EEOSCBBSQWCONVRS2RS1INTCNA2IEA1IERegisztrálja a beállításokat (vezérlés)
0x0FOSF0 0 0 EN32kHzBSYA2FA1FÁllapotnyilvántartás (Status)
0x10JELADATADATADATADATADATADATADATAging Offset Register
0x11JELADATADATADATADATADATADATADATHőmérsékletregiszter magas bájtja
0x12ADATADAT0 0 0 0 0 0 Hőmérsékletregiszter alacsony bájtja

Az időinformáció bináris decimális formátumban kerül tárolásra, vagyis a decimális szám minden egyes számjegyét (0-tól 9-ig) egy 4 bitből álló csoport képviseli. Egy bájt esetén az alacsony nibble egyeseket, a magas tízeseket, stb. 0x00-0x06 címû regiszterekben számolja az idõt, az órák számlálásához választhat 12 órás vagy 24 órás módot. Az óraregiszter 6. bitjének beállítása (0x02 cím) beállítja a 12 órás üzemmódot, melyben az 5. bit a napszakot jelöli, az 1-es érték a dél utáni időt (PM), a 0 a délt ( AM). A 6. bit nulla értéke a 24 órás módnak felel meg, itt az 5. bit vesz részt az órák számlálásában (20-23 értékek).

A hét napjai regiszter éjfélkor növekszik, 1-től 7-ig számolva, a hónap regiszter (0x05 cím) tartalmazza a Century bitet (7. bit), amely az évszámláló regiszter (0x06 cím) túlcsordulásakor vált át, 99-ről 00-ra. .

A DS3231 chipnek két riasztása van, az 1. riasztás 0x07-0x0A címû regiszterekkel van konfigurálva, a 2. riasztás 0x0B-0x0D regiszterekkel. Az A1Mx és A2Mx bitek különböző módokat állíthatnak be a riasztásokhoz, a bit beállítása kizárja a megfelelő regisztert az összehasonlítási műveletből. Az alábbi táblázatok a különböző riasztási módok bitkombinációit mutatják be:

A táblázatokban fel nem sorolt ​​bitkombinációk az ébresztőórák hibás működéséhez vezetnek. Ha a DY/DT bit tiszta, akkor a riasztás dátumegyezését figyeli (a hónap napja), a DY/DT bit beállításakor pedig a hét napjának egyezését ellenőrzi.

A legtöbb funkció a Control regiszterben van konfigurálva. Az EOSC bit vezérli az óragenerátor indítását, a bit törlése pedig elindítja a generátort. A bit beállítása leállítja a generátort, csak akkumulátoros üzemmódban (Vbat). Ha külső forrásról (Vcc) táplálja, az oszcillátor mindig működik, függetlenül az EOSC bit állapotától. Az engedélyezés után a bit alapértelmezett értéke 0.

A BBSQW bit beállítása lehetővé teszi az INT/SQW kimenet (3. érintkező) akkumulátoros üzemmódban történő működését, amikor nincs külső tápellátás. Ha a bit nulla, az INT/SQW kimenet a 3. állapotba kerül (deaktiválva), ha a külső forrás Vcc feszültsége a Vpf küszöb alá esik. Bekapcsolás után a bit alapértelmezett értéke 0.

A CONV bit felelős a kényszerített hőmérsékletmérésért, a bit beállítása elindítja az átalakítási folyamatot, melynek során az órajel frekvenciáját is beállítják, a mérési eredmény 0x11, 0x12 című regiszterekben van. Indítás csak akkor lehetséges, ha az előző átalakítás befejeződött, indítás előtt ellenőrizni kell a BSY foglalt jelzőt. A kényszerített hőmérséklet-átalakítás nincs hatással a belső 64 másodperces frekvenciabeállítási ciklusra. A CONV bit beállítása nem befolyásolja a BSY jelzőt 2 ms-ig. A CONV és BSY bitek automatikusan alaphelyzetbe állnak az átalakítás befejezése után.

Az RS2, RS1 bitek beállítják a téglalap alakú impulzusok (meander) frekvenciáját az INT/SQW kimeneten. Alapértelmezés szerint, ha engedélyezve van, a bitek 1-re vannak állítva. Az alábbi táblázat a bitek lehetséges kombinációit mutatja:

Az INTCN bit vezérli az INT/SQW kimenetet. Ha a bitet alaphelyzetbe állítjuk, a kimeneten téglalap alakú impulzusok (meander) jelennek meg, melyek frekvenciáját az RS2, RS1 bitek állítják be. Ha az INTCN bit be van állítva, a kimenet riasztási megszakításokat generál. Alapértelmezésben a bit értéke 1. Az INT/SQW kimeneti típus nyitott leeresztő, ezért ellenálláson keresztül kell felhúzni egy magas logikai szintre, az aktív szint alacsony.

Az A1IE, A2IE beállítási bitek lehetővé teszik az 1. és a 2. riasztási megszakítást. Reset bitek, letiltja a megszakításokat. Az alapértelmezett érték 0.

Az állapotregiszter tartalmazza az eseményjelzőket és vezérli a 32 kHz-es kimenetet. Az OSF zászló az óragenerátor állapotát tükrözi, az 1-es érték azt jelenti, hogy a generátor leállt, ez az esemény a következő esetekben fordulhat elő:

  • Bekapcsolás után először
  • Az akkumulátor vagy a külső feszültség nem elegendő az óragenerátor működtetéséhez
  • A generátor kikapcsolása az EOSC bit akkumulátoros üzemmódba állításával történik
  • A kristályoszcillátort befolyásoló külső tényezők (zaj, szivárgás stb.)

Beállítás után a bit értéke nem változik, manuálisan kell visszaállítania a bitet.

Az EN32kHz bit beállítása lehetővé teszi téglalap alakú impulzusok (meander) generálását a 32kHz-es kimeneten (1. érintkező), az impulzusfrekvencia 32,768 kHz-en van rögzítve. A bit visszaállítása letiltja ezt a funkciót, és a kimenetet a 3. állapotba állítja (nagy bemeneti impedancia). A bit alapértelmezett értéke 1, a tápfeszültség bekapcsolása után impulzusok jelennek meg a kimeneten. A 32kHz-es kimenet nyitott leeresztő, ezért felhúzás szükséges.

A BSY foglalt jelző a hőmérséklet-átalakítás és az órabeállítás folyamata során kerül beállításra. A jelző alaphelyzetbe áll, amikor az átalakítás befejeződött.

Az A1F, A2F riasztási zászlókat akkor állítjuk be, ha az időszámláló és az ébresztőóra regiszterek értékei megegyeznek. Ha az A1IE, A2IE riasztási megszakítások engedélyezve vannak, és megszakítási kimenet van hozzárendelve (az INTCN bit be van állítva), akkor az INT/SQW kimeneten megszakítási jel jelenik meg (átmenet magasról alacsony logikai szintre). A zászlókat manuálisan kell visszaállítani egy 0 érték beírásával.

Az Aging Offset regiszter az óragenerátor frekvenciájának beállítására szolgál. A regiszterérték hozzáadódik az oszcillátor frekvenciájához a belső beállítási eljárás során, ha hőmérsékletváltozást észlel, és akkor is, ha a hőmérséklet-átalakítást a CONV bit váltja ki. Az eltolási érték előjeles, azaz a pozitív értékek (1-127) csökkentik a frekvenciát, a negatív értékek (128-255) növelik. Ugyanazon eltolás esetén a frekvenciaváltozás a hőmérséklettől függően eltérő lesz. +25°C-on a frekvenciaváltozás 0,1 ppm/LSB lesz.

Az aktuális hőmérsékleti értéket 0x11 és 0x12 címmel, magas és alacsony bájttal rendelkező regiszterek tárolják, a regiszterekben lévő hőmérsékleti értékeket pedig rendszeresen frissítik. A balra igazítás be van állítva, a felbontás 10 bit vagy 0,25°C/LSB, vagyis a magas bájt tartalmazza a hőmérséklet egész részét, az alsó regiszterek 6., 7. bitje pedig a tört részt. A magas bájtban a 7. bit a hőmérséklet előjelét jelzi, például a 00011011 01 érték +27,25 °C hőmérsékletnek, az 11111110 10 érték -2,5 °C-nak felel meg.

Az időszámláló regisztereinek leolvasásakor ajánlatos kiegészítő puffert használni, vagyis egyszerre több regisztert olvasni, és nem külön-külön, hiszen a külön olvasási műveletek között az időregiszterek értékét változtathatják. Ez a szabály akkor is javasolt, ha új adatokat írunk a számlanyilvántartásba. A másodpercregiszterbe új érték írása 1 másodpercre szünetelteti az órát, a többi regisztert ezalatt felül kell írni.

A DS3231 csatlakoztatása a mikrokontrollerhez

Az órát a PIC16F628A mikrokontrollerhez csatlakoztattam, használt. A csatlakozási rajz az alábbiakban látható:


A tápfeszültség bekapcsolása után szaggatott jelek (- - - - - -) jelennek meg a kijelzőkön, majd az óra inicializálása megtörténik, az időérték 1 másodperces késleltetéssel jelenik meg a kijelzőkön, ami az óragenerátor indításához szükséges. Az indikátorok az órák, percek és másodpercek értékét jelenítik meg, tizedesvesszővel elválasztva, az idő formátuma 24 óra. Az SB1 „Indication” gombbal módosítható a megjelenítési formátum, ahol a jelzők a hőmérsékletet, valamint az órák és percek értékét jelenítik meg, tizedesvesszővel elválasztva, amely 2 Hz-es frekvenciával villog. A hőmérséklet tört rész nélkül jelenik meg, csak a 0x11 címen lévő hőmérséklettároló magas bájtját olvassa be a program.

Az SQW/INT vonalon az 1. riasztási jellel vezérelt megszakítással az órából az időértéket olvassa ki, az óra inicializálása során az ébresztés másodpercenként van beállítva. A HL1 LED jelzőfényként szolgál, és másodpercenként villog egy megszakítási jelre. A HL2 LED az I2C interfészen keresztüli adatátviteli hiba esetén világít.

Ezenkívül hozzáadtuk a programhoz az óra beállítását az SB2 „Setting”, SB3 „Installation” gombokkal. A beállítási módba az SB2 gomb megnyomásával léphetünk be, a visszajelzők 00 órát mutatnak, percek és másodpercek helyett kötőjelek (00 - - - -). Az SB3 gomb beállítja az óra értéket (minden megnyomással növekszik), majd az SB2 gomb megnyomásával percek szerkesztésére váltunk, kötőjel helyett 00 perc jelenik meg. Az SB3 gomb is beállítja a kívánt értéket stb. A másodpercek szerkesztése és az SB2 gomb megnyomása után az órában kifejezett idő felülírásra kerül, a frissített idő megjelenik a kijelzőkön.

A program hiányos kódja az alábbiakban található (a teljes verzió letölthető a cikk végén):

;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;;;; #beleértve LIST p=16F628A __CONFIG H"3F10" ;MCU konfigurációs hibaszint -302 ;nem ad ki 302-es hibaüzenetet a listában Sec equ 0020h ;segédszámláló regiszterek Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h ;Segéd bitszámláló regiszter perem equ 0025h ;Segédregiszter bájtok fogadására/továbbítására spi-n keresztül, i2c temp equ 0026h ;Hőmérséklet regiszter perem_1 equ 0027h ;Segéd regiszter a BCD konverzióhoz eredmény equ 0028h ;BCD segédregiszter dat_ind equ 0029h ;adatregiszter spi átvitelhez adr_ind equ 002Ah ;címregiszter spi átvitelhez second equ 002Bh ;másodperc regiszter az idő beállításához perc equ 002Ch ;perc regiszter az időbeállításhoz óra equ 002Dh ;perc regiszter az időbeállításhoz óra equ 002Dh ; i2c adatátviteli rutin regiszterek tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;jelző regiszter #DEFINE int PORTB,0 ;megszakítás vonal INT/SQW ;sc. SCL vonal DS3231 kapcsolathoz #DEFINE sda_io TRISB,1 ;SDA vonalirány #DEFINE scl_io TRISB,2 ;SCL vonal iránya #DEFINE datai PORTB,5 ;MAX7219 illesztőprogram adatbeviteli sor #DEFINE cs PORTB ,6 ;illesztőprogram-választó vonal MAX7219 #DEFINE clk PORTB,7 ;a MAX7219 illesztőprogram órajelsora #DEFINE led PORTB,4 ;i2c hiba LED #DEFINE led_sec PORTB,3 ;órajelző LED 1Hz #DEF INE regim PORTA,2 ;Jelzőgomb - kijelzési mód váltása #DEFINE nast PORTA,3 ;Beállító gomb - időbeállítási módba lépés #DEFINE ust PORTA,4 ;Beállítás gomb - óra ​​értékének beállítása;;;;;;;;; ;;;;;;;;;;;; ; ;;;;;;;;;;;;;; org 0000h ;programvégrehajtás indítása a címről 0000h goto Start ;ugrás a Start címkére ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;; ;Fő program indítása movlw b"00000000" ;A port beállítása kimeneti reteszelések movwf PORTA ; movlw b"01000000" ;Állítsa be a B port kimeneti reteszértékeit movwf PORTB ; movlw b"00000111" ;komparátorok letiltása movwf CMCON ; bsf STATUS,RP0 ;az 1. bank kiválasztása movlw b"00000111" ;konfigurálja a B port I/O vonalait movwf TRISB ;RB0-RB2 - bemenet, egyéb - kimenet movlw b"11111111" ;konfigurálja a TRISA port I/O vonalait movwf ;minden bemeneti sor bcf STATUS,RP0 ;a 0. bank kiválasztása clrf jelző ;reset flags register call init_lcd ;hívás illesztőprogram inicializálási alprogramja (MAX7219) viv_not hívása ;kötőjel szimbólumok megjelenítése " ------" ;; ;;;;;; ;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;;; movlw b"11010000" ;Eszköz címe (DS3231) movwf slave_adr ;Írjon 4 bájtot vételi/átviteli regiszterekbe az i2c-n keresztül ;Az 1. riasztás beállítása itt, minden második sípolás movlw data_i2c ;Az első vételi/átviteli regiszter beállítása az FSR-n keresztül; movlw b"10000000" ;adatok az 1. riasztási másodperchez regiszter movwf INDF ; incf FSR,F ; movlw b"10000000" ;az 1. riasztás jegyzőkönyvének adatai movwf INDF ; incf FSR,F ; movlw b"10000000" ;adatok az 1. riasztás óraregiszteréhez movwf INDF ; incf FSR,F ; movlw b"10000000" ;adatok az 1. riasztás dátum/hétnap nyilvántartásához movwf INDF ; movlw . 4 ;átvitel 4 bájt i2c-n keresztül movwf tmp_i2c ; movlw 0x07 ;állítsa be az 1. riasztás másodpercregiszterének címét movwf adr_i2c ; write_i2c hívása ;írási szubrutin hívása i2c interfészen keresztül err_prov hívása ;I2C írási/olvasási hibák ellenőrzése movlw .1 ;1. bájt átvitele i2c-n keresztül movwf tmp_i2c ; movlw 0x0E ;regisztercím beállítása Control movwf adr_i2c ; movlw data_i2c ;az első i2c vételi/átviteli regiszter beállítása movwf FSR ; movlw b"00000101" ;Indítási óra, letiltja az INT/SQW érintkezőt a movwf INDF-hez ;Akkumulátor üzemmód, INT/SQW pulzusszám 1Hz, 1. ébresztőóra hívása write_i2c ;az írási szubrutin hívása i2c interfészen keresztül call errckre forad2C ; hibák met_2 movlw .1 ;az 1. bájt átvitele i2c-n keresztül movwf tmp_i2c ; movlw 0x0F ; Állapotregiszter cím beállítása movwf adr_i2c ; movlw data_i2c ;az első i2c vételi/átviteli regiszter beállítása movwf FSR ; movlw b"00000000" ;OSF bit alaphelyzetbe állítása, impulzusok generálásának letiltása EN32kHz kimeneten, movwf INDF ;riasztásmegszakítási jelzők alaphelyzetbe állítása A2F, A1F hívás write_i2c ;írási szubrutin hívása i2c interfészen keresztül err_prov hívása err_prov ;ellenőrzés a b2c beírásában/readttfs lekérdezés riasztás megszakítás vonal goto met_3 ; bsf led_sec ;az órajelző LED bekapcsolása goto met_4 ; met_3 bcf led_sec ;az órajelző LED kikapcsolása btfsc nast ;az órabeállító gomb lekérdezése goto met_5 ; call nast_time , hívásidő beállítási szubrutin goto met_2 ; met_5 btfsc regim ;poll display mode button goto met_1 ; met_6 hívás pause_knp ; btfssregim ; goto met_6 ; btfss flag,2 ; módosítsa a megjelenítési mód jelző értékét goto met_7 ; bcf flag,2 ;reset display flag, óra megjelenítési mód goto met_1 ; met_7 bsf flag,2 ; állítsa be a kijelzési jelzőt, a hőmérséklet és az óra kijelzési módot goto met_1 ; met_4 movlw .1 ;az 1. bájt átvitele i2c-n keresztül movwf tmp_i2c ; movlw 0x11 ;állítsa be a felső hőmérsékletregiszter címét movwf adr_i2c ; hívás read_i2c ;hívás I2C olvasási rutin hívás err_prov ;I2C írási/olvasási hibák ellenőrzése movf INDF,W ;hőmérséklet érték másolása a temp regiszterbe movwf temp rd_time movlw .3 ;3 bájt átvitele i2c-n keresztül movwf tmp_i2c ; movlw 0x00 ;másodpercnyi regisztrációs cím beállítása movwf adr_i2c ; hívás read_i2c ;hívás I2C olvasási szubrutin hívása err_prov ;I2C írási/olvasási hibák ellenőrzése btfsc flag,2 ;lekérdezés megjelenítési mód jelzője goto met_8 ; hívja a vivod , hívja meg az alprogramot az órák értékének digitális kijelzőn történő megjelenítéséhez goto met_2 ; met_8 call vivod_temp ;az alprogram meghívása a hőmérséklet és az óra digitális kijelzőn történő megjelenítéséhez goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#beleértve

CONFIG H"3F10" ;Mikrovezérlő konfiguráció

errorlevel -302 ;ne jelenjenek meg a 302-es hibaüzenetek a listában

Sec equ 0020h ;kiegészítő számlálóregiszterek

Sec1 equ 0021h ;

Sec2 equ 0022h ;

scetbit equ 0024h ;bitszámláló segédregiszter

perem equ 0025h ;segédregiszter az adás/vétel bájthoz spi-n keresztül, i2c

temp equ 0026h ;hőmérsékletregiszter

perem_1 equ 0027h ;BCD segédregiszter

eredmény equ 0028h ;BCD segédregiszter

dat_ind equ 0029h ;adatregiszter spi átvitelhez

adr_ind equ 002Ah ;spi címregiszter

second equ 002Bh ;másodperc regiszter az idő beállításához

perc equ 002Ch ; percregiszter az idő beállításához

óra equ 002Dh ;óraregiszter az idő beállításához

adr_i2c equ 002Eh; i2c interfész átviteli rutin regiszterek

tmp_i2c equ 002Fh

slave_adr equ 0030h

data_i2c equ 0031h

flag equ 007Fh ; zászlóregiszter

#DEFINE int PORTB,0 ;interrupt line INT/SQW DS3231

#DEFINE sda PORTB,1 ;SDA vonal a DS3231 csatlakoztatásához

#DEFINE scl PORTB,2 ;SCL vonal a DS3231 csatlakoztatásához

#DEFINE datai PORTB,5 ; MAX7219 illesztőprogram adatbeviteli sora

#DEFINE cs PORTB,6 ; MAX7219 illesztőprogram-választó sor

#DEFINE clk PORTB,7 ; MAX7219 illesztőprogram óravonal

#DEFINE led PORTB,4 ;i2c hibajelző LED

#DEFINE led_sec PORTB,3 ; 1 Hz-es órajelző LED

#DEFINE regim PORTA,2 ; Kijelző gomb - a megjelenítési mód megváltoztatása

#DEFINE nast PORTA,3 ;Beállítás gomb - belép az idő beállítási módba

#DEFINE ust PORTA,4 ;Beállítás gomb - az óra értékének beállítása

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0000h ;indítsa el a program végrehajtását a 0000h címen

goto Start ;ugrás a Start címkére

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Fő program

Start movlw b"00000000" ;állítsa be az A port kimeneti reteszértékeit

movlw b"01000000" ;állítsa be a B port kimeneti reteszértékeit

movlw b"00000111" ;kapcsolja ki az összehasonlítókat

bsf STATUS,RP0 ;válassza ki az 1. bankot

movlw b"00000111" ;állítsa be a B port I/O vonalait

movwf TRISB ;RB0-RB2 - bemenet, egyéb kimenet

movlw b"11111111" ;konfigurálja az A port I/O vonalait

movwf TRISA ; minden bemeneti sor

bcf STATUS,RP0 ;válassza ki a 0 bankot

clrf flag ;reset flag register

init_lcd hívása ;hívási illesztőprogram inicializálási rutinja (MAX7219)

viv_not hívása ;kötőjel karakterek megjelenítése "------"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

movlw b"11010000" ;eszköz címe (DS3231)

;Írjon 4 bájtot a regiszterek fogadásához/továbbításához i2c-n keresztül

movlw data_i2c ;beállítja az első i2c vételi/átviteli regisztert

movlw b"10000000" ;adatok az 1. riasztási másodperc regiszteréhez

movlw b"10000000" ;adatok az 1. riasztási perc regiszteréhez

movlw b"10000000" ;adatok az 1. ébresztőóra-regiszterhez

movlw b"10000000" ;adatok az 1. riasztás dátum/hétnap nyilvántartásához

movlw .4 ;4 bájt átvitele i2c-n keresztül

movlw 0x07 ;állítsa be az 1. riasztás másodpercregiszterének címét

". Ismerkedjünk meg a DS3231 valós idejű óra modullal. A cikk videós utasításokat, programlistákat, a DS család moduljainak az Arduinohoz való csatlakoztatásának célját és módszereit tartalmazza.

Valós idejű óra modul DS3231

Mi az a DS3231 valós idejű óra modul?

Valós idejű óra modul- ez egy elektronikus áramkör, amelyet kronometrikus adatok rögzítésére terveztek (aktuális idő, dátum, a hét napja stb.), egy autonóm áramforrásból és egy könyvelő eszközből származó rendszer.

DS3231 modul Alapvetően ez csak egy normál óra. Az Arduino táblákon már van beépített óra Millis azonban csak akkor működik, ha a tábla áram alá van kapcsolva. Az Arduino letiltása és újbóli engedélyezése nullára állítja a Millis-időt. A DS3231 fedélzetén pedig egy akkumulátor található, amely még akkor is, ha az Arduino kártya ki van kapcsolva, továbbra is „táplálja” a modult, lehetővé téve az idő mérését.

A modul Arduino kártyákra épülő óraként vagy ébresztőóraként is használható. Vagy riasztásként különböző rendszerekre, például az okosotthonban.

A DS3231 specifikációi:

  • a modul órákat, perceket, másodperceket, dátumokat, hónapokat, éveket számol (2100-ig a szökőéveket veszik figyelembe);
  • a különféle eszközökhöz való csatlakozáshoz az óra az I2C interfészen keresztül csatlakozik.

32K- 12V-nál nagyobb külső tápellátásra tervezett kimenet.

SQW- Programozható négyzethullámú jelkimenet.

SCL– Ezen a tűn keresztül történik az adatcsere az órával az I2C interfészen keresztül.

SDA– Az óra adatai ezen a tűn keresztül kerülnek továbbításra.

VCC– Valós idejű óra tápegység, 5 volt szükséges. Ha nem kap feszültséget erre a tűre, az óra alvó üzemmódba lép.

GND- Föld.

DS3231 valós idejű óra kapcsolási rajza és egyszerű program

SDA és SCL érintkezők különböző Arduino kártyákon:

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

Csatlakoztassuk a valós idejű óra modult az Arduino UNO-hoz. SDA - pin A4, SCL - tű A5.

A következő program alkalmas a modell működésére (egyszerűen átmásolhatja a programot az Arduino IDE-be):

#beleértve

void setup()(
késleltetés(300);
Serial.begin(9600);
time.begin();
}
void loop()(



}
}

Ez a vázlat csak egy visszaszámlálás.

Mindenekelőtt a forgatókönyvben a könyvtár kapcsolata arduino_RTC.h.

Ugyanitt adja meg a modul pontos nevét a megfelelő működéshez.

Ennek eredményeként megkapjuk a DS3231 modul időkimenetét a portmonitorra. Órák, percek, másodpercek megjelenítése.

A következő vázlatban egy függvényt adunk hozzá beállítani az időt, amely lehetővé teszi a kezdeti visszaszámlálási idő beállítását.

#beleértve
iarduino_RTC time(RTC_DS3231);
void setup()(
késleltetés(300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 mp, 0 perc, 18 óra, 2017. április 24., hétfő
}
void loop()(
if(millis()%1000==0)( // ha eltelt 1 másodperc
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // kimeneti idő
késleltetés(1); // szünet 1 ms-ig, hogy ne jelenjen meg többször az idő 1 ms alatt
}
}

A példában az idő 0 másodperctől 0 perctől 18 órától kezdődik, 2017. április 24., hétfő.

Leckék bejegyzései:

  1. Első lecke: .
  2. Második lecke: .
  3. Harmadik lecke: .
  4. Negyedik lecke: .
  5. Ötödik lecke: .
  6. Hatodik lecke: .
  7. Hetedik lecke: .
  8. Nyolcadik lecke: .
  9. Kilencedik lecke:

A DS3231 (RTC, ZS-042) modul egy alacsony költségű kártya rendkívül pontos valós idejű órával (RTC), hőmérséklet-kompenzált kristályoszcillátorral és kristállyal. A modul egy lítium akkumulátort tartalmaz, amely akkor is megszakítás nélkül működik, ha a tápellátás ki van kapcsolva. Az integrált oszcillátor javította a készülék pontosságát, és lehetővé tette az alkatrészek számának csökkentését.

Műszaki adatok

Tápfeszültség: 3,3V és 5V
Memória chip: AT24C32 (32Kb)
Pontosság: ± 0,432 mp naponta
Kvarc frekvencia: 32,768 kHz
Támogatott protokoll: I2C
Méretek: 38mm x 22mm x 15mm

Általános információ

A legtöbb mikroáramkör, például a DS1307, külső 32 kHz-es kristályoszcillátort használ, de van egy jelentős hátrányuk, hogy a hőmérséklet változásakor a kvarc frekvenciája megváltozik, ami időzítési hibához vezet. Ezt a problémát a DS3231 chip javítja, amelybe egy kristályoszcillátor és egy hőmérséklet-érzékelő került beépítésre, amely kompenzálja a hőmérsékletváltozásokat, így az idő pontos marad (szükség esetén a hőmérsékleti adatok olvashatók). Ezenkívül a DS3231 chip támogatja a másodperceket, perceket, órákat, a hét napját, dátumot, hónapot és évet, valamint figyeli a napok számát egy hónapban, és korrigálja a szökőévet. Támogatja az óra működését két 24-es és 12-es formátumban, valamint két ébresztőóra programozása is lehetséges. A modul kétvezetékes I2C buszon működik.


Most egy kicsit magáról a modulról, a DS3231N chipre épül. Az RP1 (4,7 kOhm) ellenállás szerelvény a 32K, SQW, SCL és SDA vonalak felhúzásához szükséges (egyébként ha több modult használunk I2C busszal, akkor a többi modulon kell forrasztani a felhúzó ellenállásokat). A második ellenállás-szerelvény az A0, A1 és A2 vonalak felhúzásához, az AT24C32N memóriachip címzésének megváltoztatásához szükséges. Az R5 ellenállás és a D1 dióda az akkumulátor töltésére szolgál, elvileg forraszthatóak, hiszen egy hagyományos SR2032 akkumulátor évekig bírja. AT24C32N memóriachip is be van szerelve, ez bónusz, nem szükséges az RTC DS3231N óra működéséhez. Az R1 ellenállás és a Power LED jelzi, hogy a modul be van kapcsolva. Mint említettük, a modul az I2C buszon működik, a kényelem kedvéért ezek a buszok két J1 és J2 csatlakozóra kerültek, a többi érintkező hozzárendelése lent látható. Cél: J1
32K: kimenet, frekvencia 32 kHz
SQW: kilépés
SDA: adatvonal (soros Dfta)
VCC: "+" modul tápellátása
GND: "-" modul teljesítménye Időpont J2
SCL: óravonal (soros óra)
SDA: adatvonal (soros adatok)
VCC: "+" modul tápellátása
GND: "-" modul teljesítménye


Az AT24C32N mikroáramkörről mesélek egy kicsit, ez az Atmel gyártó 32k memóriás (EEPROM) mikroáramköre, SOIC8 tokozásba szerelve, kétvezetékes I2C buszon működik. A mikroáramkör címe 0x57, szükség esetén könnyen megváltoztatható az A0, A1 és A2 jumperekkel (ez lehetővé teszi a csatlakoztatott AT24C32 / 64 mikroáramkörök számának növelését). Mivel az AT24C32N chipnek három címbemenete van (A0, A1 és A2), amelyek két állapotúak lehetnek, vagy egy "1" napló vagy egy "0" napló, nyolc cím áll rendelkezésre a chip számára. 0x50-től 0x57-ig.

A DS3231 csatlakoztatása Arduinohoz

Szükséges adatok:
Arduino UNO R3 x 1db
Valós idejű óra DS3231, RTC, SPI, AT24C32 x 1 db.
DuPont huzal, 2,54 mm, 20 cm, F-M (Nő - Férfi) x 1 db.
USB 2.0 A-B kábel x 1

Kapcsolat:
Ebben a példában csak a DS3231 modult és az Arduino UNO R3-at fogom használni, minden adat a "Monitoring Port"-ra kerül átvitelre. Az áramkör nem bonyolult, csak négy vezetékre van szükség, először az I2C buszt, az SCL-t az A4-hez (Arduino UNO) és az SDA-t az A5-höz (Arduino UNO) csatlakoztatjuk, marad a táp GND csatlakoztatása a GND-re és a VCC 5 V-ra (te 3,3V-ról is tud írni), az áramkör összerakva, most a szoftverrészt kell elkészíteni.

A DS3231-el működő könyvtár nem található az Arduino IDE-ben, le kell töltenie a „DS3231”-et, és hozzá kell adnia az Arduino IDE-hez.

Időbeállítás DS3231
Amikor először kapcsolja be, be kell programoznia az időt, meg kell nyitnia a példát a DS3231 könyvtárból: "Fájl" -> "Példák" -> "DS3231" -> "Arduino" -> "DS3231_Serial_Easy", vagy másolja ki a kódot. lent

/* A tesztelést Arduino IDE 1.8.0-val végeztük. Teszt dátuma 2018.08.31. */ #include // Csatlakoztassa a Wire DS3231 könyvtárat rtc(SDA, SCL); // DS3231 inicializálása void setup() ( Serial.begin(115200); // Soros kapcsolat beállítása rtc.begin(); // rtc inicializálása // Idő beállítása rtc.setDOW(FRIDAY); // A hét napjának beállítása rtc. setTime(16, 29, 0); // Állítsa be az időt 16:29:00-ra (24 órás formátum) rtc.setDate(31, 8, 2018); // A dátum beállítása 2018. augusztus 31-re loop() ( Serial. print(rtc.getDOWStr()); // A nap-hét elküldése Serial.print(" "); Serial.print(rtc.getDateStr()); // Dátum elküldése Serial.print( " -- "); Serial. println(rtc.getTimeStr()); // Küldési időkésleltetés (1000); // Egy másodperc késleltetés )

A tesztelést Arduino IDE 1.8.0-n végeztük

Vizsgálat időpontja 2018.08.31

#beleértve // Tartalmazza a Wire könyvtárat

DS3231 rtc (SDA , SCL ); // A DS3231 inicializálása

void setup()

Sorozatszám. begin(115200) ; // Soros kapcsolat létrehozása

rtc . Rajt(); // Az rtc inicializálása

// Beállítani az időt

rtc . setDOW(FRIDAY) ; // A hét napjának beállítása

rtc . setTime (16 , 29 , 0 ); // Állítsa be az időt 16:29:00-ra (24 órás formátum)

void loop()

Sorozatszám. nyomtatás (rtc . getDOWStr () ) ; // Küldés nap-hét

Sorozatszám. nyomtatás("");

Sorozatszám. print (rtc . getDateStr () ) ; // Dátum küldése

Sorozatszám. nyomtatás("-");

Sorozatszám. println (rtc . getTimeStr () ) ; // Küldési idő

késleltetés(1000) ; // Egy másodperces késleltetés

Töltse fel a vázlatot az Arduino vezérlőre, és nyissa meg a "Monitor Port" lehetőséget.

Ez az áttekintés kezdő rádióamatőröknek (a forrasztás szerelmeseinek), azoknak szól, akiket maga a folyamat érdekel. Felmérheti képességeit. A DS3231 chip egy valós idejű óra (RTC), integrált kristályoszcillátorral és hőkompenzációval.

Ez persze nem oszcilloszkóp forrasztása. Szint lent. De a munka érdekes.
Menjünk gyorsan, milyen formában jött minden.


A tartalma két tasakban volt. Szabványos cipzáras táskák. Egy kis zacskó apró dolgokkal volt egy nagyban.


Tartalmazták:
- Testként két lap áttetsző műanyagból (színezett és fóliával védve a karcolásoktól).
- Díj (nagyon jó minőség).


Két mátrix.


Az elülső oldalon fólia védi őket. A lábakat porózus polietilénnel védték.


Körülbelül egy méter hosszú USB kábel.


Kidobott mindent, ami megmaradt.


Két részre osztva.
Csavarok anyákkal.


És mit kell forrasztania.


Aljzat egy nagyon ritka CR1220 lítium akkumulátorhoz, higany helyzetérzékelő, pár tranzisztor, elektrolit kondenzátor, AMS1117 stabilizátor (3,3V), SMD kondenzátorok és ellenállások (10K), 3 gomb, USB csatlakozó, hangjelző.
A legfontosabb az STC 15w1k24s vezérlő és a nagy pontosságú DS3231 chip. Nagyon kemény hólyagba voltak csomagolva, nagyon nehezen gyűrődik.


Nem volt terv. Kérdés azonban nem volt, minden világos.
A táblán minden részlet nemcsak aláírva, hanem (feltételesen) ki is van rajzolva.
Minden egyszerű.
De először készülj fel.


A két legbonyolultabb (gondoltam) mikroáramkör forrasztásával kezdtem. Két helyen elhelyezve és megragadva (átmérővel szemben). Utána pedig rendesen forrasztva. Ne felejtsen el kapaszkodni, nehogy „elmenjenek”.


Aztán a stabilizátor.


Tranzisztor.


Négy SMD ellenállás és két SMD kondenzátor. A pozicionálás és az egyik élről való megfogás nem volt olyan egyszerű (készséget igényel). és nincs sok nálam :)


két elektrolit.


USB csatlakozó.


Lítium akkumulátor foglalat.


Madárfióka. Ne felejtsd el az előnyöket és hátrányokat. Forrasztás után a legtöbbet leharaptam a lábakat, nem akarok később a mátrixok forrasztásánál beleszólni.


Higany helyzetérzékelő.


3 gomb.


És végül a mátrixok. Ügyeljen a tájékozódásra. Ez a felső (a magassugárzó a bal oldalon lesz).


Íme, mi történt.


Igaz, tartalék alkatrészek maradtak (elvesztés esetén valószínűleg): egy tranzisztor, két ellenállás és egy kondenzátor.


Lemosom a fluxust.
Ellenőrzöm.
Dolgoznak!
Leveszem a védőfóliát.


Gyűjtök.

Bekapcsolás után az óra gratulált az újév alkalmából.


Nem csoda, hogy az órán 2000. január 1-jén 00 óra 01 perc.


Ne figyeljen a többszínű mátrixra. A "képernyő" frissítési gyakorisága arányos a fényképezőgép záridővel. Az emberi szem mindent a megfelelő vörös színben lát. Ezért a videó forgatásakor kicsit lefüggönyöztem az ablakokat (a zársebesség növelése érdekében).
Most be kell állítanunk.
Az óra hátulján három gomb található. Én magam neveztem el őket (fentről lefelé):
1. Menü.
2. Plusz.
3. Mínusz.
Lásd a hangolási algoritmust. Ha karórát tartasz a kezedben, még az is tisztább lesz, mint a tiszta 
A belépéshez tartsa lenyomva egy ideig a felső gombot (menü). Ezután rövid nyomással dolgozunk.

elmagyarázok valamit. Összesen hat menü van. Váltás. Használhatja a plusz gombot, használhatja a mínusz gombot.
TIME – időbeállítás.
DATE - dátum beállítása.
ALAR - riasztás beállítása.
FONT - betűtípus kiválasztása (összesen 5 típus: vékony széles élsimított ...).
DISP - az információ megjelenítésére szolgáló algoritmus kiválasztása (csak nézheti, az információkat szekvenciálisan módosíthatja: idő, hőmérséklet, dátum, ünnepnapok futó vonallal ...).
MIDP - az elválasztó pontok típusának kiválasztása.


Nem könnyű mindent szavakkal elmagyarázni. A videón részletesen megmutattam (link a végén).
És ezen a videón (30 másodperc) láthatja a mátrixok információinak megjelenítésére szolgáló algoritmust (DISP menü 2-es típusa).


Fontos jegyzet. Lítium elem nélkül a beállítás után az idő és a dátum elveszik. A többi beállítás a memóriában marad.
Normál töltőhöz csatlakoztatva. Mérje meg a fogyasztást.


Az USB-eszköz semmit sem mutat, ha 50 mA-nél kevesebbet fogyaszt (ilyen funkció).
Következtetés: óra üzemmódban az áramfelvétel kevesebb, mint 50 mA, futó vonali módban körülbelül 70 mA. Nem túl sok.
Méreteket mértem: 105 * 85mm.
Számok a standard kijelzőn 20*30mm mindenki.


A tévé elé tettem.


Majdnem megfeledkeztem a higany helyzetérzékelőről.
Az óra mindig helyesen fog mutatni, még akkor is, ha fejjel lefelé van fordítva. A higanykörte zárja vagy kinyitja az érintkezőket. Ennek megfelelően a vezérlő megváltoztatja az információ mátrixon való megjelenítésének algoritmusát.
Itt általában ennyi.
Ideje összegezni.
Jó barkácskészlet kezdő rádióamatőröknek, hogy próbára tegye tudásukat. Sőt, ez nem csak egy edzéshez készült készlet, de végül egy jó óra lett.
A helyes következtetéshez, amit írt, elégnek kell lennie.
Ha valami nem világos, tegyen fel kérdéseket. Remélem legalább valakinek segített.
Sok szerencsét!

A terméket az üzlet véleménye írásához biztosította. Az áttekintés az Oldalszabályzat 18. pontja szerint kerül közzétételre.

+61 vásárlását tervezem Add hozzá a kedvencekhez Tetszett a vélemény +66 +122

Betöltés...
Top