Съдържание:

Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino: 3 стъпки
Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino: 3 стъпки

Видео: Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino: 3 стъпки

Видео: Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino: 3 стъпки
Видео: Lesson 99: Building Arduino Digital Clock using DS3231 LCD and Seven Segment Display 2024, Ноември
Anonim
Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino
Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino
Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino
Използване на модули за часовници в реално време DS1307 и DS3231 с Arduino

Продължаваме да получаваме заявки за това как да използваме модули за часовник в реално време DS1307 и DS3231 с Arduino от различни източници-така че това е първият от урок от две части за това как да ги използвате. За този урок по Arduino имаме два модула за часовник в реално време, един, базиран на Maxim DS1307 (квадратният модул) и DS3231 (правоъгълния модул).

Има две основни разлики между интегралните схеми на модулите за часовник в реално време, което е точността на отчитането на времето. 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" #define DS3231_I2C_ADDRESS 0x68 // Конвертиране на нормални десетични числа в двоично кодиран десетичен байт decToBcd (байт val) {return ((val/10*16) + (val%10)); } // Конвертиране на двоично кодирани десетични числа в нормални десетични числа байт bcdToDec (байт 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 (second)); // задаване на секунди 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 *секунда = 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 (& second, & minute, & hour, & 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) {случай 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 секунди - ще използвате:

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

Стъпка 3:

Обърнете внимание, че часът е зададен с помощта на 24-часово време, а четвъртият параметър е „денят от седмицата“. Това пада между 1 и 7, което съответно е от неделя до събота. Тези параметри са байтови стойности, ако подменяте собствените си променливи.

След като стартирате функцията, веднъж е разумно да я поставите с префикс // и да качите кода си отново, така че тя няма да нулира времето, след като захранването е било циклично или нулиране на микроконтролера. Четенето на времето от вашия RTC е също толкова просто, всъщност процесът може да бъде проследен добре във функцията displayTime (). Ще трябва да дефинирате седем байтови променливи за съхраняване на данните от RTC и те след това се вмъкват във функцията readDS3231time (). Например, ако вашите променливи са:

байт втора, минута, час, dayOfWeek, dayOfMonth, месец, година;

… бихте ги опреснили с текущите данни от RTC, като използвате:

readDS3232time (& втора, & минута, & час, & dayOfWeek, & dayOfMonth, & месец, & година);

След това можете да използвате променливите, както сметнете за добре, от изпращането на часа и датата до серийния монитор, както прави примерната скица - до преобразуването на данните в подходяща форма за всички видове изходни устройства.

Просто за да проверите дали всичко работи, въведете подходящия час и дата в демонстрационната скица, качете я, коментирайте функцията setDS3231time () и я качете отново. След това отворете серийния монитор и трябва да ви бъде предоставен работещ дисплей на текущия час и дата.

От този момент вече имате софтуерните инструменти за настройване и извличане на данни от вашия часовник в реално време и се надяваме, че имате разбиране как да използвате тези евтини модули.

Можете да научите повече за конкретните интегрални схеми на часовника в реално време от уебсайта на производителя-DS1307 и DS3231.

Тази публикация ви е предоставена от pmdway.com - всичко за производители и ентусиасти на електрониката, с безплатна доставка по целия свят.

Препоръчано: