Բովանդակություն:

Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով. 3 քայլ
Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով. 3 քայլ

Video: Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով. 3 քայլ

Video: Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով. 3 քայլ
Video: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Դեկտեմբեր
Anonim
Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով
Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով
Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով
Օգտագործելով DS1307 և DS3231 Իրական ժամանակի ժամացույցի մոդուլներ Arduino- ով

Մենք անընդհատ հարցում ենք ստանում այն մասին, թե ինչպես օգտագործել իրական ժամանակի DS1307 և DS3231 ժամացույցների մոդուլները Arduino- ով տարբեր աղբյուրներից, ուստի սա դրանցից օգտվելու երկու մասից բաղկացած առաջին ձեռնարկն է: Այս Arduino- ի ձեռնարկի համար մենք ունենք իրական ժամանակի ժամացույցի երկու մոդուլ, որոնցից մեկը հիմնված է Maxim DS1307 (քառակուսի մոդուլ) և DS3231 (ուղղանկյուն մոդուլ) վրա:

Իրական ժամանակի ժամացույցի մոդուլների IC- ների միջև կա երկու հիմնական տարբերություն, ինչը ժամանակի պահպանման ճշգրտությունն է: Առաջին մոդուլում օգտագործված DS1307- ը շատ լավ է աշխատում, սակայն արտաքին ջերմաստիճանը կարող է ազդել տատանումների միացման հաճախականության վրա, որը վարում է DS1307- ի ներքին հաշվիչը:

Սա կարող է հնչել որպես խնդիր, սակայն սովորաբար հանգեցնում է այն բանին, որ ժամացույցն անջատված է ամսական մոտ հինգ կամ ավելի րոպեով: DS3231- ը շատ ավելի ճշգրիտ է, քանի որ ունի ներքին տատանում, որի վրա արտաքին գործոններ չեն ազդում, ուստի ճշգրիտ է տարեկան մինչև մի քանի րոպե: Եթե ունեք DS1307 մոդուլ- վատ մի զգացեք, այն դեռ մեծ արժեք ունեցող տախտակ է և ձեզ լավ կծառայի: Երկու մոդուլների դեպքում էլ պահանջվում է պահեստային մարտկոց:

Լավ գաղափար է գնել նոր CR2032 մարտկոց և այն տեղավորել մոդուլին: Modամանակի և ամսաթվի հետագծման հետ մեկտեղ, այս մոդուլներն ունեն նաև փոքր EEPROM, ազդանշանային գործառույթ (միայն DS3231) և տարբեր հաճախականությունների քառակուսի ալիք առաջացնելու ունակություն, որոնք բոլորը երկրորդ ձեռնարկի առարկան կլինեն:

Քայլ 1. Ձեր մոդուլը Arduino- ին միացնելը

Երկու մոդուլներն էլ օգտագործում են I2C ավտոբուսը, ինչը շատ հեշտ է դարձնում կապը:

Նախ պետք է որոշեք, թե ձեր Arduino- ի ո՞ր կապերն են կամ համատեղելի տախտակները օգտագործվում I2C ավտոբուսի համար. Դրանք հայտնի կլինեն որպես SDA (կամ տվյալներ) և SCL (կամ ժամացույց): Arduino Uno- ի կամ համատեղելի տախտակների վրա տվյալների և ժամացույցի համար այս կապում են A4 և A5; Arduino Mega- ում կապում են D20 և D21 տվյալները և ժամացույցը. Եվ եթե դուք օգտագործում եք Pro Mini- համատեղելի, ապա կապումներն են A4 և A5: տվյալների և ժամացույցի համար, որոնք զուգահեռ են հիմնական կապերին:

DS1307 մոդուլ

Եթե ունեք DS1307 մոդուլը, ապա ձեզ հարկավոր է լարերը կպցնել տախտակին կամ կպցնել վերնագրի որոշ ներդիրների վրա, որպեսզի կարողանաք օգտագործել jumper լարերը: Այնուհետև SCL և SDA կապերը միացրեք ձեր Arduino- ին, իսկ Vcc կապը ՝ 5V, իսկ GND- ը ՝ GND- ին:

DS3231 մոդուլ

Այս մոդուլը միացնելը հեշտ է, քանի որ գործարանում տախտակի վրա տեղադրվում են վերնագրերի կապիչներ: Դուք պարզապես կարող եք նորից թռիչքային լարեր անցկացնել SCL- ից և SDA- ից մինչև Arduino և կրկին մոդուլի Vcc և GND կապումներից մինչև ձեր տախտակի 5V կամ 3.3. V և GND: Այնուամենայնիվ, դրանք կրկնօրինակվում են մյուս կողմից `ձեր սեփական լարերը զոդելու համար: Այս երկու մոդուլներն ունեն պահանջվող ձգման դիմադրիչներ, այնպես որ ձեզ հարկավոր չէ ավելացնել ձեր սեփականը: Ինչպես I2C ավտոբուսին միացված բոլոր սարքերը, այնպես էլ փորձեք SDA և SCL լարերի երկարությունը հասցնել նվազագույնի:

Քայլ 2: ingամանակ կարդալ և գրել ձեր RTC մոդուլից

Երբ դուք միացրել եք ձեր RTC մոդուլը: մուտքագրեք և վերբեռնեք հետևյալ ուրվագիծը: Չնայած էսքիզի նշումները և գործառույթները վերաբերում են միայն DS3231- ին, ծածկագիրը գործում է նաև DS1307- ի հետ:

#ներառել «Wire.h»#սահմանել DS3231_I2C_ADDRESS 0x68 // Փոխարկել նորմալ տասնորդական թվերը երկուական կոդավորված տասնորդական բայթ decToBcd (բայթ val) {վերադարձ ((val/10*16) + (val%10)); } // Երկուական կոդավորված տասնորդական դարձնել նորմալ տասնորդական թվեր բայթ bcdToDec (բայթ val) {վերադարձ ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // սկզբնական ժամը սահմանեք այստեղ ՝ // DS3231 վայրկյան, րոպե, ժամ, օր, ամսաթիվ, ամիս, տարի // setDS3231 ժամ (30, 42, 21, 4, 26, 11, 14); } void setDS3231 անգամ (բայթ վայրկյան, բայթ րոպե, բայթ ժամ, բայթ օրՕրԱ շաբաթ, բայթ օրՄայիս, բայթ ամիս, բայթ տարի) {// ժամանակի և ամսաթվի տվյալները սահմանում է DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // սահմանել հաջորդ մուտքագրումը ՝ վայրկյանների գրանցումից սկսելու համար Wire.write (decToBcd (երկրորդ)); // վայրկյաններ սահմանել Wire.write (decToBcd (րոպե)); // սահմանել րոպեներ Wire.write (decToBcd (ժամ)); // սահմանել ժամերը Wire.write (decToBcd (dayOfWeek)); // սահմանել շաբաթվա օրը (1 = կիրակի, 7 = շաբաթ) Wire.write (decToBcd (dayOfMonth)); // սահմանել ամսաթիվ (1 -ից 31 -ը) Wire.write (decToBcd (ամիս)); // սահմանել ամիս Wire.write (decToBcd (տարի)); // սահմանված տարի (0 -ից 99) Wire.endTransmission (); } void readDS3231 անգամ (բայթ *երկրորդ, բայթ *րոպե, բայթ *ժամ, բայթ *օրՕր շաբաթ, բայթ *օրԲոլոր ամիս, բայթ *ամիս, բայթ *տարի) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // սահմանել DS3231 գրանցման ցուցիչը 00h Wire.endTransmission (); Մետաղալար. Խնդրում ենք (DS3231_I2C_ADDRESS, 7); // պահանջել տվյալների յոթ բայթ DS3231- ից ՝ սկսած գրանցումից 00h *վայրկյան = bcdToDec (Wire.read () & 0x7f); *րոպե = bcdToDec (Wire.read ()); *ժամ = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *ամիս = bcdToDec (Wire.read ()); *տարի = bcdToDec (Wire.read ()); } void displayTime () {բայթ վայրկյան, րոպե, ժամ, dayOfWeek, dayOfMonth, ամիս, տարի; // տվյալների ստացում DS3231- ից readDS3231time (& երկրորդ, & րոպե, & ժամ, & dayOfWeek, & dayOfMonth, & month, & year); // ուղարկեք այն սերիական մոնիտորին Serial.print (ժամ, DEC); // փոխակերպել բայթ փոփոխականը տասնորդական համարի, երբ ցուցադրվում է Serial.print (":"); if (րոպե <10) {Serial.print ("0"); } Serial.print (րոպե, DEC); Serial.print (":"); if (երկրորդ <10) {Serial.print ("0"); } Serial.print (երկրորդ, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (ամիս, DEC); Serial.print ("/"); Serial.print (տարի, DEC); Serial.print («Շաբաթվա օր.»); switch (dayOfWeek) {case 1: Serial.println («կիրակի»); ընդմիջում; գործ 2: Serial.println («Երկուշաբթի»); ընդմիջում; դեպք 3: Serial.println («երեքշաբթի»); ընդմիջում; գործ 4: Serial.println («Չորեքշաբթի»); ընդմիջում; դեպք 5: Serial.println («հինգշաբթի»); ընդմիջում; դեպք 6: Serial.println («ուրբաթ»); ընդմիջում; գործ 7: Serial.println («Շաբաթ»); ընդմիջում; }} void loop () {displayTime (); // ցուցադրել սերիական մոնիտորի իրական ժամանակի ժամացույցի տվյալները, հետաձգում (1000); // ամեն վայրկյան }

Կարող է լինել շատ կոդ, սակայն այն լավ է բաժանվում կառավարելի մասերի:

Այն նախ ներառում է Wire գրադարանը, որն օգտագործվում է I2C ավտոբուսային հաղորդակցության համար, որին հաջորդում է RTC- ի ավտոբուսի հասցեի սահմանումը `0x68: Դրանց հաջորդում են երկու գործառույթներ, որոնք տասնորդական թվերը վերածում են BCD- ի (երկուական կոդավորված տասնորդական) և հակառակը: Սրանք անհրաժեշտ են, քանի որ RTC IC- ն աշխատում է BCD- ով և ոչ տասնորդական:

SetDS3231time () ֆունկցիան օգտագործվում է ժամացույցը կարգավորելու համար: Օգտագործելը շատ հեշտ է, տարեցից վայրկյան պարզ տեղադրեք արժեքները, և RTC- ն կսկսվի այդ ժամանակից: Օրինակ, եթե ցանկանում եք սահմանել հետևյալ ամսաթիվը և ժամը `չորեքշաբթի, 26 նոյեմբերի, 2014 և 21:42 և 30 վայրկյան, դուք կօգտագործեք.

setDS3231 անգամ (30, 42, 21, 4, 26, 11, 14);

Քայլ 3:

Նկատի ունեցեք, որ ժամանակը սահմանվում է ՝ օգտագործելով 24-ժամյա ժամ, և չորրորդ պարամետրը «շաբաթվա օրն» է: Սա ընկնում է 1 -ի և 7 -ի միջև, ինչը համապատասխանաբար կիրակիից շաբաթ է: Այս պարամետրերը բայթ արժեքներ են, եթե դուք ենթարկում եք ձեր սեփական փոփոխականներին:

Երբ գործառույթը գործարկեք, իմաստուն կլինի այն նախածանցով տեղադրել // և նորից վերբեռնել ձեր ծածկագիրը, այնպես որ այն չի վերականգնի այն ժամանակը, երբ հոսանքը կշրջվի կամ միկրոկառավարիչը կվերակայվի: Ձեր RTC- ի ժամանակը կարդալը նույնքան պարզ է, իրականում գործընթացը կարող է կոկիկ հետևվել ցուցադրման (TimeT) գործառույթի ներսում: RTC- ից տվյալները պահելու համար ձեզ հարկավոր է սահմանել յոթ բայթ փոփոխական, և դրանք տեղադրվում են readDS3231time () գործառույթում: Օրինակ, եթե ձեր փոփոխականներն են.

բայթ վայրկյան, րոպե, ժամ, շաբաթՇաբաթվա օր, ամսվա օր, ամիս, տարի;

… Դուք դրանք կթարմացնեք RTC- ի ընթացիկ տվյալներով ՝ օգտագործելով.

կարդալDS3232 ժամ (& երկրորդ, & րոպե, & ժամ, & dayOfWeek, & dayOfMonth, & month, & year);

Այնուհետև կարող եք օգտագործել փոփոխականները ՝ ըստ ձեր հայեցողության, սկսած ժամանակն ու ամսաթիվը սերիական մոնիտորին, ինչպես օրինակ էսքիզը `տվյալների փոխարկումը բոլոր տեսակի ելքային սարքերի համար համապատասխան ձևի:

Պարզապես ստուգելու համար, որ ամեն ինչ աշխատում է, ցուցադրման ուրվագծի մեջ մուտքագրեք համապատասխան ժամանակը և ամսաթիվը, վերբեռնեք այն, մեկնաբանեք setDS3231time () գործառույթը և նորից վերբեռնեք: Այնուհետև բացեք սերիական մոնիտորը, և ձեզ պետք է տրամադրվի ընթացիկ ժամի և ամսաթվի ցուցադրվող էկրան:

Այս պահից դուք այժմ ունեք ծրագրային գործիքներ ՝ տվյալները տեղադրելու և դրանք ձեր իրական ժամանակի ժամացույցի մոդուլից վերցնելու համար, և մենք հույս ունենք, որ դուք հասկացել եք, թե ինչպես օգտագործել այս էժան մոդուլները:

Դուք կարող եք ավելին իմանալ իրական ժամանակի ժամացույցների IC- ների մասին արտադրողի կայքից `DS1307 և DS3231:

Այս գրառումը ձեզ է բերել pmdway.com- ը `ամեն ինչ արտադրողների և էլեկտրոնիկայի սիրահարների համար` անվճար առաքում ամբողջ աշխարհով:

Խորհուրդ ենք տալիս: