Satura rādītājs:

Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino: 3 soļi
Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino: 3 soļi

Video: Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino: 3 soļi

Video: Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino: 3 soļi
Video: FLProg7: часы реального времени и температура | ESP32 NodeMCU | Визуальное программирование для 2024, Decembris
Anonim
Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino
Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino
Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino
Izmantojot DS1307 un DS3231 reāllaika pulksteņa moduļus ar Arduino

Mēs nepārtraukti saņemam pieprasījumus par DS1307 un DS3231 reāllaika pulksteņa moduļu izmantošanu kopā ar Arduino no dažādiem avotiem-tāpēc šī ir pirmā no divu daļu apmācības par to izmantošanu. Šajā Arduino apmācībā mums ir jāizmanto divi reāllaika pulksteņa moduļi, viens balstīts uz Maxim DS1307 (kvadrātveida modulis) un DS3231 (taisnstūra modulis).

Pastāv divas galvenās atšķirības starp reālā laika pulksteņa moduļu IC, kas ir laika uzskaites precizitāte. Pirmajā modulī izmantotais DS1307 darbojas ļoti labi, tomēr ārējā temperatūra var ietekmēt oscilatora ķēdes frekvenci, kas vada DS1307 iekšējo skaitītāju.

Tas var šķist problēma, taču parasti pulkstenis tiek izslēgts apmēram piecas minūtes mēnesī. DS3231 ir daudz precīzāks, jo tam ir iekšējais oscilators, kuru neietekmē ārēji faktori, un tādējādi tas ir precīzs līdz dažām minūtēm gadā. Ja jums ir DS1307 modulis- nejūtieties slikti, tā joprojām ir lieliska vērtība un kalpos jums labi. Izmantojot abus moduļus, ir nepieciešams rezerves akumulators.

Ieteicams iegādāties jaunu CR2032 akumulatoru un ievietot to modulī. Paralēli laika un datuma uzskaitei šiem moduļiem ir arī neliels EEPROM, trauksmes funkcija (tikai DS3231) un iespēja ģenerēt dažādu frekvenču kvadrātveida viļņus-tas viss būs otras apmācības priekšmets.

1. darbība: moduļa pievienošana Arduino

Abos moduļos tiek izmantota I2C kopne, kas padara savienojumu ļoti vienkāršu.

Vispirms jums būs jānosaka, kuras tapas jūsu Arduino vai saderīgajās plāksnēs tiek izmantotas I2C kopnei - tās būs pazīstamas kā SDA (vai dati) un SCL (vai pulkstenis). Uz Arduino Uno vai saderīgām plāksnēm šīs tapas ir A4 un A5 datiem un pulkstenim; Arduino Mega tapas ir D20 un D21 datiem un pulkstenim; Un, ja izmantojat ar Pro Mini saderīgu, tapas ir A4 un A5 datiem un pulkstenim, kas ir paralēli galvenajām tapām.

DS1307 modulis

Ja jums ir DS1307 modulis, jums būs jāpielodē vadi pie tāfeles vai jāpielodē pie dažām iekšējām galvenes tapām, lai varētu izmantot džemperu vadus. Pēc tam pievienojiet SCL un SDA tapas savam Arduino un Vcc tapu 5V tapai un GND - GND.

DS3231 modulis

Šī moduļa pievienošana ir vienkārša, jo galvenes tapas ir uzstādītas uz tāfeles rūpnīcā. Jūs varat vienkārši atkal palaist džemperu vadus no SCL un SDA uz Arduino un atkal no moduļa Vcc un GND tapām uz tāfeles 5V vai 3.3. V un GND. Tomēr tie ir dublēti otrā pusē, lai lodētu savus vadus. Abiem šiem moduļiem ir nepieciešamie pievilkšanas rezistori, tāpēc jums nav jāpievieno savi. Tāpat kā visas ierīces, kas pievienotas I2C kopnei, mēģiniet samazināt SDA un SCL vadu garumu līdz minimumam.

2. darbība. Laika lasīšana un rakstīšana no RTC moduļa

Kad esat pievienojis savu RTC moduli. ievadiet un augšupielādējiet šādu skici. Lai gan skices piezīmes un funkcijas attiecas tikai uz DS3231, kods darbojas arī ar DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Pārveidot parastos decimāldaļskaitļus par bināri kodētiem decimālbaitiem decToBcd (baitu val) {return ((val/10*16) + (val%10)); } // Pārvērst bināro kodēto decimāldaļu par normāliem decimāldaļskaitļiem baitos bcdToDec (baitu val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Sērijas sākums (9600); // iestatiet šeit sākotnējo laiku: // DS3231 sekundes, minūtes, stundas, diena, datums, mēnesis, gads // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (baits sekunde, baits minūte, baits stunda, baits dayOfWeek, baits dayOfMonth, baits mēnesis, baits gads) {// nosaka laika un datuma datus uz DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // iestatiet nākamo ievadi, lai sāktu ar reģistru Wire.write (decToBcd (otrais)); // iestatīt sekundes Wire.write (decToBcd (minūte)); // iestatīt minūtes Wire.write (decToBcd (stunda)); // iestatīt stundas Wire.write (decToBcd (dayOfWeek)); // noteikt nedēļas dienu (1 = svētdiena, 7 = sestdiena) Wire.write (decToBcd (dayOfMonth)); // iestatīt datumu (no 1 līdz 31) Wire.write (decToBcd (mēnesis)); // iestatīt mēnesi Wire.write (decToBcd (gads)); // iestatīt gadu (no 0 līdz 99) Wire.endTransmission (); } void readDS3231time (baits *sekunde, baits *minūte, baits *stunda, baits *dayOfWeek, baits *dayOfMonth, baits *mēnesis, baits *gads) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // iestatiet DS3231 reģistra rādītāju uz 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // pieprasīt septiņus baitus datu no DS3231, sākot no reģistra 00h *second = bcdToDec (Wire.read () & 0x7f); *minūte = bcdToDec (Wire.read ()); *stunda = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mēnesis = bcdToDec (Wire.read ()); *gads = bcdToDec (Wire.read ()); } void displayTime () {baits sekunde, minūte, stunda, dayOfWeek, dayOfMonth, mēnesis, gads; // izgūt datus no DS3231 lasījuma DS3231time (& otrais, & minūti, & stundu, & dayOfWeek, & dayOfMonth, & month, & year); // nosūtīt to uz seriālo monitoru Serial.print (stunda, DEC); // pārvērš baitu mainīgo par decimāldaļu, kad tiek parādīts Serial.print (":"); ja (minūte <10) {Serial.print ("0"); } Sērijas nospiedums (minūte, DEC); Serial.print (":"); ja (otrais <10) {Serial.print ("0"); } Sērijas nospiedums (otrais, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Sērijas nospiedums (mēnesis, DEC); Serial.print ("/"); Sērijas nospiedums (gads, DEC); Serial.print ("Nedēļas diena:"); switch (dayOfWeek) {case 1: Serial.println ("Sunday"); pārtraukums; 2. gadījums: Serial.println ("pirmdiena"); pārtraukums; 3. gadījums: Serial.println ("otrdiena"); pārtraukums; 4. gadījums: Serial.println ("trešdiena"); pārtraukums; 5. gadījums: Serial.println ("ceturtdiena"); pārtraukums; 6. gadījums: Serial.println ("piektdiena"); pārtraukums; 7. gadījums: Serial.println ("sestdiena"); pārtraukums; }} void loop () {displayTime (); // parādīt reālā laika pulksteņa datus seriālajā monitorā, aizture (1000); // katru sekundi }

Koda var būt daudz, tomēr tas labi sadalās pārvaldāmās daļās.

Vispirms tajā ir iekļauta Wire bibliotēka, kas tiek izmantota I2C kopnes sakariem, kam seko RTC kopnes adreses definēšana kā 0x68. Tām seko divas funkcijas, kas decimālos skaitļus pārvērš BCD (binārā kodētā decimālā) un otrādi. Tie ir nepieciešami, jo RTC IC darbojas BCD, nevis decimāldaļās.

Pulksteņa iestatīšanai tiek izmantota funkcija setDS3231time (). To izmantot ir ļoti vienkārši, vienkārši ievietojiet vērtības no gada līdz otrai, un RTC sāksies no šī brīža. Piemēram, ja vēlaties iestatīt šādu datumu un laiku - trešdien, 2014. gada 26. novembrī un plkst. 21:42 un 30 sekundes, izmantojiet:

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

3. darbība:

Ņemiet vērā, ka laiks tiek iestatīts, izmantojot 24 stundu laiku, un ceturtais parametrs ir “nedēļas diena”. Tas ir no 1 līdz 7, kas ir attiecīgi no svētdienas līdz sestdienai. Šie parametri ir baitu vērtības, ja aizstājat savus mainīgos.

Kad esat palaidis šo funkciju, ir saprātīgi to papildināt ar // un augšupielādēt kodu vēlreiz, tāpēc tas neatiestatīs laiku, kad barošana ir ieslēgta vai mikrokontrolleris ir atiestatīts. Laika nolasīšana no RTC ir tikpat vienkārša, patiesībā procesu var kārtīgi sekot līdzi funkcijai displayTime (). Lai saglabātu datus no RTC, jums būs jānosaka septiņi baitu mainīgie, un tie tiek ievietoti funkcijā readDS3231time (). Piemēram, ja jūsu mainīgie ir:

baits otrais, minūte, stunda, diena, nedēļa, diena, mēnesis, mēnesis, gads;

… Jūs tos atsvaidzinātu ar pašreizējiem RTC datiem, izmantojot:

readDS3232time (& otrais, & minūti, & stunda, & dayOfWeek, & dayOfMonth, & month, & year);

Tad jūs varat izmantot mainīgos pēc saviem ieskatiem, sākot no laika un datuma nosūtīšanas sērijveida monitoram, kā tas ir skices paraugā - līdz datu pārveidošanai piemērotā formā visu veidu izvadierīcēm.

Lai pārbaudītu, vai viss darbojas, demonstrācijas skicē ievadiet atbilstošo laiku un datumu, augšupielādējiet to, komentējiet funkciju setDS3231time () un augšupielādējiet to vēlreiz. Pēc tam atveriet seriālo monitoru, un jums vajadzētu nodrošināt pašreizējā laika un datuma displeju.

No šī brīža jums ir programmatūras rīki, lai iestatītu datus un izgūtu tos no sava reālā laika pulksteņa moduļa, un mēs ceram, ka jums ir izpratne par šo lēto moduļu izmantošanu.

Jūs varat uzzināt vairāk par konkrētajiem reālā laika pulksteņa IC ražotāja vietnē-DS1307 un DS3231.

Šo ziņu jums sniedza pmdway.com - viss veidotājiem un elektronikas entuziastiem ar bezmaksas piegādi visā pasaulē.

Ieteicams: