Cuprins:

Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino: 3 pași
Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino: 3 pași

Video: Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino: 3 pași

Video: Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino: 3 pași
Video: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Noiembrie
Anonim
Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino
Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino
Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino
Utilizarea modulelor de ceas DS1307 și DS3231 în timp real cu Arduino

Primim în continuare solicitări privind modul de utilizare a modulelor de ceas DS1307 și DS3231 în timp real cu Arduino din diverse surse - deci acesta este primul dintr-un tutorial în două părți despre cum să le folosim. Pentru acest tutorial Arduino avem de utilizat două module de ceas în timp real, unul bazat pe Maxim DS1307 (modulul pătrat) și DS3231 (modulul dreptunghiular).

Există două diferențe principale între CI-urile de pe modulele de ceas în timp real, care este acuratețea timpului. DS1307 utilizat în primul modul funcționează foarte bine, cu toate acestea temperatura externă poate afecta frecvența circuitului oscilatorului care acționează contorul intern al DS1307.

Acest lucru poate suna ca o problemă, cu toate acestea, de obicei va avea ca rezultat ceasul oprit cu aproximativ cinci minute pe lună. DS3231 este mult mai precis, deoarece are un oscilator intern care nu este afectat de factori externi - și, prin urmare, este corect până la cel mult câteva minute pe an. Dacă aveți un modul DS1307 - nu vă simțiți rău, este încă o placă de valoare excelentă și vă va servi bine. Cu ambele module, este necesară o baterie de rezervă.

Este o idee bună să cumpărați o baterie nouă CR2032 și să o încadrați în modul. Împreună cu urmărirea orei și a datei, aceste module au, de asemenea, o EEPROM mică, o funcție de alarmă (numai DS3231) și capacitatea de a genera o undă pătrată cu diferite frecvențe - toate acestea vor face obiectul unui al doilea tutorial.

Pasul 1: Conectarea modulului dvs. la un Arduino

Ambele module utilizează magistrala I2C, ceea ce face conexiunea foarte ușoară.

Mai întâi va trebui să identificați pinii de pe Arduino sau plăcile compatibile care sunt utilizate pentru magistrala I2C - acestea vor fi cunoscute ca SDA (sau date) și SCL (sau ceas). Pe Arduino Uno sau plăcile compatibile, acești pini sunt A4 și A5 pentru date și ceas; Pe Arduino Mega pinii sunt D20 și D21 pentru date și ceas; Și dacă utilizați un Pro Mini-compatibil pinii sunt A4 și A5 pentru date și ceas, care sunt paralele cu pinii principali.

Modulul DS1307

Dacă aveți modulul DS1307, va trebui să lipiți firele pe placa sau să lipiți pe niște pini de antet în linie, astfel încât să puteți utiliza fire jumper. Apoi conectați pinii SCL și SDA la Arduino și pinul Vcc la pinul de 5V și GND la GND.

Modulul DS3231

Conectarea acestui modul este ușoară, deoarece pinii antetului sunt instalați pe placă din fabrică. Puteți pur și simplu să rulați fire jumper din SCL și SDA pe Arduino și din nou de la pinii Vcc și GND ai modulului la 5V sau 3.3. V și GND ai plăcii dvs. Cu toate acestea, acestea sunt duplicate pe cealaltă parte pentru lipirea propriilor fire. Ambele module au rezistențele de tracțiune necesare, deci nu este nevoie să le adăugați. Ca toate dispozitivele conectate la magistrala I2C, încercați să mențineți lungimea firelor SDA și SCL la minimum.

Pasul 2: Citirea și scrierea timpului din modulul dvs. RTC

După ce v-ați conectat modulul RTC. introduceți și încărcați următoarea schiță. Deși notele și funcțiile din schiță se referă doar la DS3231, codul funcționează și cu DS1307.

#includeți "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Convertiți numerele zecimale normale în octet zecimal codat binar decToBcd (octet val) {return ((val / 10 * 16) + (val% 10)); } // Convertiți zecimale codate binare în cifre zecimale normale octet bcdToDec (octet val) {return ((val / 16 * 10) + (val% 16)); } void setup () {Wire.begin (); Serial.begin (9600); // setați ora inițială aici: // DS3231 secunde, minute, ore, zi, dată, lună, an // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (octet secund, octet minut, octet oră, octet ziOfWeek, octet ziOfMonth, octet lună, octet an) {// setează datele orei și datei la DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // setați următoarea intrare pentru a începe la registrul secundar Wire.write (decToBcd (second)); // setează secunde Wire.write (decToBcd (minute)); // setează minute Wire.write (decToBcd (oră)); // setează ore Wire.write (decToBcd (dayOfWeek)); // setează ziua săptămânii (1 = duminică, 7 = sâmbătă) Wire.write (decToBcd (dayOfMonth)); // setați data (1 la 31) Wire.write (decToBcd (lună)); // setează luna Wire.write (decToBcd (anul)); // setează anul (de la 0 la 99) Wire.endTransmission (); } void readDS3231time (octet * secundă, octet * minut, octet * oră, octet * dayOfWeek, octet * dayOfMonth, octet * lună, octet * an) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // setați indicatorul de înregistrare DS3231 la 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // solicitați șapte octeți de date de la DS3231 începând cu registrul 00h * second = bcdToDec (Wire.read () & 0x7f); * minute = bcdToDec (Wire.read ()); * ora = bcdToDec (Wire.read () & 0x3f); * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * luna = bcdToDec (Wire.read ()); * an = bcdToDec (Wire.read ()); } void displayTime () {octet secundă, minut, oră, dayOfWeek, dayOfMonth, luna, anul; // preluați date din DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // trimiteți-l la monitorul serial Serial.print (oră, DEC); // convertiți variabila de octeți într-un număr zecimal când este afișat Serial.print (":"); if (minut <10) {Serial.print ("0"); } Serial.print (minut, DEC); Serial.print (":"); if (second <10) {Serial.print ("0"); } Serial.print (al doilea, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (lună, DEC); Serial.print ("/"); Serial.print (an, DEC); Serial.print („Ziua săptămânii:”); switch (dayOfWeek) {caz 1: Serial.println ("duminică"); pauză; cazul 2: Serial.println ("luni"); pauză; caz 3: Serial.println („marți”); pauză; caz 4: Serial.println („miercuri”); pauză; caz 5: Serial.println ("joi"); pauză; caz 6: Serial.println ("Vineri"); pauză; caz 7: Serial.println („sâmbătă”); pauză; }} void loop () {displayTime (); // afișează datele ceasului în timp real pe monitorul serial, întârziere (1000); // fiecare secunda }

S-ar putea să existe o mulțime de cod, cu toate acestea se descompune bine în părți ușoare.

Mai întâi include biblioteca Wire, care este utilizată pentru comunicația magistrală I2C, urmată de definirea adresei magistralei pentru RTC ca 0x68. Acestea sunt urmate de două funcții care convertesc numerele zecimale în BCD (zecimal cu cod binar) și invers. Acestea sunt necesare deoarece IC-urile RTC funcționează în BCD nu zecimal.

Funcția setDS3231time () este utilizată pentru a seta ceasul. Folosirea acestuia este foarte ușoară, simplă, introduceți valorile de la anul până la al doilea, iar RTC va începe din acel moment. De exemplu, dacă doriți să setați următoarea dată și oră - miercuri 26 noiembrie 2014 și 21:42 și 30 de secunde - ați utiliza:

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

Pasul 3:

Rețineți că ora este setată folosind 24 de ore, iar al patrulea parametru este „ziua săptămânii”. Aceasta se încadrează între 1 și 7, care este, respectiv, de duminică până sâmbătă. Acești parametri sunt valori de octeți dacă înlocuiți propriile variabile.

Odată ce ați rulat funcția, este înțelept să o prefixați cu // și să încărcați din nou codul dvs., astfel încât acesta să nu reseteze ora după ce a fost pornită alimentarea sau resetarea microcontrolerului. Citirea timpului din RTC este la fel de simplă, de fapt procesul poate fi urmărit cu grijă în interiorul funcției displayTime (). Va trebui să definiți variabile de șapte octeți pentru a stoca datele de la RTC, iar acestea sunt apoi inserate în funcția readDS3231time (). De exemplu, dacă variabilele dvs. sunt:

octet secund, minut, oră, dayOfWeek, dayOfMonth, lună, an;

… le-ați reîmprospăta cu datele actuale de la RTC folosind:

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

Apoi, puteți utiliza variabilele după cum doriți, de la trimiterea datei și orei la monitorul serial, așa cum face schița de exemplu - la conversia datelor într-o formă adecvată pentru tot felul de dispozitive de ieșire.

Doar pentru a verifica dacă totul funcționează, introduceți ora și data corespunzătoare în schița demonstrativă, încărcați-o, comentați funcția setDS3231time () și încărcați-o din nou. Apoi deschideți monitorul serial și ar trebui să vi se furnizeze un afișaj în funcțiune al datei și orei curente.

Din acest moment, aveți acum instrumentele software pentru setarea și preluarea datelor de pe modulul dvs. de ceas în timp real și sperăm să înțelegeți cum să utilizați aceste module ieftine.

Puteți afla mai multe despre IC-urile de ceas în timp real de pe site-ul web al producătorului - DS1307 și DS3231.

Această postare ți-a fost adusă de pmdway.com - totul pentru producătorii și pasionații de electronice, cu livrare gratuită în toată lumea.

Recomandat: