Përmbajtje:

Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino: 3 hapa
Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino: 3 hapa

Video: Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino: 3 hapa

Video: Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino: 3 hapa
Video: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Korrik
Anonim
Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino
Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino
Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino
Përdorimi i moduleve të orës në kohë reale DS1307 dhe DS3231 Me Arduino

Ne vazhdojmë të marrim kërkesa se si të përdorim modulet e orës në kohë reale DS1307 dhe DS3231 me Arduino nga burime të ndryshme-kështu që ky është i pari nga një tutorial dypalësh se si t'i përdorim ato. Për këtë tutorial Arduino kemi dy module të orës në kohë reale për t'u përdorur, një të bazuar në Maxim DS1307 (moduli katror) dhe DS3231 (moduli drejtkëndor).

Ekzistojnë dy dallime kryesore midis IC-ve në modulet e orës në kohë reale, që është saktësia e mbajtjes së kohës. DS1307 i përdorur në modulin e parë funksionon shumë mirë, megjithatë temperatura e jashtme mund të ndikojë në frekuencën e qarkut të oshilatorit i cili drejton numëruesin e brendshëm të DS1307.

Kjo mund të tingëllojë si një problem, megjithatë zakonisht do të rezultojë me orën që është fikur me rreth pesë minuta në muaj. DS3231 është shumë më i saktë, pasi ka një oshilator të brendshëm i cili nuk ndikohet nga faktorët e jashtëm - dhe kështu është i saktë deri në disa minuta në vit më së shumti. Nëse keni një modul DS1307- mos u ndjeni keq, është akoma një tabelë me vlerë të madhe dhe do t'ju shërbejë mirë. Me të dy modulet, kërkohet një bateri rezervë.

Ashtë një ide e mirë të blini një bateri të re CR2032 dhe ta përshtatni atë në modul. Së bashku me mbajtjen e kohës dhe datës, këto module gjithashtu kanë një EEPROM të vogël, një funksion alarmi (vetëm DS3231) dhe aftësinë për të gjeneruar një valë katrore të frekuencave të ndryshme-të gjitha këto do të jenë subjekt i një mësimi të dytë.

Hapi 1: Lidhni modulin tuaj me një Arduino

Të dy modulet përdorin autobusin I2C, gjë që e bën lidhjen shumë të lehtë.

Së pari ju do të duhet të identifikoni se cilat kunja në Arduino tuaj ose bordet e përputhshme përdoren për autobusin I2C - këto do të njihen si SDA (ose të dhëna) dhe SCL (ose orë). Në Arduino Uno ose tabela të pajtueshme, këto kunja janë A4 dhe A5 për të dhëna dhe orë; Në Arduino Mega kunjat janë D20 dhe D21 për të dhëna dhe orë; Dhe nëse jeni duke përdorur një Pro Mini të pajtueshëm, kunjat janë A4 dhe A5 për të dhënat dhe orën, të cilat janë paralele me kunjat kryesore.

Moduli DS1307

Nëse keni modulin DS1307 do t'ju duhet të lidhni telat në tabelë, ose të lidhni në disa kunja të titujve të brendshëm, në mënyrë që të përdorni tela kërcyes. Pastaj lidhni kunjat SCL dhe SDA me Arduino tuaj, dhe kunjin Vcc me pin 5V dhe GND me GND.

Moduli DS3231

Lidhja e këtij moduli është e lehtë pasi kunjat e kokës janë instaluar në tabelë në fabrikë. Ju thjesht mund të kaloni telat e kërcyesit përsëri nga SCL dhe SDA në Arduino dhe përsëri nga kunjat e modulit Vcc dhe GND në 5V ose 3.3. V dhe GND të bordit tuaj. Sidoqoftë, këto janë kopjuar në anën tjetër për bashkimin e telave tuaj. Të dyja këto module kanë rezistorët e kërkuar tërheqës, kështu që nuk keni nevojë të shtoni tuajin. Ashtu si të gjitha pajisjet e lidhura me autobusin I2C, përpiquni të mbani gjatësinë e telave SDA dhe SCL në minimum.

Hapi 2: Leximi dhe shkrimi i kohës nga moduli juaj RTC

Pasi të keni lidhur tela modulin tuaj RTC. futni dhe ngarkoni skicën e mëposhtme. Edhe pse shënimet dhe funksionet në skicë i referohen vetëm DS3231, kodi gjithashtu punon me DS1307.

#përfshi "Wire.h" #përcakto DS3231_I2C_ADDRESS 0x68 // Shndërro numrat dhjetorë normalë në bajt dhjetor të koduar binar decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Shndërroni dhjetorin e koduar binar në numrat dhjetorë normal byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.filloj (9600); // vendosni kohën fillestare këtu: // DS3231 sekonda, minuta, orë, ditë, datë, muaj, vit // setDS3231 kohë (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte sekondë, bajt minutë, orë byte, ditë byteOfWeek, byte dayOfMonth, muaj byte, vit byte) {// vendos të dhënat e kohës dhe datës në DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // vendos hyrjen tjetër për të filluar në regjistrin e sekondave Wire.write (decToBcd (e dyta)); // vendos sekonda Wire.write (decToBcd (minutë)); // caktoni minuta Wire.write (decToBcd (orë)); // cakto orët Wire.write (decToBcd (dayOfWeek)); // cakto ditën e javës (1 = e diel, 7 = e shtunë) Wire.write (decToBcd (dayOfMonth)); // cakto datën (1 deri 31) Wire.write (decToBcd (muaj)); // cakto muajin Wire.write (decToBcd (viti)); // viti i caktuar (0 në 99) Wire.endTransmission (); } void readDS3231time (bajt *sekondë, bajt *minutë, bajt *orë, bajt *ditëOfWeek, byte *dayOfMonth, bajt *muaj, bajt *vit) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // vendosni treguesin e regjistrit DS3231 në 00h Wire.endTransmission (); Tela. KërkohetNga (DS3231_I2C_ADDRESS, 7); // kërkoni shtatë byte të dhënash nga DS3231 duke filluar nga regjistri 00h *i dyti = bcdToDec (Wire.read () & 0x7f); *minutë = bcdToDec (Wire.read ()); *orë = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *muaj = bcdToDec (Wire.read ()); *vit = bcdToDec (Wire.read ()); } void displayTime () {byte sekondë, minutë, orë, dayOfWeek, dayOfMonth, muaj, vit; // marrim të dhëna nga DS3231 readDS3231time (& e dyta, & minuta, & orë, & dayOfWeek, & dayOfMonth, & month, & year); // dërgojeni në monitorin serik Serial.print (orë, DEC); // konvertoni ndryshoren e bajtit në një numër dhjetor kur shfaqet Serial.print (":"); nëse (minuta <10) {Serial.print ("0"); } Serial.print (minutë, DEC); Serial.print (":"); nëse (e dyta <10) {Serial.print ("0"); } Serial.print (e dyta, DEC); Serial.print (""); Serial.print (dayOmMth, DEC); Serial.print ("/"); Serial.print (muaj, DEC); Serial.print ("/"); Serial.print (viti, DEC); Serial.print ("Dita e javës:"); switch (dayOfWeek) {rasti 1: Serial.println ("E diela"); pushim; rasti 2: Serial.println ("E Hënë"); pushim; rasti 3: Serial.println ("E martë"); pushim; rasti 4: Serial.println ("E Mërkurë"); pushim; rasti 5: Serial.println ("E enjte"); pushim; rasti 6: Serial.println ("E Premte"); pushim; rasti 7: Serial.println ("E shtunë"); pushim; }} void loop () {displayTime (); // shfaq të dhënat e orës në kohë reale në Serial Monitor, vonesë (1000); // çdo sekond }

Mund të ketë shumë kod, megjithatë ai ndahet mirë në pjesë të menaxhueshme.

Së pari përfshin bibliotekën Wire, e cila përdoret për komunikimin e autobusëve I2C, e ndjekur nga përcaktimi i adresës së autobusit për RTC si 0x68. Këto ndiqen nga dy funksione që shndërrojnë numrat dhjetorë në BCD (dhjetor i koduar në binar) dhe anasjelltas. Këto janë të nevojshme pasi IC -të RTC punojnë në BCD jo dhjetore.

Funksioni setDS3231time () përdoret për të vendosur orën. Përdorimi i tij është shumë i thjeshtë, thjesht futni vlerat nga viti në sekondë dhe RTC do të fillojë nga ajo kohë. Për shembull, nëse doni të caktoni datën dhe orën e mëposhtme - e mërkurë 26 nëntor 2014 dhe 21:42 pasdite dhe 30 sekonda - do të përdorni:

setDS3231 kohë (30, 42, 21, 4, 26, 11, 14);

Hapi 3:

Vini re se koha është vendosur duke përdorur kohën 24-orëshe, dhe parametri i katërt është "dita e javës". Kjo bie midis 1 dhe 7 që është respektivisht nga e diela në të shtunë. Këta parametra janë vlera të bajtit nëse jeni duke subvencionuar ndryshoret tuaja.

Pasi të keni ekzekutuar funksionin sapo është e mençur ta parashtroni atë me // dhe të ngarkoni përsëri kodin tuaj, kështu që nuk do të rivendosë kohën pasi të jetë cikluar fuqia ose të rivendoset mikrokontrolluesi. Leximi i kohës nga RTC juaj është po aq i thjeshtë, në fakt procesi mund të ndiqet me kujdes brenda funksionit displayTime (). Ju do të duhet të përcaktoni shtatë variabla bajt për të ruajtur të dhënat nga RTC, dhe këto pastaj futen në funksionin readDS3231time (). Për shembull, nëse ndryshoret tuaja janë:

byte sekondë, minutë, orë, ditëPërjavë, ditëMuaj, muaj, vit;

… Ju do t'i rifreskoni me të dhënat aktuale nga RTC duke përdorur:

readDS3232kohë (& e dyta, & minuta, & orë, & dayOfWeek, & dayOfMonth, & month, & year);

Pastaj mund të përdorni variablat ashtu siç e shihni të arsyeshme, nga dërgimi i kohës dhe datës në monitorin serik siç bën skica e shembullit - deri në konvertimin e të dhënave në një formë të përshtatshme për të gjitha llojet e pajisjeve dalëse.

Vetëm për të kontrolluar që gjithçka po funksionon, futni kohën dhe datën e duhur në skicën e demonstrimit, ngarkoni atë, komentoni funksionin setDS3231time () dhe ngarkojeni përsëri. Pastaj hapni monitorin serik dhe ju duhet të pajiseni me një ekran të funksionimit të kohës dhe datës aktuale.

Nga kjo pikë tani ju keni mjetet softuerike për t'i vendosur të dhënat dhe për t'i tërhequr ato nga moduli juaj i orës në kohë reale, dhe shpresojmë se keni një kuptim se si t'i përdorni këto module të lira.

Mund të mësoni më shumë rreth IC-ve të veçanta të orës në kohë reale nga faqja e internetit e prodhuesit-DS1307 dhe DS3231.

Ky postim ju është sjellë nga pmdway.com - gjithçka për prodhuesit dhe entuziastët e elektronikës, me shpërndarje falas në të gjithë botën.

Recommended: