Ардуино дигитални сат помоћу РТЦ модула

Испробајте Наш Инструмент За Елиминисање Проблема





У овом посту ћемо конструисати дигитални сат користећи РТЦ или модул сата реалног времена. Разумећемо шта је „РТЦ“ модул, како повезати Ардуино и шта он ради.

Од стране:



РТЦ модул је коло које тачно прати тренутно време. Обавља две функције, комуницира са микроконтролерима и микропроцесорима дајући тренутно време и делујући као резервни круг за одржавање времена у случају нестанка струје, будући да има уграђени систем за резервну батерију.

РТЦ можемо пронаћи у било којим електронским уређајима где је време важна функција уређаја.



На пример, наш рачунар или лаптоп одржава време чак и након искључивања напајања или уклањања батерије. На матичној плочи било ког рачунара можемо пронаћи ЦМОС батерију која напаја РТЦ коло.

Сличну врсту склопа ћемо користити у овом пројекту.

РТЦ модул је јефтин уређај који се може наћи на било којој веб локацији е-трговине и у вашим локалним продавницама електронских пројеката.

Илустрација типичног РТЦ модула ДС1307:

Већина РТЦ модула долази са батеријом (ЦР2032) у тренутку куповине. Постоје различите величине и модели, горе илустровано можда није исто за вас. Али уверите се да је број модела ДС1307. Код написан у овом посту компатибилан је само са ДС1307.

Сада знате нешто о РТЦ-овима. Пређимо сада на дизајн дигиталног сата. Пре него што наставите са овим пројектом, потребно је да преузмете библиотеку са следећих веза и инсталирате на свој ИДЕ:

• ДС1307РТЦ.х

Веза: гитхуб.цом/ПаулСтоффреген/ДС1307РТЦ

• ТимеЛиб.х

Линк: гитхуб.цом/ПаулСтоффреген/Тиме

Друге две библиотеке би биле унапред инсталиране на Ардуино ИДЕ, ако имате најновију верзију.

• ЛикуидЦристал.х

• Жица.х

Круг:

Кружна веза између ардуина и ЛЦД екрана је стандардна, што можемо наћи сличну везу и на другим ЛЦД заслонима. Једина додатна компонента је РТЦ.

Да би се смањило загушење жице током прототипа, РТЦ се може уметнути у аналогне пинове директно на ардуину. Залемите СЦл, СДА, Вцц и ГНД мушким заглављем и убаците их у А2 до А5, као што је приказано у прототипу.

Ауторски прототип:

Како правилно уметнути РТЦ на Ардуино:

Ако ваш РТЦ има различите локације пинова и не може се реплицирати као што је горе приказано, увек можете да користите жице за повезивање. Сада је ваше подешавање хардвера завршено, пређимо на софтверски део пројекта.

Како подесити време:

Једном када је РТЦ модул програмиран, задржава време чак и када је уклоњен са ардуина. Батерија би требало да траје најмање неколико година.

Не постоји дугме за подешавање времена које ће следећи програм подесити у РТЦ-у. Време се аутоматски синхронизује са временом рачунара током састављања кода, зато проверите да ли је рачунар подешен на тачно време пре отпремања програма.
Отпремите овај “СетТиме” код да бисте подесили време са укљученим РТЦ-ом:

#include  #include  #include  int P=A3 //Assign power pins for RTC int N=A2 const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } 

Једном када је овај код отпремљен, отворите серијски монитор и требало би да се појави порука о успеху са назнаком времена.

То значи да је ваша веза између РТЦ-а и ардуина тачна и да је време постављено.

Сада отпремите следећи код за приказ времена на ЛЦД екрану.

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  LiquidCrystal lcd(12, 11, 5, 4, 3, 2) int P=A3 int N=A2 void setup() { lcd.begin(16,2) pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) } void loop() { tmElements_t tm lcd.clear() if (RTC.read(tm)) { if(tm.Hour>=12) { lcd.setCursor(14,0) lcd.print('PM') } if(tm.Hour<12) { lcd.setCursor(14,0) lcd.print('AM') } lcd.setCursor(0,0) lcd.print('TIME:') if(tm.Hour>12) //24Hrs to 12 Hrs conversion// { if(tm.Hour==13) lcd.print('01') if(tm.Hour==14) lcd.print('02') if(tm.Hour==15) lcd.print('03') if(tm.Hour==16) lcd.print('04') if(tm.Hour==17) lcd.print('05') if(tm.Hour==18) lcd.print('06') if(tm.Hour==19) lcd.print('07') if(tm.Hour==20) lcd.print('08') if(tm.Hour==21) lcd.print('09') if(tm.Hour==22) lcd.print('10') if(tm.Hour==23) lcd.print('11') } else { lcd.print(tm.Hour) } lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0,1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0,0) lcd.print('RTC stopped!!!') lcd.setCursor(0,1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0,0) lcd.print('Read error!') lcd.setCursor(0,1) lcd.print('Check circuitry!') } delay(500) } delay(500) } //------------Program Developed by R.Girish-------// 

Једном када то учините, требали бисте видети како су време и датум приказани на ЛЦД екрану и раде.

Белешка: Код „СетТиме“ је модификован из примера кода ДС1307РТЦ да би се оптимизовале жичане везе за РТЦ модул, отпремање оригиналног кода неће одредити време.

Дигитални будилник који користи Ардуино

У овоме изнад научили смо како да направимо основни Ардуино сат помоћу РТЦ модула, у следећем делу истражујемо како се то може надоградити у круг дигиталног будилника помоћу Ардуина.

Неки људи требају будилник, пробуде се природно, а неки се пробуде након што неколико пута зазвони будилица, а неки људи гомилу пута притисну дугме за одлагање и касно оду на факултет / посао неки изговори.

Предложени забавни мали будилник може се суочити са проблемом лењости током јутарњег буђења. Већина будилника има дугме за одлагање и унапред одређено време искључења аларма ако корисник не одговори.

Дизајнирали смо овај будилник без лењег дугмета (дугме за одлагање) и аларм се неће искључити док корисник не притисне дугме.

Овај сат може приказивати време у формату од 12 сати и датум у формату ДД / ММ / ГГГГ.

Време и датум биће приказани на ЛЦД дисплеју 16 к 2. РТЦ или сат времена у реалном времену побринут ће се за праћење времена и може задржати тачно вријеме чак и након дугог прекида напајања.

Постоји 5 дугмади чија функција ће ускоро бити објашњена. Мозак пројекта Ардуино може било који модел по вашем избору, ми бисмо препоручили Ардуино про мини или Ардуино нано због његове компактне величине.

Сада ћемо заронити у шеме.

Горња шема је да Ардуино приказује везу, подесите контраст екрана ротирањем 10К потенциометра.

Испод је остатак кола:

Коло се може напајати 9В 500мА зидним адаптером.

Функције 5 тастера:

С1 - Користи се за заустављање аларма (такође је дугме за ресетовање).
С2 - Користи се за подешавање аларма. Дугим притиском на С2 доћи ћете до менија за подешавање аларма.
С3 - Користи се за повећање сати.
С4 - користи се за увећавање минута.
С5 - Користи се за пребацивање статуса аларма. Ако на ЛЦД екрану у доњем десном углу доњег угла постоји „*“, аларм је УКЉУЧЕН, ако „*“ не постоји, статистика аларма је ИСКЉУЧЕНА.

Детаљније о подешавању аларма објашњено је на дну чланка.

Преузмите датотеке библиотеке у наставку:

Линк1: гитхуб.цом/ПаулСтоффреген/ДС1307РТЦ
Линк2: гитхуб.цом/ПаулСтоффреген/Тиме

Сада морамо подесити време за РТЦ модул, време ће се синхронизовати са вашег рачунара на РТЦ модул.

Отпремите доњи код да бисте подесили време и отворили серијски монитор:

//------------------------------------------------// #include  #include  #include  const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } //----------------------------------------// 

Сада сте успешно поставили време на РТЦ
Даље, морате да отпремите следећи главни код:

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  #include  const int rs = 7 const int en = 6 const int d4 = 5 const int d5 = 4 const int d6 = 3 const int d7 = 2 const int buzzer = 8 boolean alarm = false boolean outloop = true const int setAlarm = A0 const int Hrs = A1 const int Min = A2 const int ok = A3 const int HrsADD = 0 const int MinADD = 1 const int ALsave = 2 int HrsVal = 0 int MinVal = 0 int H = 0 int M = 0 int S = 0 int i = 0 int j = 0 int k = 0 LiquidCrystal lcd(rs, en, d4, d5, d6, d7) void setup() { Serial.begin(9600) lcd.begin(16, 2) pinMode(buzzer, OUTPUT) pinMode(setAlarm, INPUT) pinMode(Hrs, INPUT) pinMode(Min, INPUT) pinMode(ok, INPUT) digitalWrite(setAlarm, HIGH) digitalWrite(Hrs, HIGH) digitalWrite(Min, HIGH) digitalWrite(ok, HIGH) } void loop() { tmElements_t tm lcd.clear() if (EEPROM.read(ALsave) == false) { lcd.setCursor(15, 1) lcd.print('') } if (EEPROM.read(ALsave) == true) { lcd.setCursor(15, 1) lcd.print(F('*')) } if (RTC.read(tm)) { if (tm.Hour >= 12) { lcd.setCursor(14, 0) lcd.print('PM') } if (tm.Hour < 12) { lcd.setCursor(14, 0) lcd.print('AM') } lcd.setCursor(0, 0) lcd.print('TIME:') H = tm.Hour if (tm.Hour > 12) { if (tm.Hour == 13) { lcd.print('01') } if (tm.Hour == 14) { lcd.print('02') } if (tm.Hour == 15) { lcd.print('03') } if (tm.Hour == 16) { lcd.print('04') } if (tm.Hour == 17) { lcd.print('05') } if (tm.Hour == 18) { lcd.print('06') } if (tm.Hour == 19) { lcd.print('07') } if (tm.Hour == 20) { lcd.print('08') } if (tm.Hour == 21) { lcd.print('09') } if (tm.Hour == 22) { lcd.print('10') } if (tm.Hour == 23) { lcd.print('11') } } else { lcd.print(tm.Hour) } M = tm.Minute S = tm.Second lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0, 1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0, 0) lcd.print('RTC stopped!!!') lcd.setCursor(0, 1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0, 0) lcd.print('Read error!') lcd.setCursor(0, 1) lcd.print('Check circuitry!') } } if (digitalRead(setAlarm) == LOW) { setALARM() } if (H == EEPROM.read(HrsADD) && M == EEPROM.read(MinADD) && S == 0) { if (EEPROM.read(ALsave) == true) { sound() } } if (digitalRead(ok) == LOW) { if (EEPROM.read(ALsave) == true) { EEPROM.write(ALsave, 0) alarm = false delay(1000) return } if (EEPROM.read(ALsave) == false) { EEPROM.write(ALsave, 1) alarm = true delay(1000) return } } delay(1000) } void setALARM() { HrsVal = EEPROM.read(HrsADD) MinVal = EEPROM.read(MinADD) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(' Min:')) lcd.print(EEPROM.read(MinADD)) delay(600) while (outloop) { if (HrsVal > 23) { HrsVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (MinVal > 59) { MinVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (digitalRead(Hrs) == LOW) { HrsVal = HrsVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(Min) == LOW) { MinVal = MinVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(setAlarm) == LOW) { EEPROM.write(HrsADD, HrsVal) EEPROM.write(MinADD, MinVal) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('Alarm is Set for')) lcd.setCursor(0, 1) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(':')) lcd.print(EEPROM.read(MinADD)) lcd.print(F(' Hrs')) delay(1000) outloop = false } } outloop = true } void sound() { lcd.clear() lcd.setCursor(0, 0) lcd.print('Wakey Wakey !!!') lcd.setCursor(0, 1) lcd.print('Its Time now.....') for (j = 0 j < 10 j++) { for (i = 0 i < 2  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(400) } for (k = 0 k < 10 k++) { for (i = 0 i < 4  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(250) } while (true) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } } //------------Program Developed by R.Girish-------// 

Након отпремања горњег кода на екрану морате видети тачно време и датум.

Сада да видимо како да подесимо аларм:
• Дуго притисните С2 док не видите мени Аларм.
• Притисните С3 и С4 да бисте подесили сате и минуте.
• Након жељеног времена, притисните С2 још једном. Рећи ће „Аларм је постављен на кк: кк сати“.
• Ако је аларм УКЉУЧЕН, на екрану можете видети симбол „*“, ако је аларм ИСКЉУЧЕН, симбол „*“ неће бити.
• Можете укључити / искључити аларм притиском на С5 на пола секунде. Не притискајте дуго док „*“ не нестане (поново се враћа), само притисните пола секунде да бисте пребацили статус аларма.

ВАЖНА НАПОМЕНА:

Најчешћа грешка приликом подешавања аларма на било ком сату је ненамерно пребацивање АМ / ПМ, што резултира тиме да аларм не зазвони у време када желимо.

Да би се супротставио овом питању, предложена поставка будилника дизајнирана је у 24-часовном формату сата.

На ЛЦД-у ће бити приказано време од 12 сати са АМ / ПМ форматом, али када овим пројектом подесите аларм, морате да поставите у формату од 24 сата од 0 до 23 сата.

На пример: ако желите да подесите аларм у 21:00, морате да подесите 21 сат и 0 минута. За, 5:00: 5 сати и 0 минута и тако даље.

Ауторски прототип:

Да ли вам се свиђа овај пројекат? Имате било какво питање у вези са овим пројектом, слободно изразите коментар, можда ћете добити брзи одговор.

Видео клип:




Претходни: Склоп индикатора нивоа светионика за резервоаре за зрно комбајна Следеће: 3 круга претварача са чистим синусним таласом велике снаге СГ3525