Агуулгын хүснэгт:

DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах: 3 алхам
DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах: 3 алхам

Видео: DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах: 3 алхам

Видео: DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах: 3 алхам
Видео: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Арванхоёрдугаар сар
Anonim
DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах
DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах
DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах
DS1307 ба DS3231 бодит цагийн модулиудыг Arduino ашиглан ашиглах

Бид янз бүрийн эх сурвалжаас Arduino-той DS1307 ба DS3231 бодит цагийн модулийг хэрхэн ашиглах тухай хүсэлтийг хүлээн авдаг бөгөөд энэ нь тэдгээрийг хэрхэн ашиглах тухай хоёр хэсгээс бүрдэх анхны заавар юм. Энэхүү Arduino гарын авлагад бид Maxim DS1307 (дөрвөлжин модуль) ба DS3231 (тэгш өнцөгт модуль) дээр суурилсан бодит цагийн хоёр модулийг ашиглах болно.

Бодит цагийн модулиудын IC-ийн хооронд хоёр үндсэн ялгаа байдаг бөгөөд энэ нь цагийг үнэн зөв байлгах явдал юм. Эхний модульд ашигласан DS1307 нь маш сайн ажилладаг боловч гадаад температур нь DS1307 -ийн дотоод тоолуурыг жолооддог осциллятор хэлхээний давтамжид нөлөөлдөг.

Энэ нь асуудал мэт санагдаж болох ч ихэвчлэн сар бүр ойролцоогоор таван минут орчим цаг унтраахад хүргэдэг. DS3231 нь илүү нарийвчлалтай байдаг, учир нь гадны хүчин зүйл нөлөөлдөггүй дотоод осциллятортой бөгөөд жилд хамгийн ихдээ хэдэн минут хүртэл нарийвчлалтай ажилладаг. Хэрэв танд DS1307 модуль байгаа бол бүү санаа зов, энэ бол маш сайн үнэ цэнэтэй самбар бөгөөд танд сайн үйлчлэх болно. Хоёр модулийн хувьд нөөц батерей шаардлагатай болно.

Шинэ CR2032 батерей худалдаж аваад модульд тааруулах нь зүйтэй. Цаг, огноог хянахаас гадна эдгээр модулиуд нь жижиг EEPROM, дохиоллын функцтэй (зөвхөн DS3231), янз бүрийн давтамжийн дөрвөлжин долгион үүсгэх чадвартай бөгөөд энэ нь хоёр дахь хичээлийн сэдэв болно.

Алхам 1: Өөрийн модулийг Arduino -той холбох

Хоёр модуль хоёулаа I2C автобусыг ашигладаг бөгөөд энэ нь холболтыг маш хялбар болгодог.

Эхлээд та Arduino эсвэл нийцтэй самбар дээрх I2C автобусанд ямар тээглүүр ашигладаг болохыг олж мэдэх хэрэгтэй - эдгээрийг SDA (эсвэл өгөгдөл) ба SCL (эсвэл цаг) гэж нэрлэдэг. Arduino Uno эсвэл нийцтэй самбар дээр эдгээр зүү нь өгөгдөл, цагийн хувьд A4 ба A5 байна; Arduino Mega дээр зүү нь өгөгдөл, цагны хувьд D20 ба D21 байна; хэрэв та Pro Mini-тэй бол зүү нь A4 ба A5 байна. үндсэн тээглүүртэй зэрэгцсэн өгөгдөл, цагны хувьд.

DS1307 модуль

Хэрэв танд DS1307 модуль байгаа бол та утсыг самбар дээр гагнах, эсвэл толгой доторлогоотой зүү дээр гагнах хэрэгтэй бөгөөд ингэснээр та холбогч утсыг ашиглаж болно. Дараа нь SCL ба SDA тээглүүрүүдийг Arduino -д, Vcc зүүг 5V зүү рүү, GND -ийг GND -д холбоно уу.

DS3231 модуль

Энэ модулийг холбоход хялбар байдаг, учир нь толгойн тээглүүрийг самбар дээр самбар дээр суулгасан болно. Та SCL ба SDA -аас Arduino руу холбогч утсыг дахин ажиллуулж, модулийн Vcc ба GND тээглүүрээс 5V эсвэл 3.3. V ба GND руу залгаж болно. Гэсэн хэдий ч эдгээр нь нөгөө талаасаа өөрийн утсыг гагнахад зориулагдсан байдаг. Эдгээр модулиуд хоёулаа шаардлагатай татах эсэргүүцэлтэй байдаг тул та өөрөө модулийг нэмэх шаардлагагүй болно. I2C автобусанд холбогдсон бүх төхөөрөмжүүдийн нэгэн адил SDA ба SCL утаснуудын уртыг аль болох бага байлгахыг хичээ.

Алхам 2: Таны RTC модулийн цагийг унших, бичих

RTC модулийг холбосны дараа. Дараах зургийг оруулаад байршуулна уу. Ноорог дээрх тэмдэглэл, функц нь зөвхөн DS3231 -т хамааралтай боловч код нь DS1307 -тэй ажилладаг.

#include "Wire.h" #dexine DS3231_I2C_ADDRESS 0x68 // Энгийн аравтын тоог хоёртын кодчилсон аравтын байт болгон хөрвүүлэх decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Хоёртын кодчилсон аравтын бутархайг ердийн аравтын тоо болгон хөрвүүлэх byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Цуваа эхлэх (9600); // анхны цагийг энд тохируулна уу: // DS3231 секунд, минут, цаг, өдөр, огноо, сар, жил // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (байт секунд, байт минут, байт цаг, dayOfWeek, байт dayOfMonth, байт сар, байт жил) {// цаг, огнооны өгөгдлийг 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 (); } хүчингүй readDS3231time (байт *секунд, байт *минут, байт *цаг, байт *dayOfWeek, байт *dayOfMonth, байт *сар, байт *жил) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // DS3231 регистрийн заагчийг 00h Wire.endTransmission () болгож тохируулна уу; Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // 0032 *регистрээс эхлэн DS3231 -аас долоон байт өгөгдөл хүсэх *секунд = 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, & сар, жил) -ээс өгөгдөл авах; // үүнийг цуваа дэлгэц рүү илгээх Serial.print (цаг, DEC); // Serial.print (":") -ийг харуулах үед байтын хувьсагчийг аравтын тоо болгон хөрвүүлэх; хэрэв (минут <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 ("Долоо хоногийн өдөр:"); switch (dayOfWeek) {тохиолдол 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); // секунд тутамд}

Маш олон код байж болох ч энэ нь удирдах боломжтой хэсгүүдэд хуваагддаг.

Үүнд эхлээд I2C автобусны холболтод ашигладаг Wire номын сан, дараа нь RTC -ийн автобусны хаягийг 0x68 гэж тодорхойлсон болно. Үүний дараа аравтын бутархай тоог BCD (хоёртын кодчилсон аравтын бутархай) болгон хөрвүүлдэг хоёр функц байдаг. RTC IC нь аравтын бутархайгаар бус BCD хэл дээр ажилладаг тул эдгээр нь зайлшгүй шаардлагатай болно.

SetDS3231time () функцийг цагийг тохируулахад ашигладаг. Үүнийг ашиглах нь маш хялбар, энгийн утгыг жилээс секундын хооронд оруулах бөгөөд RTC нь тэр үеэс эхэлнэ. Жишээлбэл, хэрэв та дараах огноо, цагийг тохируулахыг хүсч байвал - 2014 оны 11 -р сарын 26 -ны Лхагва гариг, 21:42, 30 секундыг ашиглана уу.

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

Алхам 3:

Цагийг 24 цагийн цаг ашиглан тохируулдаг бөгөөд дөрөв дэх параметр нь "долоо хоногийн өдөр" гэдгийг анхаарна уу. Энэ нь 1 -ээс 7 -ны хооронд болдог бөгөөд энэ нь ням гарагаас бямба гараг хүртэл байдаг. Хэрэв та өөрийн хувьсагчийг оруулж байгаа бол эдгээр параметрүүд нь байтын утга юм.

Функцийг ажиллуулсны дараа үүнийг // гэж оруулан кодоо дахин байршуулах нь ухаалаг хэрэг болно, ингэснээр хүчийг эргүүлж эсвэл микроконтроллерийг дахин тохируулсны дараа цагийг дахин тохируулахгүй. Таны RTC -ийн цагийг унших нь маш энгийн, гэхдээ энэ үйл явцыг displayTime () функц дотор сайтар дагаж мөрдөх боломжтой. RTC -ээс өгөгдлийг хадгалахын тулд та долоон байтын хувьсагчийг тодорхойлох шаардлагатай бөгөөд үүнийг readDS3231time () функцэд оруулна. Жишээлбэл, хэрэв таны хувьсагчид:

байт секунд, минут, цаг, өдөрOfWeek, dayOfMonth, сар, жил;

… та эдгээрийг ашиглан RTC -ийн одоогийн өгөгдлийг сэргээнэ үү.

readDS3232time (& секунд, & минут, & цаг, & dayOfWeek, & dayOfMonth, & сар, жил);

Дараа нь та хувьсагчийг хүссэн зургийнхаа дагуу цаг, огноог цуваа дэлгэц рүү илгээхээс эхлээд өгөгдлийг бүх төрлийн гаралтын төхөөрөмжид тохиромжтой хэлбэр болгон хөрвүүлэх хүртэл ашиглаж болно.

Зүгээр л бүх зүйл ажиллаж байгааг шалгахын тулд зохих цаг, огноог жагсаалтын ноорог дээр оруулаад байршуулаад setDS3231time () функц дээр тайлбар бичээд дахин байршуулна уу. Дараа нь цуваа дэлгэцийг нээгээд танд одоогийн цаг, огноог харуулсан дэлгэцийг өгөх ёстой.

Энэ үеэс эхлэн та бодит цагийн модульд өгөгдлийг тохируулах, авах програм хангамжийн хэрэгслүүдтэй болсон бөгөөд эдгээр хямд модулийг хэрхэн ашиглах талаар ойлголттой болсон гэж найдаж байна.

Та бодит цагийн IC-ийн талаар илүү дэлгэрэнгүй мэдээллийг үйлдвэрлэгчийн вэбсайтаас авах боломжтой-DS1307 ба DS3231.

Энэхүү бичлэгийг pmdway.com танд хүргэсэн бөгөөд энэ нь үйлдвэрлэгч болон цахилгаан бараа сонирхогчдод зориулагдсан бүх зүйлийг дэлхий даяар үнэгүй хүргэж өгөх болно.

Зөвлөмж болгож буй: