Цифров часовник Arduino, използващ RTC модул

Опитайте Нашия Инструмент За Премахване На Проблемите





В тази публикация ще конструираме цифров часовник с помощта на RTC или модул Часовник в реално време. Ще разберем какво е модул „RTC“, как да взаимодействаме с Arduino и какво прави.

От:



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

Можем да намерим RTC във всякакви електронни устройства, където времето е важна функция на устройството.



Например, нашият компютър или лаптоп поддържа времето си дори след изключване на захранването или премахване на батерията. На дънната платка на всеки компютър можем да намерим CMOS батерия, която захранва RTC веригата.

Подобен тип верига, която ще използваме в този проект.

RTC модулът е евтино устройство, което може да бъде намерено на всякакви сайтове за електронна търговия и местните магазини за електронни проекти.

Илюстрация на типичен RTC модул DS1307:

Повечето от RTC модулите се доставят с батерия (CR2032) по време на покупката. Има различни размери и модели, илюстрираното по-горе може да не е еднакво за вас. Но се уверете, че номерът на модела е DS1307. Кодът, написан в тази публикация, е съвместим само с DS1307.

Сега знаете нещо за RTC. Сега да преминем към дизайна на цифровия часовник. Преди да продължите с този проект, трябва да изтеглите библиотеката от следните връзки и да инсталирате на вашата IDE:

• DS1307RTC.h

Връзка: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Връзка: github.com/PaulStoffregen/Time

Другите две библиотеки биха били предварително инсталирани на Arduino IDE, ако сте на най-новата версия.

• LiquidCrystal.h

• Wire.h

Веригата:

Връзката на веригата между arduino и LCD дисплея е стандартна, което можем да намерим подобна връзка при други проекти, базирани на LCD. Единственият допълнителен компонент е RTC.

За да се намали претоварването на проводниците по време на прототипа, RTC може да се вмъкне към аналоговите щифтове директно на arduino. Припойте SCl, SDA, Vcc и GND с мъжки щифтове и го вкарайте от A2 до A5, както е показано в прототипа.

Прототип на автора:

Как правилно да вмъкнете RTC на Arduino:

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

Как да зададете време:

След като RTC модулът е програмиран, той поддържа времето, дори когато е премахнат от arduino. Батерията трябва да издържи поне няколко години.

Няма бутон за регулиране на времето, след което програмата ще зададе времето в RTC. Времето автоматично се синхронизира с времето на вашия компютър, докато компилирате кода, така че се уверете, че компютърът ви е настроен да коригира времето, преди да качите програмите.
Качете този “SetTime” код, за да зададете времето с включен RTC:

#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 } 

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

Това означава, че връзката ви между RTC и arduino е правилна и времето е настроено.

Сега качете следния код за показване на часа в LCD.

//------------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-------// 

След като направите това, трябва да видите часа и датата, които се показват на LCD и работят.

Забележка: Кодът „SetTime“ е модифициран от примерния код на DS1307RTC, за да оптимизира кабелните връзки за RTC модула, като качването на оригиналния код няма да зададе време.

Цифров будилник, използващ Arduino

В това по-горе научихме как да изградим основния часовник на Arduino с помощта на RTC модул, в следващия раздел изследваме как това може да бъде надстроено в схема на цифров будилник с помощта на Arduino.

Има някои хора, които не се нуждаят от будилник, те се събуждат по естествен път, а някои хора се събуждат след няколкократен звънец на будилника и има хора, които натискат бутон за отлагане няколко пъти и отиват за колежа си / работят до късно с някои оправдания.

Предложеният проект за забавен малък будилник може да се справи с проблема с мързела по време на сутрешното събуждане. Повечето будилници имат бутон за отлагане и предварително определено време за изключване на алармата, ако потребителят не отговори.

Проектирахме този будилник без ленив бутон (бутон за отлагане) и алармата няма да се изключи, докато потребителят не натисне бутон.

Този часовник може да показва времето в 12-часов формат и дата във формат ДД / ММ / ГГГГ.

Часът и датата ще бъдат показани на 16 x 2 LCD дисплей. RTC или модул за часовник в реално време ще се погрижи за проследяване на времето и може да запази правилното време дори след дълго спиране на захранването.

Предвидени са 5 бутона, чиято функция ще бъде обяснена скоро. Мозъкът на проекта Arduino може всеки модел по ваш избор, бихме препоръчали Arduino pro mini или Arduino nano поради неговите компактни размери.

Сега да се потопим в схеми.

Горното е схематично за Arduino да показва връзка, регулирайте контраста на дисплея, като завъртите 10K потенциометъра.

По-долу е останалата част от веригата:

Веригата може да се захранва 9V 500mA стенен адаптер.

Функции на 5 бутона:

S1 - Използва се за спиране на алармата (това е и бутон за нулиране).
S2 - Използва се за настройка на аларма. При продължително натискане на S2 ще стигнете до менюто за настройка на алармата.
S3 - Използва се за увеличаване на часовете.
S4 - използва се за увеличаване на минути.
S5 - Използва се за превключване на състоянието на алармата. Ако „*” съществува на LCD дисплея в долния десен ъгъл, алармата е ВКЛЮЧЕНА, ако „*” не съществува, статистиката на алармата е изключена.

Повече подробности за това как да настроите аларма е обяснено в долната част на статията.

Изтеглете библиотечните файлове по-долу:

Връзка1: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

Сега трябва да зададем време за RTC модул, времето ще бъде синхронизирано от вашия компютър към RTC модул.

Качете долния код, за да зададете час и отворете сериен монитор:

//------------------------------------------------// #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 } //----------------------------------------// 

Сега успешно сте задали време за RTC
След това трябва да качите следния основен код:

//------------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-------// 

След качването на горния код на дисплея трябва да видите правилните час и дата.

Сега нека видим как да настроите аларма:
• Натиснете продължително S2, докато не видите менюто за аларма.
• Натиснете S3 и S4, за да регулирате съответно часове и минути.
• След зададеното време натиснете още веднъж S2. Той ще каже „Алармата е настроена за хх: хх часа“.
• Ако алармата е ВКЛЮЧЕНА, можете да видите символа “*” на дисплея, ако алармата е ИЗКЛЮЧЕНА, няма да има символ “*”.
• Можете да включите / изключите алармата, като натиснете S5 за половин секунда. Не натискайте дълго, докато „*“ изчезне (връща се отново), просто натиснете половин секунда за превключване на състоянието на алармата.

ВАЖНА ЗАБЕЛЕЖКА:

Най-честата грешка при настройване на аларма на всеки часовник е неволното превключване на AM / PM, което води до не звънене на аларма по наше желание.

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

Показаното време на LCD дисплея ще бъде 12 часа с формат AM / PM, но когато зададете аларма с този проект, трябва да зададете в 24 часов формат от 0 до 23 часа.

Например: ако искате да настроите аларма в 21:00, трябва да зададете 21 часа и 0 минути. За, 5 ч. Сутринта: 5 часа и 0 минути и т.н.

Прототип на автора:

Харесвате ли този проект? Имате въпроси относно този проект, не се колебайте да изразите в коментара, може да получите бърз отговор.

Видеоклип:




Предишна: Схема за индикатор за ниво на маяка за зърнени резервоари за комбайни Напред: 3 инверторни вериги с чиста синусоида с висока мощност SG3525