Sincronizați ora de pe modulul DS3231 cu computerul. DS3231 - conexiune ceas în timp real

De ce sunt necesare toate acestea?

60 de secunde * 60 de minute * 24 de ore * 365 de zile = 31.536.000 de secunde pe an.

Pentru fiecare dintre aceste milioane, 2 secunde pot merge într-o direcție sau alta. 31,5 milioane împărțit la un milion și înmulțit cu 2: obținem 63 de secunde pe an (maximum). Opțiune acceptabilă? Foarte. Dar o dată la șase luni, aș sincroniza ora astfel încât să se potrivească în 1 minut.

Care sunt modalitățile de a seta ora pe ceasul modulului?

În mod tradițional, începând cu modulul DS3107, ora a fost setată folosind schița Arduino din cazurile de utilizare ale bibliotecii. Algoritmul este următorul: deschideți schița, faceți clic pe „compilați și încărcați”, iar ora este setată prima dată când controlerul este pornit. Rămâne întrebarea: la ce oră? Cum poate Arduino să știe ce oră să seteze? Și foarte simplu - timpul de compilare a schițelor. Cu toate acestea, văd câteva dezavantaje cu această abordare:
  • timpul de compilare depinde de „puterea” computerului;
  • timpul de încărcare depinde de viteza de transfer a schiței compilate pe placa Arduino;
  • schița încărcată este „o singură dată” (învechită imediat după încărcarea în Arduino).
Cum poți „eschiva” pentru a ocoli aceste restricții? Ei bine, de exemplu, știind (setarea experimental) timpul de compilare, puteți „conduce” ceasul de pe computer înainte până la acest moment. Apoi rulați compilația, flash pe placa și ora va fi setată. Avantajul metodei este relativa simplitate. Contra - metoda relativ incomod, relativ inexactă, o singură dată.

La ce altceva te poți gândi? Puteți, de exemplu, să setați manual timpul necesar în schiță, să furnizați un buton, apăsând pe care momentul potrivit va seta ora specificată „de mână”, de exemplu, după 2 minute de la momentul curent: în timp ce schița „se umple”, în timp ce ne pregătim să urmărim manual momentul potrivit de apăsare a butonului, doar acele două minute vor trece. Și apoi, privind ceasul din computer, așteptați „același” moment pentru a apăsa butonul. Avantaje – mai complicată decât metoda anterioară, dar totuși relativ simplă, dar mai precisă decât prima metodă. Contra - această metodă este și mai incomodă, mai lungă, totuși o schiță „o singură dată”.

Cine este de vină și ce să facă?

După ce mi-am pus aceste două întrebări retorice, am ajuns pe internet să caut cine a scris deja sincronizarea orei modulului ceasului cu computerul. Și, după cum știți, cine caută găsește întotdeauna. Am găsit o opțiune cu . În teorie, totul este simplu: „fișierul batch” obișnuit analizează timpul total curent obținut prin metoda „prima” (deoarece pe lângă ora în sine, este necesară și data), crește timpul cu 2 secunde și „ conduce” ciclul gol până când vine acesta nou, „plus_două_secunde”, timpul pentru a „arunca” date în portul COM. Mai mult, timpul „nou plus_două_secunde” este urmărit într-un mod diferit (prin % time%, dacă este cineva interesat). Dar despre „jamburile” unei astfel de decizii mai târziu. Datele „aruncate” în portul COM, Arduino analizează și apoi setează ora în modul. Totul pare a fi simplu, logic și convenabil. Dar există un cuvânt foarte rău „DAR”. Toate acestea par să fie scrise de un german, iar standardele regionale din Windows diferă de „al nostru”, și în special, partea fracțională este separată de un punct, nu de o virgulă. Când este lansat cu standarde regionale interne, fișierul batch nu funcționează, deoarece în el timpul de ieșire dintr-o buclă goală este descris de condiția de comparație cu XX:XX:XX.xxx. Ei bine, trebuie să puneți o virgulă în loc de un punct - și gata, „Am reparat totul”. Și asta nu este tot (puteți verifica cine mai își amintește ce fel de rău este să programezi în fișiere batch). Este necesar să corectați fișierul batch mai serios. Și l-am reparat folosind „mats-winds” și „manual” pentru DOS. Am reparat fișierul batch, dar schița încă nu a funcționat - ora nu a fost setată. Adică, datele au fost trimise în port, Arduino le-a văzut, dar „ceva a mers prost”.

Să aruncăm o privire la ce trimite fișierul batch către Arduino și în ce format (pentru referință).

Cazul 83: //S = al doilea caz 68: //D = Minut (Daghigheh în persană) cazul 72: //H = Ora caz 84: //T = Ziua lunii (eticheta în germană) cazul 77: /// M = Lună cazul 74: /// J = An (Jahr în germană)
Datele sunt trimise în formatul S**~D**~H**~T*~M**~J****~, unde ~ este 2 octeți de returnare a carului. Total, 31 de octeți. Pare puțin, datele vor fi trimise rapid.

Cu toate acestea, există și un inconvenient - după cum puteți vedea, ziua săptămânii nu este trimisă. Doar ziua lunii. Pentru a implementa ceasuri cu alarme în funcție de zilele săptămânii, va exista un „cant”. Ziua săptămânii va trebui să fie setată cu „mânere” în schiță, ceea ce sugerează din nou o schiță „o singură dată”, inferioritatea ei.

Adunând factorii - inferioritatea schiței „din fabrică”, refuzul acesteia de a funcționa normal, nevoia de a corecta „fișierul lot” pentru latitudinile „noastre” - am decis să dezvolt totul pe cont propriu. Și dacă da, atunci pot elimina deficiențele și pot optimiza formatul datelor.

Software și hardware.

Pentru ca totul să funcționeze, sunt necesare 2 componente: un program pentru Windows și un pachet hardware-software Arduino.

În primul rând, date generale despre protocolul de schimb. Deoarece eram liber să aleg formatul de date pentru trimitere, am decis că trimiterea a 31 de octeți de informații nu era rațională și am redus datele transmise la 4 octeți. Și ce a fost de ajuns? Ce poate încadra în 4 octeți? Da, e suficient. Tot ce ai nevoie este la locul lui. Sunt sigur că mulți au ghicit ce sunt 4 octeți. Pentru cei care nu au ghicit, voi cita un fragment dintr-un articol de pe Wikipedia:

Ora UNIX (timp POSIX) - un sistem de descriere a momentelor în timp, adoptat în UNIX și alte compatibile cu POSIX sisteme de operare. Definit ca numărul de secunde de la miezul nopții (00:00:00 UTC) pe 1 ianuarie 1970 (joi).
Ora UNIX este reprezentată ca un număr întreg care crește cu fiecare secundă care trece, fără a fi nevoie de calcule pentru a determina anul, luna, ziua, ora sau minutul pentru lizibilitatea umană. Ora UNIX modernă este în concordanță cu UTC - numărătoarea inversă este în secunde SI.

Deci, un număr întreg care stochează timpul UNIX durează 4 octeți, ceea ce este suficient pentru până la 2.147.483.648 de secunde. Și apoi posibil probleme potentiale. De ce potential? Pentru că acesta este pragul la care numărul Pot fi să fie interpretat ca negativ (ca și în cazul iPhone-urilor multor tovarăși curioși la un moment dat). Poate, dar nu neapărat - depinde dacă mâinile programatorilor cresc din locul oferit de natură. Numărul specificat de secunde corespunde cu 03:14:08 pe 19-ian-2038. Până atunci, puteți trece încet la o versiune pe 64 de biți a sistemului de operare, unde timpul va fi stocat într-o variabilă de 8 octeți, ceea ce va fi suficient pentru următorii 292 de miliarde de ani fără probleme. Există posibilitatea ca acest lucru să fie suficient pentru viața noastră. Și apoi trebuie să faceți upgrade la versiunea de 128 de biți a UNIX.

Ce probleme am rezolvat venind la aceasta optiune? În primul rând, am redus foarte mult numărul de octeți transmisi, ceea ce mărește acuratețea setării timpului cu milisecunde. E grozav, nu? Și în al doilea rând, am ușurat (probabil) compatibilitatea cu Linux. Spre rușinea mea, nu mă pot obișnui cu Linux și folosesc în mare parte numai Windows. Pentru același Windows pot scrie un forwarder, dar pentru Linux nu pot. Dar cred că în Linux puteți obține valoarea timpului UNIX mult mai ușor decât în ​​Windows și puteți trimite acest număr în portul COM.

Nici unul adiţional datele, cum ar fi ziua săptămânii și așa mai departe, nu trebuie transmise. Numai la ora UNIX. Orice altceva se face în Arduino.

Acum câteva detalii direct despre primul component - un program pentru Windows. Programul este scris în vechiul Delphi. Când este lansată, o fereastră pop-up vă solicită să selectați un port COM pentru trimiterea datelor. Alege. Restul setărilor ar trebui lăsate implicit.

Cum funcționează programul? Se recalculează din formatul de timp datele Windows pentru formatul UNIX, adică numărul de secunde de la miezul nopții, 1 ianuarie 1970. Apoi adaugă 3 secunde și „cade” într-o buclă goală (evident mai puțin decât acele 3 secunde în plus), ieșirea din care se produce în numărul necesar de secunde, cât mai aproape de 000 de milisecunde. Cu alte cuvinte, este monitorizat debutul de la începutul acelei secunde de timp, a cărui valoare va trebui trimisă la Arduino. De acord, trimiterea de date care, de exemplu, este acum XXXXXXXXX5 secunde, când de fapt este deja, de exemplu, XXXXXXXXX5 și 756 de miimi (de exemplu) secunde, nu ar fi corectă. De aceea, trebuie să urmăriți chiar începutul secundei pentru a începe transferul de date. După transferul de date, programul prietenos raportează starea „Terminat:)”. Aceasta încheie misiunea programului.


Al doilea componentă - parte hardware-software - Arduino. Sunt 2 soiuri hardware pentru acest proiect: o versiune „complet” cu un ecran și un buton, și o versiune „decupată” pentru instalare rapida modul de timp, asamblat din „rahat și bețe”. Vedeți mai jos diferențele dintre ele. Versiunea „completă” constă dintr-un Arduino Nano, un scut 1602 cu un „adaptor I2C pentru a proteja”, un buton de resetare Arduino opțional și un antet pin (femă) pentru conectarea modulului de ceas. De asemenea, optional, din corpul aparatului cu un sticker "dragus". Versiunea „demontată” constă dintr-un Arduino (Uno, Nano, Pro Mini + adaptorul „corect” la USB cu DTR) și 4 fire pentru conectarea modulului de ceas.



După cum se poate observa din diagrame, versiunea „completă”, pe lângă cea „trunchiată”, conține un buton de resetare și un ecran 1602 cu un „adaptor”. Ambele versiuni sunt absolut identice în ceea ce privește funcționalitatea principală - să setați ora. Ecranul este necesar doar pentru afișarea etapelor procesului și, la sfârșitul procesului de setare a orei, afișarea ora proaspăt setată, data și ziua săptămânii. În plus, datele până la acea oră vor fi deja citiți din modulul de ceas în sine. În versiunea „trunchiată”, LED-ul încorporat în placa Arduino acționează ca un ecran: la sfârșitul procesului de setare a unei noi ore, începe să strălucească. Aceasta este întreaga indicație.

Pentru ce este butonul de resetare? Pentru ceea ce este în versiunea completa după setarea orei, Arduino va intra într-o buclă nesfârșită pentru a afișa acel timp foarte proaspăt setat, adică, de fapt, va deveni un ceas. Mai mult, ceasuri realizate pe în grabă, în legătură cu care nu vor putea înlocui ceasul normal din mai multe motive (selectarea secundelor se realizează printr-o întârziere, afișarea timpului va dispărea la oprirea alimentării). La urma urmei, scopul este să te asiguri că ora este sincronizată corect, nimic mai mult. Prin urmare, pentru a sincroniza următorul modul de ceas, nu puteți face fără o resetare (mai precis, o puteți face dacă „distorsionați” cablu USB). Cu alte cuvinte, scopul butonului este pur utilitar. Dacă doriți, puteți face fără el.

Cum să flash Arduino, deoarece există două versiuni de hardware și o schiță? Pentru a compila versiunea de firmware „corectă”, trebuie să setați valoarea parametrului dorit în antetul schiței versiunea completa: Adevărat pentru versiunea „completă”, sau fals - pentru „trunchiat”. Compilatorul va determina astfel pentru ce versiune de hardware va compila firmware-ul.

Deci, există o diagramă de conexiune, aveți nevoie de un cod de schiță. Vă rugăm să rețineți că pentru operatie normala o schiță cu o versiune „completă” are nevoie de o bibliotecă LiquidCrystal I2C de Frank de Brabander(instalat din depozit folosind Managerul bibliotecii). Avem nevoie și de o bibliotecă care să susțină modulul de ceas, și nu oricare :). Descarcă aici: . Ne-am ocupat de biblioteci.

Iată codul schiței:

//======================================= setare care poate fi schimbată === = ==================================== #define fullVersion true //true = versiunea „complet” cu ecran ; false = versiune „dezbrăcat” cu LED încorporat //=============================== Biblioteci utilizate și variabile declarații = ================================= #include #include #dacă (Versiune completă) #include #endif unsigned long t1 = 0; //variabilă pentru timpul primit unsigned long t2 = 0; //variabilă pentru octetul de timp primit b; // buffer pentru primirea datelor de la Port COM#if (fullVersion) byte day = 0; #endif ceas DS3231; RTCDateTime data1; #if (fullVersion) LiquidCrystal_I2C lcd(0x3F,16,2); //Chinezilor le-a plăcut noua adresă pentru „adaptoare” de la i2c la ecran #endif //============================== = =================================================== ================================= void setup()( #if (!fullVersion) //relevant doar pentru " versiunea trunchiată" - începutul secțiunii de cod pinMode(13, OUTPUT); digitalWrite(13,LOW); #endif //relevant numai pentru versiunea "trunchiată" - sfârșitul secțiunii de cod clock.begin(); Serial .begin(9600); #if (fullVersion) //relevant doar pentru versiunea „completă” - începutul secțiunii de cod lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd .print("COMport 9600 8N1"); //sugestie ce parametri portului COM să selectați în program lcd.setCursor(0,1); lcd.print("Gata pentru sincronizare"); //mesaj de stare - gata de sincronizare delay(1000); #endif //relevant doar pentru versiunea „completă” - sfârșitul secțiunii de cod ) void loop()( if (Serial.available())( //dacă există „praf de pușcă în baloane” a portului COM Serial.readBytes(b,4); //citește toți cei 4 octeți (nu ne așteptăm la altceva) 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


Câteva fotografii ale versiunii „complete” a dispozitivului finit.


Și, în sfârșit, un videoclip cu dispozitivul în acțiune:

De unde pot descărca schița și programul?

Descărcare schiță (Dropbox).
Descărcați programul pentru Windows (Dropbox).

"Avantaje și dezavantaje".

Este dificil de formulat „pro” și „contra” în acest caz. Prin urmare, fiecare decide singur ce este bine și ce este rău.

Total.

Mi-a plăcut foarte mult cum se stabilește acum ora în module! Dacă este necesar să setez ora, nu trebuie să îmi amintesc de fiecare dată ce fel de schiță am nevoie și să mă gândesc la cât de exact va fi setat ora în modul. Mai mult, în curând va fi o recenzie a ceasurilor de casă, unde am construit o astfel de metodă de sincronizare - mi-a plăcut atât de mult metoda. Sper ca unii dintre cititori să le fie de folos.

Proiectul este gratuit, necomercial. Oricine are dreptul de a utiliza datele din recenzie în orice alt scop decât cel comercial.

Toate bune.

Intenționez să cumpăr +48 Adauga la favorite Mi-a placut recenzia +60 +114

DS3231 este un ceas RTC în timp real de înaltă precizie, care are încorporat un oscilator cu cristal compensat de temperatură, rezultând o deviere de numai ±2 minute pe an. În plus, este implementată o funcție de ceas cu alarmă, există și o ieșire de întrerupere. Ceasul poate fi achiziționat ca un modul gata făcut pentru Arduino cu elemente de prindere și un compartiment pentru baterie.

Am comandat modulul aici. Diagrama este prezentată în imaginea de mai jos:


Cipul folosește pe scară largă . Sunt acceptate ratele de date standard (100 kHz) și mari (400 kHz). Adresa cipului (7 biți) pe magistrala I2C este 1101000. În plus, modulul are o memorie I2C (24C32), care nu este prezentată în diagramă.

Moduri de putere

Tensiunea de alimentare a microcircuitului poate fi în intervalul 2,3 ... 5,5V, există două linii de alimentare, pentru o sursă externă (linie Vcc), precum și pentru o baterie (Vbat). Tensiunea sursei externe este monitorizată constant, când scade sub pragul Vpf=2,5V, trece pe linia bateriei. Următorul tabel prezintă condițiile de comutare între liniile de alimentare:

Precizia ceasului este menținută prin monitorizarea temperaturii ambientale. Microcircuitul începe o procedură internă de reglare a frecvenței generatorului de ceas, valoarea ajustării este determinată de un grafic special al dependenței frecvenței de temperatură. Procedura începe după pornire și apoi rulează la fiecare 64 de secunde.

Pentru a conserva încărcarea, atunci când bateria este conectată (tensiunea este aplicată la linia Vbat), generatorul de ceas nu pornește până când tensiunea de pe linia Vcc depășește pragul Vpf sau adresa corectă a cipului este transmisă prin interfața I2C. . Ora de pornire a generatorului de ceas este mai mică de o secundă. La aproximativ 2 secunde de la aplicarea alimentării (Vcc) sau de la primirea unei adrese prin interfața I2C, începe procedura de corecție a frecvenței. Odată ce generatorul de ceas a pornit, acesta continuă să funcționeze atâta timp cât este prezent Vcc sau Vbat. La prima pornire, registrele de dată și oră sunt resetate și au următoarele valori 01/01/00 - 01 - 00/00/00 (zi/lună/an/ - ziua săptămânii - oră/minute/secunde ).

Consumul de curent atunci când este alimentat de o baterie de 3,63V este de 3 μA, în absența transferului de date prin interfața I2C. Consumul maxim de curent poate ajunge la 300uA atunci când se utilizează o sursă de alimentare externă de 5,5 V și o rată mare de transmisie I2C.

Funcție de resetare externă

Linia RST poate fi folosită pentru resetare externă și are, de asemenea, o funcție de alarmă de joasă tensiune. Linia este trasă sus printr-un rezistor intern, nu este necesară tragerea externă. Pentru a utiliza funcția de resetare externă, se poate conecta un buton între linia RST și firul comun; microcircuitul are protecție împotriva sarituri de contact. Funcția de alertă este activată atunci când tensiunea de alimentare Vcc scade sub valoarea de prag Vpf, în timp ce linia RST scade.

Descrierea registrelor DS3231

Tabelul de mai jos prezintă o listă a registrelor de ceas în timp real:

AbordareD7D6D5D4D3D2D1D0Funcţielimite
0x000 10 secundesecundesecunde00-59
0x010 10 minuteminuteminute00-59
0x020 12/24 AM PM10 oreOraCeas1-12 + AM/PM sau 00-23
10 ore
0x030 0 0 0 0 ZiZi a săptămânii1-7
0x040 0 numarul 10NumărData01-31
0x05Secol0 0 10 luniLunăLuni/Secol01-12 + Secolul
0x0610 aniAnani00-99
0x07A1M110 secundesecundeSecunde, prima alarmă00-59
0x08A1M210 minuteminuteMinute, prima alarma00-59
0x09A1M312/24 AM PM10 oreOraCeas, prima alarma1-12 + AM/PM sau 00-23
10 ore
0x0AA1M4DY/DTnumarul 10ZiZiua săptămânii, prima alarmă1-7
NumărData, prima alarmă01-31
0x0BA2M210 minuteminuteMinute, a 2-a alarmă00-59
0x0CA2M312/24 AM PM10 oreOraCeas, a doua alarmă1-12 + AM/PM sau 00-23
10 ore
0x0DA2M4DY/DTnumarul 10ZiZiua săptămânii, a 2-a alarmă1-7
NumărData, a 2-a alarmă01-31
0x0EEOSCBBSQWCONVRS2RS1INTCNA2IEA1IEÎnregistrați setările (Control)
0x0FOSF0 0 0 EN32kHzBSYA2FA1FRegistrul de stare (Stare)
0x10SEMNDATEDATEDATEDATEDATEDATEDATERegistrul de compensare a vechimii
0x11SEMNDATEDATEDATEDATEDATEDATEDATERegistrul de temperatură octet înalt
0x12DATEDATE0 0 0 0 0 0 Registrul de temperatură octet scăzut

Informațiile de timp sunt stocate în format zecimal binar, adică fiecare cifră a numărului zecimal (de la 0 la 9) este reprezentată de un grup de 4 biți. În cazul unui octet, ciugulirea scăzută numără cele, zecile mari etc. Timpul se numără în registre cu adrese 0x00-0x06, pentru numărarea orelor, puteți selecta modul 12 ore sau 24 ore. Setarea celui de-al 6-lea bit al registrului de ceas (adresa 0x02) setează modul de 12 ore, în care al 5-lea bit indică ora din zi, valoarea 1 corespunde orei de după amiază (PM), valoarea 0 corespunde prânzului ( A.M). Valoarea zero a celui de-al 6-lea bit corespunde modului de 24 de ore, aici al 5-lea bit este implicat în numărarea orelor (valori 20-23).

Registrul zilei săptămânii este incrementat la miezul nopții, numărând de la 1 la 7, registrul lunii (adresa 0x05) conține bitul Century (bit 7), care comută atunci când registrul de numărare a anului (adresa 0x06) depășește, de la 99 la 00 .

Cipul DS3231 are două alarme, prima alarmă este configurată folosind registre cu adrese 0x07-0x0A, a doua alarmă cu registrele 0x0B-0x0D. Biții A1Mx și A2Mx pot seta moduri diferite pentru alarme, setarea bitului exclude registrul corespunzător din operația de comparare. Tabelele de mai jos prezintă combinații de biți pentru diferite moduri de alarmă:

Combinațiile de biți care nu sunt enumerate în tabele conduc la funcționarea incorectă a ceasurilor cu alarmă. Dacă bitul DY/DT este clar, atunci alarma este monitorizată pentru o potrivire a datei (ziua lunii), când bitul DY/DT este setat, se verifică o potrivire pentru ziua săptămânii.

Majoritatea funcțiilor sunt configurate în registrul de control. Bitul EOSC controlează pornirea generatorului de ceas, ștergerea bitului pornește generatorul. Setarea bitului oprește generatorul, numai pentru modul baterie (Vbat). Când este alimentat de o sursă externă (Vcc), oscilatorul funcționează întotdeauna, indiferent de starea bitului EOSC. După activare, valoarea implicită a bitului este 0.

Setarea bitului BBSQW permite funcționarea ieșirii INT/SQW (pin 3) în modul baterie atunci când nu este furnizată energie externă. Când bitul este zero, ieșirea INT/SQW trece în a 3-a stare (dezactivată) dacă tensiunea sursei externe Vcc scade sub pragul Vpf. După pornire, valoarea implicită a bitului este 0.

Bitul CONV este responsabil pentru măsurarea forțată a temperaturii, setarea bitului începe procesul de conversie, timp în care se reglează și frecvența ceasului, rezultatul măsurării este în registre cu adrese 0x11, 0x12. Pornirea este posibilă numai dacă conversia anterioară este finalizată, înainte de a începe este necesar să verificați indicatorul de ocupat BSY. Conversia forțată a temperaturii nu afectează ciclul intern de reglare a frecvenței de 64 de secunde. Setarea bitului CONV nu afectează indicatorul BSY timp de 2 ms. Biții CONV și BSY sunt resetati automat după finalizarea conversiei.

Biții RS2, RS1 setează frecvența impulsurilor dreptunghiulare (meadru) la ieșirea INT/SQW. În mod implicit, când sunt activați, biții sunt setați la 1. Tabelul de mai jos arată combinațiile posibile de biți:

Bitul INTCN controlează ieșirea INT/SQW. Dacă bitul este resetat, la ieșire apar impulsuri dreptunghiulare (meandru), a căror frecvență este setată de biții RS2, RS1. Când bitul INTCN este setat, ieșirea este utilizată pentru a genera întreruperi de alarmă. În mod implicit, valoarea bitului este 1. Tipul de ieșire INT/SQW este un dren deschis, deci este necesară o tragere printr-un rezistor la un nivel logic ridicat, nivelul activ este scăzut.

Setarea biților A1IE, A2IE activează prima și, respectiv, a doua întreruperi de alarmă. Resetați biții, dezactivează întreruperile. Valoarea implicită este 0.

Registrul de stare conține steaguri de eveniment și controlează ieșirea de 32 kHz. Steagul OSF reflectă starea generatorului de ceas, valoarea 1 înseamnă că generatorul este oprit, acest eveniment poate apărea în următoarele cazuri:

  • Pentru prima dată după pornire
  • Bateria sau tensiunea externă nu sunt suficiente pentru a opera generatorul de ceas
  • Generatorul este oprit prin setarea bitului EOSC în modul baterie
  • Factori externi care afectează oscilatorul cu cristal (zgomot, scurgeri etc.)

Odată setat, valoarea bitului nu se modifică, trebuie să resetați bitul manual.

Setarea bitului EN32kHz permite generarea de impulsuri dreptunghiulare (meadru) la ieșirea de 32kHz (pin 1), frecvența impulsului este fixată la 32,768 kHz. Resetarea bitului dezactivează această caracteristică și setează ieșirea la a treia stare (impedanță mare de intrare). Valoarea implicită a bitului este 1, după ce este aplicată puterea, la ieșire apar impulsuri. Tipul de ieșire de 32 kHz este drenaj deschis, deci este necesară o tragere.

Indicatorul de ocupat BSY este setat în timpul procesului de conversie a temperaturii și de reglare a ceasului. Indicatorul este resetat când conversia este finalizată.

Indicatoarele de alarmă A1F, A2F sunt setate atunci când valorile registrelor de contorizare a timpului și ale ceasului cu alarmă se potrivesc. Dacă întreruperile de alarmă A1IE, A2IE sunt activate și este atribuită o ieșire de întrerupere (bitul INTCN este setat), atunci la ieșirea INT/SQW apare un semnal de întrerupere (tranziție de la nivelul logic înalt la nivelul scăzut). Steagurile trebuie resetate manual prin scrierea valorii 0.

Registrul Aging Offset este conceput pentru a regla frecvența generatorului de ceas. Valoarea registrului este adăugată frecvenței oscilatorului în timpul procedurii de reglare internă, dacă este detectată o modificare a temperaturii și, de asemenea, atunci când conversia temperaturii este declanșată de bitul CONV. Valoarea offset este semnată, adică valorile pozitive (1-127) scad frecvența, valorile negative (128-255) o măresc. Pentru același offset, schimbarea frecvenței va fi diferită în funcție de temperatură. La +25°C, modificarea frecvenței va fi de 0,1 ppm/LSB.

Valoarea curentă a temperaturii este stocată în registre cu adrese 0x11 și 0x12, octet înalt și respectiv low, valoarea temperaturii din registre este actualizată periodic. Alinierea la stânga este setată, rezoluția este de 10 biți sau 0,25°C/LSB, adică octetul înalt conține partea întreagă a temperaturii, iar al 6-lea, al 7-lea biți din registrele inferioare formează partea fracțională. În octetul înalt, al 7-lea bit indică semnul temperaturii, de exemplu, valoarea 00011011 01 corespunde unei temperaturi de +27,25 °C, valoarea 11111110 10 corespunde la -2,5 °C.

La citirea registrelor contorării timpului, se recomandă utilizarea unui buffer suplimentar, adică citirea mai multor registre deodată, și nu separat, deoarece între operații de citire separate, registrele de timp își pot modifica valoarea. Această regulă este recomandată și atunci când scrieți date noi în registrele de cont. Scrierea unei noi valori în registrul de secunde întrerupe ceasul timp de 1 secundă, restul registrelor trebuie să fie suprascrise în acest timp.

Conectarea DS3231 la microcontroler

Am conectat ceasul la microcontrolerul PIC16F628A, folosit . Schema de conectare este prezentată mai jos:


După aplicarea alimentării, semnele liniuțe (- - - - - -) sunt afișate pe indicatoare, apoi ceasul este inițializat, valoarea timpului apare pe indicatoare cu o întârziere de 1 secundă, care este necesară pentru pornirea generatorului de ceas. Indicatorii afișează valoarea orelor, minutelor și secundelor, separate printr-un punct zecimal, formatul orei este de 24 de ore. Cu butonul „Indicație” SB1, puteți schimba formatul de afișare, unde indicatorii vor afișa temperatura, precum și valoarea orelor și minutelor, separate printr-o virgulă zecimală, care clipește la o frecvență de 2 Hz. Temperatura este afișată fără o parte fracțională, doar octetul mare de stocare a temperaturii la adresa 0x11 este citit în program.

Valoarea timpului este citită de la ceas prin întrerupere pe linia SQW/INT, care este controlată de primul semnal de alarmă, în timpul inițializării ceasului, alarma este setată la fiecare secundă. LED-ul HL1 servește ca indicator și clipește la un semnal de întrerupere în fiecare secundă. LED-ul HL2 se aprinde în cazul unei erori în transmiterea datelor prin interfața I2C.

În plus, la program a fost adăugată posibilitatea de a seta ceasul cu butoanele SB2 „Setare”, SB3 „Instalare”. Se intră în modul de configurare prin apăsarea butonului SB2, indicatorii arată 00 ore și liniuțe în loc de minute și secunde (00 - - - -). Butonul SB3 setează valoarea orei (crește cu fiecare apăsare), apoi apăsând butonul SB2, treci la editarea minutelor, în loc de liniuță, vor fi afișate 00 minute. Butonul SB3 setează, de asemenea, valoarea necesară și așa mai departe. După editarea secundelor și apăsarea butonului SB2, timpul în ore este suprascris, ora actualizată este afișată pe indicatoare.

Codul incomplet al programului este prezentat mai jos (versiunea completă poate fi descărcată la sfârșitul articolului):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; #include LIST p=16F628A __CONFIG H"3F10" ;nivel de eroare de configurare MCU -302 ;nu scoateți mesaje de eroare 302 în listare Sec equ 0020h ;registre de numărare auxiliare Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h ;Registrul auxiliar de numărare de biți perem equ 0025h ;Registrul auxiliar pentru primirea/transmiterea octeților prin spi, i2c temp equ 0026h ;Registrul de temperatură perem_1 equ 0027h ;Registrul auxiliar pentru conversia BCD rezultat equ 0028h ;registru auxiliar BCD dat_ind equ 0029h ;registru de date pentru transmisie spi adr_ind equ 002Ah ;registru de adresă pentru transmisia spi secund equ 002Bh ;registru de secunde pentru setarea timpului minut equ 002Ch ;registru de minute pentru setarea orei ora equ 002Dh ;registru de stocare de ore pentru setările de timp adr_002c ehqu ; i2c registre de rutină de transfer de date tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;registru de semnalizare #DEFINE int PORTB,0 ;linie de întrerupere INT/SQW DS3231 #DEFINE DS32F, linie DS3231 #DEFINE 32F, 23 ; Linie SCL pentru conexiune DS3231 #DEFINE sda_io TRISB,1 ;Directia liniei SDA #DEFINE scl_io TRISB,2 ;Directia liniei SCL #DEFINE datai PORTB,5 ;MAX7219 linia de intrare a datelor driver #DEFINE cs PORTB ,6 ;linia de selectie driver MAXINEF7219 #DEFINE clk PORTB,7 ;linia de ceas a driverului MAX7219 #DEFINE led PORTB,4 ;i2c LED error #DEFINE led_sec PORTB,3 ;LED indicare ceas 1Hz #DEF INE regim PORTA,2 ;Buton de indicare - schimbarea modului de afișare #DEFINE nast PORTA,3 ;Buton de setare - intrarea în modul de setare a orei #DEFINE ust PORTA,4 ;Buton de setare - setarea valorii ceasului;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;porniți execuția programului de la adresa 0000h goto Start ;mergeți la eticheta Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Program principal Porniți movlw b"00000000" ;Setați portul A zăvoare de ieșire movwf PORTA ; movlw b"01000000" ;setează valorile latch-ului de ieșire portului B movwf PORTB ; movlw b"00000111" ;dezactivați comparatoarele movwf CMCON ; bsf STATUS,RP0 ;selectați banca 1 movlw b"00000111" ;configurați liniile I/O ale portului B movwf TRISB ;RB0-RB2 - intrare, altele - ieșire movlw b"11111111" ;configurați liniile I/O ale portului A movwf TRISA ;toate liniile de intrare bcf STATUS,RP0 ;select bank 0 clrf flag ;resetare steaguri registru apel init_lcd ;apel subrutina de inițializare driver (MAX7219) call viv_not ;afișează simbolurile liniuțe " ------" ;; ;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; movlw b"11010000" ;Adresa dispozitivului (DS3231) movwf slave_adr ;Scrieți 4 octeți pentru a primi/transmite registre prin i2c ;Setarea primei alarme aici, bip la fiecare secundă movlw data_i2c ;Setarea primului registru de primire/transmitere prin FSR movwf i2c; movlw b"10000000" ;date pentru primele secunde de alarmă registru movwf INDF ; incf FSR,F ; movlw b"10000000" ;date pentru registrul de minute al primei alarme movwf INDF ; incf FSR,F ; movlw b"10000000" ;date pentru registrul de ceas al primei alarme movwf INDF ; incf FSR,F ; movlw b"10000000" ;date pentru registrul de date/zile săptămânii al primei alarme movwf INDF ; movlw . 4 ;transferă 4 octeți prin i2c movwf tmp_i2c ; movlw 0x07 ;setează adresa registrului de secunde al primei alarme movwf adr_i2c ; apel write_i2c ;apelați subrutina de scriere prin interfața i2c apel err_prov ;verificați erorile de scriere/citire I2C movlw .1 ;transfer primul octet prin i2c movwf tmp_i2c ; movlw 0x0E ;setează adresa registrului Control movwf adr_i2c ; movlw data_i2c ;set primul registru de primire/transmitere i2c movwf FSR ; movlw b"00000101" ;Porniți ceasul, dezactivați pinul INT/SQW pentru movwf INDF ;Modul bateriei, frecvența pulsului INT/SQW 1Hz, primul apel de alarmă write_i2c ;apelați subrutina de scriere prin apelul interfeței i2c write err_prov ;verificați I2C erori met_2 movlw .1 ;transfer primul octet prin i2c movwf tmp_i2c ; movlw 0x0F ;setează adresa registrului de stare movwf adr_i2c ; movlw data_i2c ;set primul registru de primire/transmitere i2c movwf FSR ; movlw b"00000000" ;resetare bit OSF, dezactivare generare de impulsuri la ieșirea EN32kHz, movwf INDF ;resetare semnale de întrerupere a alarmei A2F, A1F apel write_i2c ;apel subrutine de scriere prin interfața i2c apel err_prov ;verifica erori I2C write_1 intread ; linia de întrerupere a alarmei sondaj merge la met_3 ; bsf led_sec ;porniți LED-ul de indicare a ceasului goto met_4 ; met_3 bcf led_sec ;oprirea LED-ului de indicare a ceasului btfsc nast ;interogare butonul de setare a ceasului goto met_5 ; apel nast_time ; subrutina de setare a timpului apelului goto met_2 ; met_5 btfsc regim ;buton modul de afișare sondaj goto met_1 ; met_6 call pause_knp ; btfssregim ; goto met_6 ; btfss flag,2;schimbați valoarea indicatorului modului de afișare goto met_7; bcf flag,2 ;reset indicator indicator, modul de afișare a ceasului goto met_1 ; met_7 bsf flag,2; setați indicatorul de indicare, temperatura și modul de afișare a ceasului mergeți la met_1; met_4 movlw .1 ;transfer primul octet prin i2c movwf tmp_i2c ; movlw 0x11 ;setează adresa registrului de temperatură superioară movwf adr_i2c ; apel read_i2c ;apel I2C citire rutina apel err_prov ;verifică erori de scriere/citire I2C movf INDF,W ;copie valoarea temperaturii în registrul temp movwf temp rd_time movlw .3 ;transferă 3 octeți prin i2c movwf tmp_i2c ; movlw 0x00 ;setează adresa de registru secunde movwf adr_i2c ; apel read_i2c ;apel I2C citire subrutine apel err_prov ;verificare erori de scriere/citire I2C btfsc flag,2 ;modul de afișare de sondare flag goto met_8 ; apela vivod ; apelează subrutina pentru afișarea valorii orelor pe afișajul digital goto met_2 ; met_8 call vivod_temp ;apelarea subrutinei pentru afișarea temperaturii și a ceasului pe afișajul digital trece la met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;

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

#include

CONFIG H"3F10" ;Configurare microcontroler

errorlevel -302 ;nu afișați mesajele de eroare 302 în listă

Sec equ 0020h ;registre de numărare auxiliare

Sec1 equ 0021h ;

Sec2 equ 0022h ;

scetbit equ 0024h ;registru auxiliar pentru numărul de biți

perem equ 0025h ;registru auxiliar pentru byte de transmisie/recepție prin spi, i2c

temp equ 0026h ;registru de temperatură

perem_1 equ 0027h ;Registrul auxiliar BCD

rezultat equ 0028h ;registru auxiliar BCD

dat_ind equ 0029h ;registru de date pentru transmiterea spi

adr_ind equ 002Ah ;registru adrese spi

secunde equ 002Bh; se înregistrează secunde pentru a seta ora

minut equ 002Ch; înregistrează minute pentru a seta ora

ora equ 002Dh ;registrare oră pentru a seta ora

adr_i2c equ 002Eh; registre de rutină de transfer de interfață i2c

tmp_i2c equ 002Fh

slave_adr equ 0030h

data_i2c equ 0031h

flag equ 007Fh; registru de steag

#DEFINE int PORTB,0 ;linie de întrerupere INT/SQW DS3231

#DEFINE sda PORTB,1 ;Linie SDA pentru a conecta DS3231

#DEFINE scl PORTB,2 ;Linie SCL pentru a conecta DS3231

#DEFINE datai PORTB,5 ; MAX7219 linie de introducere a datelor driverului

#DEFINE cs PORTB,6 ; MAX7219 linie de selecție a driverului

#DEFINE clk PORTB,7 ; MAX7219 linia ceasului driverului

#DEFINE led PORTB,4 ;LED eroare i2c

#DEFINE led_sec PORTB,3 ; LED indicator ceas 1Hz

#DEFINE regim PORTA,2 ; Buton de indicare - schimba modul de afisare

#DEFINE nast PORTA,3 ;Buton de setare - intrați în modul de setare a orei

#DEFINE ust PORTA,4 ;Buton de setare - setarea valorii ceasului

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

org 0000h ;porniți execuția programului la adresa 0000h

du-te la Start; du-te la eticheta Start

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

;Program principal

Porniți movlw b"00000000"; setați valorile de blocare a ieșirii portului A

movlw b"01000000" ;setați valorile latch-ului de ieșire portului B

movlw b"00000111" ;opriți comparatoarele

bsf STATUS,RP0 ;selectați prima bancă

movlw b"00000111"; setați liniile I/O ale portului B

movwf TRISB ;RB0-RB2 - intrare, altele iesire

movlw b"11111111" ;configurați liniile I/O ale portului A

movwf TRISA; toate liniile de intrare

bcf STATUS,RP0 ;selectați banca 0

clrf flag ;resetează registrul steagului

apel init_lcd ;rutina de inițializare a driverului apel (MAX7219)

apelează viv_not ;afișează caracterele liniuțe „------”

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

movlw b"11010000" ;adresa dispozitivului (DS3231)

;Scrieți 4 octeți pentru a primi/transmite registre prin i2c

movlw data_i2c; setați primul registru de primire/transmitere i2c

movlw b"10000000";date pentru primul registru de secunde de alarmă

movlw b"10000000" ;date pentru registrul primului minut de alarmă

movlw b"10000000" ;date pentru primul registru al ceasului cu alarmă

movlw b"10000000" ;date pentru registrul de dată/zile săptămânii al primei alarme

movlw .4 ;transferă 4 octeți prin i2c

movlw 0x07 ;setați adresa registrului de secunde al primei alarme

". Să facem cunoștință cu modulul de ceas în timp real DS3231. Articolul conține instrucțiuni video, liste de programe, scopul și metodele de conectare a modulelor din familia DS la Arduino.

Modul ceas în timp real DS3231

Ce este modulul de ceas în timp real DS3231?

Modul ceas în timp real- acesta este un circuit electronic destinat inregistrarii datelor cronometrice (ora curenta, data, ziua saptamanii etc.), este un sistem de la o sursa de alimentare autonoma si un dispozitiv de contabilitate.

modul DS3231 Practic, este doar un ceas obișnuit. Plăcile Arduino au deja un ceas încorporat Millis, cu toate acestea, funcționează numai atunci când este aplicată puterea plăcii. Dezactivarea și reactivarea Arduino va reseta timpul Millis la zero. Și DS3231 are o baterie la bord, care, chiar și atunci când placa Arduino este oprită, continuă să „alimenteze” modulul, permițându-i să măsoare timpul.

Modulul poate fi folosit ca ceas sau ceas cu alarmă bazat pe plăci Arduino. Sau ca alertă pentru diverse sisteme, de exemplu, în Smart Home.

Specificațiile lui DS3231:

  • modulul calculează ore, minute, secunde, date, luni, ani (se iau în calcul anii bisecți până în 2100);
  • pentru a se conecta la diferite dispozitive, ceasul este conectat prin interfața I2C.

32K- Ieșire proiectată pentru a furniza energie externă> 12V.

SQW- Ieșire de semnal cu undă pătrată programabilă.

SCL– Prin acest pin, datele sunt schimbate cu ceasul prin interfața I2C.

SDA– Datele de la ceas sunt transmise prin acest pin.

VCC- Alimentare cu ceas în timp real, nevoie de 5 volți. Dacă nu este aplicată nicio tensiune acestui pin, ceasul intră în modul de repaus.

GND- Pământ.

Schema de cablare a ceasului în timp real DS3231 și program simplu

Pini SDA și SCL pe diferite plăci Arduino:

SDA SCL
O.N.U. A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Să conectăm modulul de ceas în timp real la Arduino UNO. SDA - pin A4, SCL - pin A5.

Următorul program este potrivit pentru ca modelul să funcționeze (puteți copia pur și simplu programul în Arduino IDE):

#include

void setup()(
întârziere (300);
Serial.begin(9600);
time.begin();
}
void loop()(



}
}

Această schiță este doar o numărătoare inversă.

În primul rând, în script, conectarea bibliotecii arduino_RTC.h.

În același loc, specificați numele exact al modulului dvs. pentru a lucra corect cu acesta.

Ca rezultat, obținem ieșirea de timp de la modulul DS3231 la monitorul portului. Afișează ore, minute, secunde.

În următoarea schiță, vom adăuga o funcție potriveste ora, permițându-vă să setați timpul inițial de numărătoare inversă.

#include
iarduino_RTC time(RTC_DS3231);
void setup()(
întârziere (300);
Serial.begin(9600);
time.begin();
time.settime(0,0,18,24,04,17,1); // 0 sec, 0 min, 18h, 24 aprilie 2017, luni
}
void loop()(
if(millis()%1000==0)( // dacă a trecut 1 secundă
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // timpul de ieșire
întârziere(1); // face o pauză de 1 ms pentru a nu afișa ora de mai multe ori în 1 ms
}
}

În exemplu, timpul începe să conteze de la 0 sec, 0 min, 18 ore, 24 aprilie 2017, luni.

Postări de lecție:

  1. Prima lectie: .
  2. A doua lecție: .
  3. A treia lecție: .
  4. A patra lecție: .
  5. A cincea lecție: .
  6. A șasea lecție: .
  7. A șaptea lecție: .
  8. A opta lecție: .
  9. A noua lecție:

Modulul DS3231 (RTC, ZS-042) este o placă cu cost redus, cu un ceas în timp real (RTC) extrem de precis, un oscilator cu cristal compensat de temperatură și un cristal. Modulul include o baterie cu litiu care menține funcționarea neîntreruptă chiar și atunci când sursa de alimentare este oprită. Oscilatorul integrat a îmbunătățit precizia dispozitivului și a făcut posibilă reducerea numărului de componente.

Specificatii tehnice

Tensiune de alimentare: 3,3 V și 5 V
Cip de memorie: AT24C32 (32Kb)
Precizie: ± 0,432 sec pe zi
Frecvența cuarțului: 32,768 kHz
Protocol suportat: I2C
Dimensiuni: 38mm x 22mm x 15mm

Informații generale

Majoritatea microcircuitelor, cum ar fi DS1307, folosesc un oscilator cu cristal extern de 32 kHz, dar au un dezavantaj semnificativ, atunci când temperatura se schimbă, frecvența cuarțului se modifică, ceea ce duce la o eroare de sincronizare. Această problemă este remediată în cipul DS3231, în interiorul căruia sunt instalate un oscilator cu cristal și un senzor de temperatură, care compensează schimbările de temperatură, astfel încât timpul să rămână precis (dacă este necesar, datele de temperatură pot fi citite). De asemenea, cipul DS3231 acceptă informații despre secunde, minute, ore, ziua săptămânii, dată, lună și an, precum și monitorizează numărul de zile dintr-o lună și efectuează o ajustare pentru anul bisect. Acceptă funcționarea ceasului în două formate 24 și 12 și este, de asemenea, posibilă programarea a două ceasuri cu alarmă. Modulul funcționează pe o magistrală I2C cu două fire.


Acum puțin despre modulul în sine, acesta este construit pe cipul DS3231N. Ansamblul de rezistență RP1 (4,7 kOhm) este necesar pentru a trage în sus liniile de 32K, SQW, SCL și SDA (apropo, dacă utilizați mai multe module cu o magistrală I2C, trebuie să lipiți rezistențele pull-up pe alte module). Al doilea ansamblu de rezistențe este necesar pentru a trage în sus liniile A0, A1 și A2, acestea sunt necesare pentru a schimba adresa cipul de memorie AT24C32N. Rezistorul R5 și dioda D1 servesc la reîncărcarea bateriei, în principiu pot fi lipite, deoarece o baterie convențională SR2032 durează ani de zile. Este instalat și un cip de memorie AT24C32N, acesta este ca un bonus, nu este necesar ca ceasul RTC DS3231N să funcționeze. Rezistorul R1 și LED-ul de alimentare semnalează că modulul este pornit. După cum am menționat, modulul funcționează pe magistrala I2C, pentru comoditate, aceste magistrale au fost aduse la doi conectori J1 și J2, alocarea contactelor rămase poate fi văzută mai jos. Scopul J1
32K: ieșire, frecvență 32 kHz
SQW: ieșire
SDA: linie de date (Serial Dfta)
VCC: puterea modulului „+”.
GND: puterea modulului „-”. Numirea J2
SCL: linie de ceas (Serial Clock)
SDA: linie de date (Serial Data)
VCC: puterea modulului „+”.
GND: puterea modulului „-”.


Vă spun puțin despre microcircuitul AT24C32N, acesta este un microcircuit cu memorie de 32k (EEPROM) de la producătorul Atmel, asamblat într-un pachet SOIC8, care funcționează pe o magistrală I2C cu două fire. Adresa microcircuitului este 0x57, dacă este necesar, poate fi schimbată cu ușurință folosind jumperii A0, A1 și A2 (acest lucru vă permite să creșteți numărul de microcircuite AT24C32 / 64 conectate). Deoarece cipul AT24C32N are trei intrări de adrese (A0, A1 și A2), care pot fi în două stări, fie un jurnal „1” fie un jurnal „0”, opt adrese sunt disponibile pentru cip. de la 0x50 la 0x57.

Conectarea DS3231 la Arduino

Detalii necesare:
Arduino UNO R3 x 1buc
Ceas în timp real pe DS3231, RTC, SPI, AT24C32 x 1 buc.
Sârmă DuPont, 2,54 mm, 20 cm, F-M (femă - masculin) x 1 buc.
Cablu USB 2.0 A-B x 1

Conexiune:
În acest exemplu, voi folosi doar modulul DS3231 și Arduino UNO R3, toate datele vor fi transferate în „Portul de monitorizare”. Circuitul nu este complicat, ai nevoie doar de patru fire, mai întâi conectăm magistrala I2C, SCL la A4 (Arduino UNO) și SDA la A5 (Arduino UNO), rămâne să conectăm alimentarea GND la GND și VCC la 5V (tu poate scrie și de la 3.3V), circuitul asamblat, acum trebuie să pregătim partea de software.

Biblioteca care funcționează cu DS3231 nu este în Arduino IDE, trebuie să descărcați „DS3231” și să-l adăugați la Arduino IDE.

Setarea orei DS3231
Prima dată când îl porniți, trebuie să programați ora, să deschideți exemplul din biblioteca DS3231 "File" -> "Examples" -> "DS3231" -> "Arduino" -> "DS3231_Serial_Easy", sau copiați codul de mai jos

/* Testarea a fost efectuată pe Arduino IDE 1.8.0 Data testului 31/08/2018. */ #include // Conectați biblioteca Wire DS3231 rtc(SDA, SCL); // Inițializați DS3231 void setup() ( Serial.begin(115200); // Setați conexiunea serială rtc.begin(); // Inițializați rtc // Setați ora rtc.setDOW(VINERI); // Setați ziua săptămânii rtc. setTime(16, 29, 0); // Setați ora la 16:29:00 (format de 24 de ore) rtc.setDate(31, 8, 2018); // Setați data la 31 august 2018 ) void loop() ( Serial. print(rtc.getDOWStr()); // Trimite ziua-săptămâna Serial.print(" "); Serial.print(rtc.getDateStr()); // Trimite data Serial.print( " -- "); Serial. println(rtc.getTimeStr()); // Întârziere de trimitere (1000); // Întârziere de o secundă )

Testarea a fost făcută pe Arduino IDE 1.8.0

Data testării 31.08.2018

#include // Includeți biblioteca Wire

DS3231 rtc (SDA, SCL); // Inițializați DS3231

void setup()

Serial. începe(115200); // Stabiliți o conexiune serială

rtc . start(); // Inițializați rtc

// Seteaza timpul

rtc . setDOW(VINERI) ; // Setați ziua săptămânii

rtc . setTime (16, 29, 0); // Setați ora la 16:29:00 (format de 24 de ore)

buclă goală ()

Serial. print (rtc . getDOWStr () ) ; // Trimite zi-săptămână

Serial. imprimare("");

Serial. print (rtc . getDateStr () ) ; // Trimiterea datei

Serial. imprimare("-");

Serial. println (rtc . getTimeStr () ); // Trimite ora

întârziere (1000); // Întârziere de o secundă

Încărcați schița în controlerul Arduino și deschideți „Monitor Port”

Această recenzie este pentru radioamatorii începători (entuziaști ai lipirii), pentru cei care sunt interesați de procesul în sine. Îți poți evalua abilitățile. Cipul DS3231 este un ceas în timp real (RTC) cu un oscilator cu cristal integrat și compensare termică.

Aceasta, desigur, nu este lipirea unui osciloscop. Nivel mai jos. Dar meseria este interesantă.
Să trecem repede prin ce formă a venit totul.


Conținutul era în două pungi. Genți standard cu fermoar. O pungă mică cu lucruri mărunte era în interiorul uneia mare.


Au fost incluse:
- Ca corp, două plăci din plastic translucid (nuanțate și protejate de o peliculă de zgârieturi).
- Taxa (calitate foarte mare).


Două matrice.


Pe partea din față sunt protejate de o peliculă. Picioarele au fost protejate cu polietilenă poroasă.


Cablu USB lungime de aproximativ un metru.


A aruncat tot ce a mai rămas.


Împărțit în două părți.
Șuruburi cu piulițe.


Și ce trebuie să lipiți.


O priză pentru o baterie cu litiu CR1220 foarte rară, un senzor de poziție cu mercur, o pereche de tranzistori, condensatori electrolitici, un stabilizator AMS1117 (3.3V), condensatori și rezistențe SMD (10K), 3 butoane, un conector USB, un sonerie.
Cel mai important este controlerul STC 15w1k24s și cipul DS3231 de înaltă precizie. Au fost ambalate într-un blister foarte dur, se încrețește foarte greu.


Nu a existat nicio schemă. Cu toate acestea, nu au fost întrebări, totul este clar.
Toate detaliile de pe tablă nu sunt doar semnate, ci și (condiționat) desenate.
Totul este simplu.
Dar mai întâi, pregătește-te.


Am început prin a lipi cele mai complexe două (credeam) microcircuite. Poziționat și apucat în două locuri (diametral opuse). Și apoi lipit corespunzător. Nu uitați să țineți ca să nu „pleacă”.


Apoi stabilizatorul.


tranzistor.


Patru rezistențe SMD și doi condensatori SMD. Poziționarea și apucarea de pe o margine nu a fost atât de ușoară (necesită abilitate). Si nu prea am :)


doi electroliți.


conector USB.


Soclu pentru baterie cu litiu.


Scârţâit. Nu uitați de avantajele și dezavantajele. După lipire, am mușcat picioarele cel mai mult, nu vreau să nu interferez mai târziu când lipim matrice.


Senzor de poziție cu mercur.


3 butoane.


Și în sfârșit, matrice. Acordați atenție orientării. Acesta este partea de sus (tweeter-ul va fi în stânga).


Iată ce sa întâmplat.


Adevărat, au rămas piese de schimb (în caz de pierdere, probabil): un tranzistor, două rezistențe și un condensator.


Spăl fluxul.
Verific.
Ei lucrează!
Scot folia de protecție.


Colectez.

După pornire, ceasul a fost felicitat de Anul Nou.


Nu e de mirare, la ceas pe 1 ianuarie 2000, 00 ore 01 minute.


Nu acordați atenție matricei multicolore. Rata de reîmprospătare a „ecranului” este proporțională cu viteza obturatorului camerei. Ochiul uman vede totul în culoarea roșie corectă. De aceea am draperii puțin geamurile când am filmat (pentru a crește viteza obturatorului).
Acum trebuie să ne instalăm.
Ceasul are trei butoane pe spate. Le-am numit chiar eu (de sus în jos):
1. Meniu.
2. Plus.
3. Minus.
Vezi algoritmul de reglare. Dacă ai un ceas în mână, chiar și ceea ce nu este clar va deveni mai clar decât clar 
Pentru a intra, țineți apăsat butonul de sus (meniu) pentru un timp. În continuare, lucrăm cu prese scurte.

O să explic ceva. Există șase meniuri în total. Schimbându-mă. Puteți folosi butonul plus, puteți folosi butonul minus.
TIME - setarea timpului.
DATA - setarea datei.
ALAR - setare alarmă.
FONT - selecția fontului (5 tipuri în total: thin wide anti-aliased ...).
DISP - selectarea algoritmului de afișare a informațiilor (poți doar să vizionezi, poți schimba secvențial informațiile: oră, temperatură, dată, sărbători cu o linie de rulare ...).
MIDP - selectarea tipului de puncte de împărțire.


Nu este ușor să explici totul în cuvinte. Am arătat-o ​​în detaliu în videoclip (link la final).
Și în acest videoclip (30 de secunde) puteți vedea algoritmul de afișare a informațiilor pe matrice (meniul DISP tip 2).


Notă importantă. Fără o baterie cu litiu, după setare, ora și data se pierd. Restul setărilor rămân în memorie.
Conectat la un încărcător obișnuit. Măsurați consumul.


Dispozitivul USB nu arată nimic atunci când consumă mai puțin de 50mA (o astfel de caracteristică).
Concluzie: în modul ceas, consumul de curent este mai mic de 50mA, în modul de rulare, aproximativ 70mA. Nu atat de mult.
Am masurat dimensiunile: 105 * 85mm.
Cifre în afișaj standard 20*30mm toată lumea.


L-am pus in fata televizorului.


Aproape că am uitat de senzorul de poziție cu mercur.
Ceasul va arăta întotdeauna corect, chiar dacă este întors cu susul în jos. Becul cu mercur fie închide, fie deschide contactele. În consecință, controlerul schimbă algoritmul de afișare a informațiilor pe matrice.
Aici, în general, atât.
E timpul să rezumam.
Un bun kit DIY pentru radioamatorii începători pentru a-și testa abilitățile. Mai mult, acesta nu este doar un set pentru antrenament, dar până la urmă s-a dovedit a fi un ceas bun.
Pentru concluzia corectă a ceea ce a scris, ar trebui să fie suficient.
Dacă ceva nu este clar, pune întrebări. Sper că a ajutat măcar pe cineva.
Noroc!

Produsul a fost furnizat pentru scrierea unei recenzii de către magazin. Revizuirea este publicată în conformitate cu clauza 18 din Regulile site-ului.

Plănuiesc să cumpăr +61 Adauga la favorite Mi-a placut recenzia +66 +122

Se încarcă...
Top