Мазмұны:

DS1307 және DS3231 нақты уақыттағы модульдерді Arduino көмегімен пайдалану: 3 қадам
DS1307 және DS3231 нақты уақыттағы модульдерді Arduino көмегімен пайдалану: 3 қадам

Бейне: DS1307 және DS3231 нақты уақыттағы модульдерді Arduino көмегімен пайдалану: 3 қадам

Бейне: DS1307 және DS3231 нақты уақыттағы модульдерді Arduino көмегімен пайдалану: 3 қадам
Бейне: 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 болып табылады, егер сіз Pro Mini-үйлесімді болсаңыз, түйреуіштер A4 және A5. негізгі түйреуіштерге параллель болатын деректер мен сағат үшін.

DS1307 модулі

Егер сізде DS1307 модулі болса, сіз сымдарды тақтаға дәнекерлеуіңіз керек, немесе өтпелі сымдарды пайдалану үшін кейбір кірістірілген тақырып түйреуіштерінде дәнекерлеу қажет болады. Содан кейін SCL және SDA түйреуіштерін Arduino -ға, ал Vcc штырын 5В пен GND -ге GND -ге қосыңыз.

DS3231 модулі

Бұл модульді қосу оңай, себебі зауытта тақтаға түйреуіштер орнатылады. Сіз жай ғана SCL мен SDA -дан Arduino -ға және модульдің Vcc және GND түйреуіштерінен 5В немесе 3.3. V мен GND -ге дейін секіргіш сымдарды қосуға болады. Алайда, олар екінші жағынан өз сымдарын дәнекерлеу үшін қайталанады. Бұл модульдердің екеуінде де қажетті тартылатын резисторлар бар, сондықтан өзіңізді қосудың қажеті жоқ. I2C шинасына қосылған барлық құрылғылар сияқты, SDA мен SCL сымдарының ұзындығын минимумға дейін сақтап көріңіз.

2 -қадам: RTC модулінен уақытты оқу және жазу

RTC модулін қосқаннан кейін. келесі эскизді енгізіңіз және жүктеңіз. Эскиздегі жазбалар мен функциялар тек DS3231 -ге қатысты болса да, код DS1307 -мен жұмыс істейді.

#include «Wire.h» #define DS3231_I2C_ADDRESS 0x68 // Қалыпты ондық сандарды decToBcd екілік кодты ондық байтқа түрлендіру (байт val) {қайтару ((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 (); } void readDS3231time (байт *секунд, байт *минут, байт *сағат, байт *dayOfWeek, байт *dayOfMonth, байт *ай, байт *жыл) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // DS3231 регистр көрсеткішін 00h Wire.endTransmission () күйіне орнатыңыз; Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // DS3231 -ден 00h *second = 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 («:») көрсетілгенде байт айнымалысын ондық санға түрлендіру; 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) {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 ICs ондық емес 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 сізге жеткізді - бұл өндірушілер мен электроникаға әуесқойлар үшін, бүкіл әлем бойынша ақысыз жеткізу.

Ұсынылған: