Turinys:

DS1307 ir DS3231 realaus laiko laikrodžio modulių naudojimas naudojant „Arduino“: 3 žingsniai
DS1307 ir DS3231 realaus laiko laikrodžio modulių naudojimas naudojant „Arduino“: 3 žingsniai

Video: DS1307 ir DS3231 realaus laiko laikrodžio modulių naudojimas naudojant „Arduino“: 3 žingsniai

Video: DS1307 ir DS3231 realaus laiko laikrodžio modulių naudojimas naudojant „Arduino“: 3 žingsniai
Video: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 2024, Liepa
Anonim
Naudojant DS1307 ir DS3231 realaus laiko laikrodžio modulius su „Arduino“
Naudojant DS1307 ir DS3231 realaus laiko laikrodžio modulius su „Arduino“
DS1307 ir DS3231 realaus laiko laikrodžio modulių naudojimas su „Arduino“
DS1307 ir DS3231 realaus laiko laikrodžio modulių naudojimas su „Arduino“

Nuolat gauname užklausų, kaip naudoti DS1307 ir DS3231 realaus laiko laikrodžio modulius su „Arduino“iš įvairių šaltinių, todėl tai yra pirmoji iš dviejų dalių mokymo, kaip juos naudoti. Šiai „Arduino“pamokai turime naudoti du realaus laiko laikrodžio modulius, vieną iš „Maxim DS1307“(kvadratinis modulis) ir DS3231 (stačiakampį modulį).

Yra du pagrindiniai skirtumai tarp realaus laiko laikrodžio modulių IC, tai yra laiko laikymo tikslumas. Pirmajame modulyje naudojamas DS1307 veikia labai gerai, tačiau išorinė temperatūra gali turėti įtakos osciliatoriaus grandinės, kuri varo DS1307 vidinį skaitiklį, dažniui.

Tai gali atrodyti kaip problema, tačiau paprastai laikrodis išjungiamas maždaug penkias minutes per mėnesį. DS3231 yra daug tikslesnis, nes turi vidinį osciliatorių, kurio neveikia išoriniai veiksniai, todėl jis yra tikslus iki kelių minučių per metus. Jei turite DS1307 modulį- nesijauskite blogai, tai vis tiek yra labai vertinga plokštė ir jums puikiai pasitarnaus. Naudojant abu modulius, reikalinga atsarginė baterija.

Patartina nusipirkti naują CR2032 bateriją ir įdėti ją į modulį. Kartu su laiko ir datos stebėjimu šie moduliai taip pat turi mažą EEPROM, aliarmo funkciją (tik DS3231) ir galimybę generuoti įvairių dažnių kvadratines bangas-visa tai bus antroji pamoka.

1 veiksmas: modulio prijungimas prie „Arduino“

Abu moduliai naudoja I2C magistralę, todėl labai paprasta prijungti.

Pirmiausia turėsite nustatyti, kurie jūsų „Arduino“ar suderinamų plokščių kaiščiai naudojami I2C magistralėje - jie bus žinomi kaip SDA (arba duomenys) ir SCL (arba laikrodis). „Arduino Uno“arba suderinamose plokštėse šie kaiščiai yra A4 ir A5 duomenims ir laikrodžiui; „Arduino Mega“smeigtukai yra D20 ir D21 duomenims ir laikrodžiui; O jei naudojate „Pro Mini“suderinamus, smeigtukai yra A4 ir A5 duomenims ir laikrodžiui, kurie yra lygiagrečiai pagrindiniams kaiščiams.

DS1307 modulis

Jei turite modulį DS1307, turėsite lituoti laidus prie plokštės arba lituoti ant kai kurių vidinių antraščių kaiščių, kad galėtumėte naudoti jungiamuosius laidus. Tada prijunkite SCL ir SDA kaiščius prie „Arduino“, o Vcc kaištį - prie 5 V kaiščio, o GND - prie GND.

DS3231 modulis

Šį modulį lengva prijungti, nes ant plokštės gamykloje sumontuoti antgaliai. Galite tiesiog vėl paleisti trumpiklius iš SCL ir SDA į „Arduino“ir vėl iš modulio Vcc ir GND kaiščių į plokštės 5V arba 3.3. V ir GND. Tačiau jie yra dubliuojami kitoje pusėje, norint lituoti savo laidus. Abu šie moduliai turi reikiamus traukiamus rezistorius, todėl jums nereikia pridėti savo. Kaip ir visi įrenginiai, prijungti prie I2C magistralės, pabandykite sumažinti SDA ir SCL laidų ilgį iki minimumo.

2 žingsnis: laiko skaitymas ir rašymas iš RTC modulio

Prijungę RTC modulį. įveskite ir įkelkite šį eskizą. Nors eskizo pastabos ir funkcijos nurodo tik DS3231, kodas taip pat veikia su DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Konvertuoti įprastus dešimtainius skaičius į dvejetainį koduotą dešimtainį baitą decToBcd (baitas val) {return ((val/10*16) + (val%10)); } // Konvertuoti dvejetainį koduotą dešimtainį skaičių į normalius dešimtainius skaičius baitais bcdToDec (baitų val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // nustatykite pradinį laiką čia: // DS3231 sekundės, minutės, valandos, diena, data, mėnuo, metai // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (baitas sekundė, baitas minutė, baitas valanda, baitas dayOfWeek, baitas dayOfMonth, baitas mėnuo, baitas metai) {// nustato laiko ir datos duomenis į DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nustatyti kitą įvestį, kad prasidėtų sekundžių registras Wire.write (decToBcd (antras)); // nustatyti sekundes Wire.write (decToBcd (minutė)); // nustatyti minutes Wire.write (decToBcd (valanda)); // nustatyti valandas Wire.write (decToBcd (dayOfWeek)); // nustatoma savaitės diena (1 = sekmadienis, 7 = šeštadienis) Wire.write (decToBcd (dayOfMonth)); // nustatyti datą (nuo 1 iki 31) Wire.write (decToBcd (mėnuo)); // nustatyti mėnesį Wire.write (decToBcd (metai)); // nustatyti metai (nuo 0 iki 99) Wire.endTransmission (); } void readDS3231time (baitas *sekundė, baitas *minutė, baitas *valanda, baitas *dayOfWeek, baitas *dayOfMonth, baitas *mėnuo, baitas *metai) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // nustatyti DS3231 registro rodyklę į 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // prašyti septynių baitų duomenų iš DS3231, pradedant nuo registro 00h *second = bcdToDec (Wire.read () & 0x7f); *minutė = bcdToDec (Wire.read ()); *valanda = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *mėnuo = bcdToDec (Wire.read ()); *metai = bcdToDec (Wire.read ()); } void displayTime () {baitas sekundė, minutė, valanda, dienaOfWeek, dayOfMonth, mėnuo, metai; // gauti duomenis iš DS3231 skaitymo DS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // siųsti jį į serijinį monitorių Serial.print (valanda, DEC); // konvertuojant baitų kintamąjį į dešimtainį skaičių, kai rodomas Serial.print (":"); if (minutė <10) {Serial.print ("0"); } Serijinis atspaudas (minutė, DEC); Serial.print (":"); if (antras <10) {Serial.print ("0"); } Serial.print (antra, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serijinis atspaudas (mėnuo, DEC); Serial.print ("/"); Serijinis atspaudas (metai, DEC); Serial.print ("Savaitės diena:"); switch (dayOfWeek) {1 atvejis: Serial.println („sekmadienis“); pertrauka; 2 atvejis: Serial.println („pirmadienis“); pertrauka; 3 atvejis: Serial.println („antradienis“); pertrauka; 4 atvejis: Serial.println („trečiadienis“); pertrauka; 5 atvejis: Serial.println („ketvirtadienis“); pertrauka; 6 atvejis: Serial.println („penktadienis“); pertrauka; 7 atvejis: Serial.println („šeštadienis“); pertrauka; }} void loop () {displayTime (); // rodyti realaus laiko laikrodžio duomenis serijiniame monitoriuje, uždelsimas (1000); // kiekviena sekundė }

Kodo gali būti daug, tačiau jis gerai suskaidomas į valdomas dalis.

Pirmiausia jame yra „Wire“biblioteka, naudojama I2C magistralės ryšiui, po to RTC magistralės adresas apibrėžiamas kaip 0x68. Po jų eina dvi funkcijos, konvertuojančios dešimtainius skaičius į BCD (dvejetainiu koduotą dešimtainį) ir atvirkščiai. Tai būtina, nes RTC IC veikia BCD, o ne dešimtainiais.

Funkcija setDS3231time () naudojama laikrodžiui nustatyti. Jį naudoti labai paprasta, paprasta įterpti vertes nuo metų iki sekundžių, o RTC prasidės nuo to laiko. Pavyzdžiui, jei norite nustatyti šią datą ir laiką - 2014 m. Lapkričio 26 d., Trečiadienį ir 21:42 ir 30 sekundžių, naudokite:

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

3 žingsnis:

Atminkite, kad laikas nustatomas naudojant 24 valandų laiką, o ketvirtasis parametras yra „savaitės diena“. Tai yra nuo 1 iki 7, atitinkamai nuo sekmadienio iki šeštadienio. Šie parametrai yra baitų vertės, jei pakeičiate savo kintamuosius.

Paleidus funkciją vieną kartą, išmintinga ją priešrašyti // ir dar kartą įkelti kodą, todėl ji nenustatys laiko, kai maitinimas bus sustabdytas arba iš naujo nustatytas mikrovaldiklis. Laiko skaitymas iš RTC yra toks pat paprastas, iš tikrųjų procesą galima tvarkingai sekti funkcijoje displayTime (). Turite apibrėžti septynis baitų kintamuosius, kad išsaugotumėte duomenis iš RTC, ir jie įterpiami į funkciją readDS3231time (). Pavyzdžiui, jei jūsų kintamieji yra:

baitas antra, minutė, valanda, diena, savaitė, diena, mėnuo, mėnuo, metai;

… jūs atnaujintumėte juos dabartiniais RTC duomenimis naudodami:

readDS3232time (& sekundė, & minutė, valanda, & savaitės savaitė, & diena mėnesiui, & mėnuo ir metai);

Tada galite naudoti kintamuosius, kaip jums atrodo tinkama, pradedant laiko ir datos siuntimu į serijinį monitorių, kaip tai daroma eskizo pavyzdyje - iki duomenų konvertavimo į tinkamą visų išvesties įrenginių formą.

Tiesiog norėdami patikrinti, ar viskas veikia, į demonstracinį eskizą įveskite tinkamą laiką ir datą, įkelkite jį, pakomentuokite funkciją setDS3231time () ir įkelkite dar kartą. Tada atidarykite serijinį monitorių ir jums turėtų būti pateiktas esamas laikas ir data.

Nuo šiol jūs turite programinės įrangos įrankius, skirtus duomenims nustatyti ir iš jų gauti iš savo realaus laiko laikrodžio modulio, ir tikimės, kad supratote, kaip naudoti šiuos nebrangius modulius.

Daugiau apie konkrečius realaus laiko laikrodžio IC galite sužinoti gamintojo svetainėje-DS1307 ir DS3231.

Šį įrašą jums pateikė pmdway.com - viskas gamintojams ir elektronikos entuziastams, nemokamas pristatymas visame pasaulyje.

Rekomenduojamas: