Talaan ng mga Nilalaman:

Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino: 3 Hakbang
Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino: 3 Hakbang

Video: Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino: 3 Hakbang

Video: Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino: 3 Hakbang
Video: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 2024, Disyembre
Anonim
Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino
Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino
Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino
Paggamit ng DS1307 at DS3231 Real-time Clock Modules Sa Arduino

Patuloy kaming nakakakuha ng mga kahilingan kung paano gamitin ang DS1307 at DS3231 real-time na mga module ng orasan kasama ang Arduino mula sa iba't ibang mga mapagkukunan - kaya't ito ang una sa isang dalawang bahagi na tutorial sa kung paano gamitin ang mga ito. Para sa Arduino tutorial na ito mayroon kaming dalawang real-time na mga module ng orasan na gagamitin, isa batay sa Maxim DS1307 (ang parisukat na module) at ang DS3231 (ang parihabang module).

Mayroong dalawang pangunahing pagkakaiba sa pagitan ng mga IC sa mga real-time na module ng orasan, na kung saan ay ang kawastuhan ng pag-iingat ng oras. Ang DS1307 na ginamit sa unang module ay gumagana nang mahusay, subalit ang panlabas na temperatura ay maaaring makaapekto sa dalas ng oscillator circuit na nagtutulak sa panloob na counter ng DS1307.

Ito ay maaaring parang isang problema, subalit kadalasang magreresulta sa pag-on ng orasan ng halos lima o higit pang mga minuto bawat buwan. Ang DS3231 ay mas tumpak, dahil mayroon itong panloob na oscillator na hindi apektado ng panlabas na mga kadahilanan - at sa gayon ay tumpak na hanggang sa ilang minuto bawat taon na pinakamarami. Kung mayroon kang isang module na DS1307- huwag masama, ito ay isang mahusay na board ng halaga at maglilingkod sa iyo nang maayos. Sa parehong mga module, kinakailangan ng backup na baterya.

Mahusay na ideya na bumili ng isang bagong baterya ng CR2032 at akma ito sa modyul. Kasabay ng pagsubaybay sa oras at petsa, ang mga modyul na ito ay mayroon ding isang maliit na EEPROM, isang pagpapaandar ng alarma (DS3231 lamang) at ang kakayahang makabuo ng isang square-wave ng iba't ibang mga frequency - na lahat ay magiging paksa ng isang pangalawang tutorial.

Hakbang 1: Pagkonekta sa Iyong Modyul sa isang Arduino

Ang parehong mga module ay gumagamit ng I2C bus, na ginagawang napakadali ng koneksyon.

Una kailangan mong kilalanin kung aling mga pin sa iyong Arduino o mga katugmang board ang ginagamit para sa I2C bus - malalaman ito bilang SDA (o data) at SCL (o orasan). Sa Arduino Uno o mga katugmang board, ang mga pin na ito ay A4 at A5 para sa data at orasan; Sa Arduino Mega ang mga pin ay D20 at D21 para sa data at orasan; At kung gumagamit ka ng isang Pro Mini-compatible ang mga pin ay A4 at A5 para sa data at orasan, na parallel sa mga pangunahing pin.

Modyul ng DS1307

Kung mayroon kang module ng DS1307 kakailanganin mong maghinang ang mga wire sa board, o maghinang sa ilang mga inline header pin upang maaari mong gamitin ang mga jumper wires. Pagkatapos ay ikonekta ang mga pin ng SCL at SDA sa iyong Arduino, at ang Vcc pin sa 5V pin at GND sa GND.

Module ng DS3231

Madali ang pagkonekta sa modyul na ito habang naka-install ang mga pin ng header sa board sa pabrika. Maaari mo lamang patakbuhin muli ang mga jumper wires muli mula sa SCL at SDA hanggang sa Arduino at muli mula sa mga module ng Vcc at GND na module sa 5V o 3.3. V at GND ng iyong board. Gayunpaman ang mga ito ay nadoble sa kabilang panig para sa paghihinang ng iyong sariling mga wire. Parehong ng mga modyul na ito ay may kinakailangang mga resistors ng pull-up, kaya hindi mo kailangang idagdag ang iyong sarili. Tulad ng lahat ng mga aparato na nakakonekta sa I2C bus, subukan at panatilihin sa minimum ang haba ng mga wire ng SDA at SCL.

Hakbang 2: Pagbasa at Pagsulat ng Oras Mula sa Iyong Module ng RTC

Kapag na-wire mo na ang iyong module ng RTC. ipasok at i-upload ang sumusunod na sketch. Bagaman ang mga tala at pag-andar sa sketch ay tumutukoy lamang sa DS3231, gumagana rin ang code sa DS1307.

# isama ang "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // I-convert ang mga normal na decimal na numero sa binary coded decimal byte decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); } // convert binary coded decimal to normal decimal numbers byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); } void setup () {Wire.begin (); Serial.begin (9600); // itakda ang paunang oras dito: // DS3231 segundo, minuto, oras, araw, petsa, buwan, taon // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte pangalawa, byte minuto, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {// nagtatakda ng data ng oras at petsa sa DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // itakda ang susunod na input upang magsimula sa segundo magrehistro Wire.write (decToBcd (pangalawa)); // set segundo Wire.write (decToBcd (minuto)); // set minutes Wire.write (decToBcd (oras)); // set hours Wire.write (decToBcd (dayOfWeek)); // itinakda na araw ng linggo (1 = Linggo, 7 = Sabado) Wire.write (decToBcd (dayOfMonth)); // itinakdang petsa (1 hanggang 31) Wire.write (decToBcd (buwan)); // set month Wire.write (decToBcd (taon)); // set year (0 to 99) Wire.endTransmission (); } void readDS3231time (byte * segundo, byte * minuto, byte * hour, byte * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // set DS3231 register pointer to 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // humiling ng pitong byte ng data mula sa DS3231 simula sa pagrehistro 00h * segundo = bcdToDec (Wire.read () & 0x7f); * minuto = bcdToDec (Wire.read ()); * oras = bcdToDec (Wire.read () & 0x3f); * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * buwan = bcdToDec (Wire.read ()); * taon = bcdToDec (Wire.read ()); } void displayTime () {byte pangalawa, minuto, oras, dayOfWeek, dayOfMonth, buwan, taon; // retrieve data from DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // ipadala ito sa serial monitor Serial.print (oras, DEC); // convert the byte variable to a decimal number when ipinakita Serial.print (":"); kung (minuto <10) {Serial.print ("0"); } Serial.print (minuto, DEC); Serial.print (":"); kung (pangalawa <10) {Serial.print ("0"); } Serial.print (pangalawa, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (buwan, DEC); Serial.print ("/"); Serial.print (taon, DEC); Serial.print ("Araw ng linggo:"); switch (dayOfWeek) {case 1: Serial.println ("Sunday"); pahinga; kaso 2: Serial.println ("Lunes"); pahinga; kaso 3: Serial.println ("Martes"); pahinga; kaso 4: Serial.println ("Miyerkules"); pahinga; kaso 5: Serial.println ("Huwebes"); pahinga; kaso 6: Serial.println ("Biyernes"); pahinga; kaso 7: Serial.println ("Sabado"); pahinga; }} void loop () {displayTime (); // ipakita ang real-time na data ng orasan sa Serial Monitor, pagkaantala (1000); // bawat segundo }

Maaaring magkaroon ng maraming code, subalit masisira ito nang maayos sa mga bahagi na mapapamahalaan.

Ito ay unang nagsasama ng Wire library, na ginagamit para sa komunikasyon ng I2C bus, na sinusundan ng pagtukoy sa address ng bus para sa RTC bilang 0x68. Sinusundan ito ng dalawang pagpapaandar na nagko-convert ng mga decimal number sa BCD (binary-coded decimal) at vice versa. Kinakailangan ang mga ito dahil gumagana ang RTC ICs sa BCD hindi decimal.

Ang function setDS3231time () ay ginagamit upang itakda ang orasan. Napakadali ng paggamit nito, simpleng ipasok ang mga halaga mula taon hanggang sa pangalawa, at magsisimula ang RTC mula sa oras na iyon. Halimbawa kung nais mong itakda ang sumusunod na petsa at oras - Miyerkules Nobyembre 26, 2014 at 9:42 pm at 30 segundo - gagamitin mo ang:

itakda angDS3231time (30, 42, 21, 4, 26, 11, 14);

Hakbang 3:

Tandaan na ang oras ay itinakda gamit ang oras na 24 na oras, at ang ika-apat na paramter ay ang "araw ng linggo". Bumaba ito sa pagitan ng 1 at 7 na kung saan ay Linggo hanggang Sabado ayon sa pagkakabanggit. Ang mga parameter na ito ay byte na halaga kung nagsusumite ka ng iyong sariling mga variable.

Kapag napagana mo na ang pag-andar sa sandaling matalino na i-preview ito sa // at i-upload muli ang iyong code, kaya hindi nito mai-reset ang oras sa sandaling ang kuryente ay nai-cycled o i-reset ang micrcontroller. Ang pagbabasa ng oras na form ng iyong RTC Ay kasing simple, sa katunayan ang proseso ay maaaring sundin nang maayos sa loob ng pag-andar displayTime (). Kakailanganin mong tukuyin ang pitong mga byte na variable upang maiimbak ang data mula sa RTC, at pagkatapos ay ipinasok sa pagpapaandar na readDS3231time (). Halimbawa kung ang iyong mga variable ay:

byte pangalawa, minuto, oras, arawOfWeek, dayOfMonth, buwan, taon;

… ire-refresh mo ang mga ito sa kasalukuyang data mula sa RTC sa pamamagitan ng paggamit ng:

readDS3232time (& pangalawa, & minuto, & oras, & dayOfWeek, & dayOfMonth, & month, & year);

Pagkatapos ay maaari mong gamitin ang mga variable ayon sa nakikita mong akma, mula sa pagpapadala ng oras at petsa sa serial monitor tulad ng ginagawa ng halimbawa ng sketch - sa pag-convert ng data sa isang angkop na form para sa lahat ng uri ng mga output device.

Upang suriin lamang ang lahat ay gumagana, ipasok ang naaangkop na oras at petsa sa demonstration sketch, i-upload ito, i-comment ang setDS3231time () function at i-upload ito muli. Pagkatapos buksan ang serial monitor, at dapat kang bigyan ng isang tumatakbo na pagpapakita ng kasalukuyang oras at petsa.

Mula sa puntong ito mayroon ka na ngayong mga tool ng software upang magtakda ng data at makuha ito mula sa iyong real-time na module ng orasan, at inaasahan naming mayroon kang pag-unawa sa kung paano gamitin ang mga murang modyul na ito.

Maaari kang matuto nang higit pa tungkol sa partikular na mga real-time na IC ng orasan mula sa website ng tagagawa - DS1307 at DS3231.

Ang post na ito ay dinala sa iyo ng pmdway.com - lahat para sa mga tagagawa ng tagahanga at electronics, na may libreng paghahatid sa buong mundo.

Inirerekumendang: