Мазмуну:

DS1307 жана DS3231 реалдуу убакыт сааттарынын модулдарын Arduino менен колдонуу: 3 кадам
DS1307 жана DS3231 реалдуу убакыт сааттарынын модулдарын Arduino менен колдонуу: 3 кадам

Video: DS1307 жана DS3231 реалдуу убакыт сааттарынын модулдарын Arduino менен колдонуу: 3 кадам

Video: DS1307 жана DS3231 реалдуу убакыт сааттарынын модулдарын Arduino менен колдонуу: 3 кадам
Video: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 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 автобусун колдонушат, бул байланышты абдан оңой кылат.

Биринчиден, I2C автобусу үчүн Arduino же шайкеш такталарыңызда кайсы казыктар колдонулганын аныкташыңыз керек - бул SDA (же маалымат) жана SCL (же саат) катары белгилүү болот. Arduino Uno же шайкеш такталарда бул пиндер маалымат жана саат үчүн A4 жана A5 болуп саналат; Arduino Megaде пиндер маалымат жана саат үчүн D20 жана D21 болуп саналат; Ал эми эгер сиз Mini 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" #define DS3231_I2C_ADDRESS 0x68 // Нормалдуу ондук сандарды экилик коддуу ондук байтка айлантуу decToBcd (байт val) {return ((val/10*16) + (val%10)); } // бинардык коддолгон ондукту кадимки ондук сандарга айлантуу byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.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 (second <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) {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 башталат. Мисалы, эгерде сиз төмөнкү датаны жана убакытты коюуну кааласаңыз - Шаршемби 26 -ноябрь, 2014 -ж. Жана 21:42 жана 30 секунд - сиз колдонмоксуз:

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

3 -кадам:

Белгилей кетсек, убакыт 24 сааттык убакыт менен коюлган, ал эми төртүнчү параметр "жуманын күнү". Бул 1ден 7ге чейин түшөт, бул жекшембиден ишембиге чейин. Эгерде сиз өзүңүздүн өзгөрмөлөрүңүздү кошуп жатсаңыз, бул параметрлер байт мааниси.

Функцияны иштеткенден кийин, аны // менен префикс кылуу жана кодуңузду кайра жүктөө акылдуулукка жатат, андыктан ал кубаттуулукту алмаштыргандан кийин же микроконтроллерди баштапкы абалга келтирбейт. Сиздин RTC формасындагы убакытты окуу ушунчалык жөнөкөй, чындыгында процессти displayTime () функциясынын ичинде тыкан аткарууга болот. RTCден маалыматтарды сактоо үчүн жети байттык өзгөрмөлөрдү аныкташыңыз керек, жана алар readDS3231time () функциясына киргизилет. Мисалы, эгер сиздин өзгөрмөлөрүңүз:

байт секунд, мүнөт, саат, dayOfWeek, dayOfMonth, ай, жыл;

… сиз аларды RTCден учурдагы маалыматтар менен жаңыртып турмаксыз:

readDS3232time (& экинчи, & мүнөт, & саат, & dayOfWeek, & dayOfMonth, & ай, & жыл);

Андан кийин сиз өзгөрмөлөрдү өзүңүз каалагандай колдоно аласыз, мисалы, эскизде көрсөтүлгөндөй убакытты жана датаны сериялык мониторго жөнөтүүдөн баштап - маалыматтарды ар кандай чыгаруу түзүлүштөрү үчүн ылайыктуу формага айландырууга чейин.

Баары иштеп жатканын текшерүү үчүн, демонстрациялык эскизге ылайыктуу убакытты жана датаны киргизиңиз, жүктөңүз, setDS3231time () функциясын комментарийлеп, кайра жүктөңүз. Андан кийин сериялык мониторду ачыңыз жана сизге учурдагы убакыт менен күндүн дисплейи берилиши керек.

Ушул учурдан баштап сизде реалдуу убакыт режиминдеги саат модулунан маалыматтарды орнотуу жана алуу үчүн программалык камсыздоо каражаттары бар жана биз сизде бул арзан модулдарды кантип колдонуу керектиги жөнүндө түшүнүк бар деп үмүттөнөбүз.

Чыныгы убакыттагы ICлер жөнүндө көбүрөөк маалыматты өндүрүүчүнүн веб-сайтынан-DS1307 жана DS3231ден биле аласыз.

Бул пост сизге pmdway.com тарабынан келген - бүткүл дүйнө жүзү боюнча бекер жеткирүү менен, жасоочулар жана электроника ышкыбоздору үчүн.

Сунушталууда: