„Arduino“ skaitmeninis laikrodis naudojant RTC modulį

Išbandykite Mūsų Instrumentą, Kaip Pašalinti Problemas





Šiame įraše sukursime skaitmeninį laikrodį naudodami RTC arba „Real Time Clock“ modulį. Mes suprasime, kas yra „RTC“ modulis, kaip sąveikauti su „Arduino“ ir ką jis veikia.

Autorius:



RTC modulis yra grandinė, tiksliai sekanti dabartinį laiką. Jis atlieka dvi funkcijas, jis palaiko ryšį su mikrovaldikliais ir mikroprocesoriais, kad gautų dabartinį laiką ir veiktų kaip atsarginė grandinė, palaikanti laiką nutrūkus elektros tiekimui, nes jame yra įmontuota akumuliatoriaus atsarginė sistema.

RTC galime rasti bet kuriuose elektroniniuose įrenginiuose, kur laikas yra svarbi programėlės funkcija.



Pavyzdžiui, mūsų kompiuteris ar nešiojamas kompiuteris išlaiko laiką net tada, kai maitinimas yra išjungtas arba baterija išimta. Bet kurio kompiuterio pagrindinėje plokštėje galime rasti CMOS bateriją, kuri maitina RTC grandinę.

Panašios grandinės, kurias ketiname naudoti šiame projekte.

RTC modulis yra nebrangus įrenginys, kurį galima rasti bet kurioje elektroninės prekybos svetainėje ir jūsų vietinėse elektroninių projektų parduotuvėse.

Tipiško RTC modulio DS1307 iliustracija:

Pirkimo metu dauguma RTC modulių yra su baterija (CR2032). Yra įvairių dydžių ir modelių, aukščiau pavaizduotas vaizdas gali būti ne tas pats. Tačiau įsitikinkite, kad modelio numeris yra DS1307. Šiame įraše parašytas kodas yra suderinamas tik su DS1307.

Dabar jūs ką nors žinote apie RTC. Dabar pereikime prie skaitmeninio laikrodžio dizaino. Prieš tęsdami šį projektą, turite atsisiųsti biblioteką iš šių nuorodų ir įdiegti savo IDE:

• DS1307RTC.h

Nuoroda: github.com/PaulStoffregen/DS1307RTC

• „TimeLib.h“

Nuoroda: github.com/PaulStoffregen/Time

Kitos dvi bibliotekos būtų iš anksto įdiegtos „Arduino IDE“, jei naudojate naujausią versiją.

• „LiquidCrystal.h“

• Viela.h

Grandinė:

Grandinės jungtis tarp „arduino“ ir LCD ekrano yra standartinė, kurią panašų ryšį galime rasti ir kituose LCD pagrįstuose projektuose. Vienintelis papildomas komponentas yra RTC.

Siekiant sumažinti laidų perkrovą prototipo metu, RTC galima įterpti į analoginius kaiščius tiesiai iš „arduino“. Lituokite SCl, SDA, Vcc ir GND su vyriškais antraštės kaiščiais ir įkiškite iš A2 į A5 kaiščius, kaip parodyta prototipe.

Autoriaus prototipas:

Kaip tinkamai įterpti RTC „Arduino“:

Jei jūsų RTC yra skirtingos kaiščių vietos ir jo negalima pakartoti, kaip parodyta aukščiau, jungimui visada galite naudoti laidus. Dabar jūsų aparatūros sąranka baigta. Pereikime prie programinės įrangos projekto dalies.

Kaip nustatyti laiką:

Užprogramavus RTC modulį, jis išlaiko laiką, net ir pašalintą iš „arduino“. Baterija turėtų tarnauti mažiausiai porą metų.

Nėra mygtuko, kuris leistų sureguliuoti laiką. Ši programa nustatys laiką RTC. Laikas, automatiškai sinchronizuojamas su jūsų kompiuterio laiku, renkant kodą, todėl prieš įkeldami programas įsitikinkite, kad jūsų kompiuteryje nustatytas teisingas laikas.
Įkelkite šį „SetTime“ kodą, kad nustatytumėte laiką su prijungtu 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 } 

Kai šis kodas bus įkeltas, atidarykite nuoseklųjį monitorių ir turėtų pasirodyti sėkmės pranešimas, nurodantis, kad laikas buvo nustatytas.

Tai reiškia, kad jūsų ryšys tarp RTC ir „arduino“ yra teisingas ir nustatytas laikas.

Dabar įkelkite šį kodą, kad laikas būtų rodomas 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-------// 

Kai tai bus padaryta, LCD ekrane turėtų būti rodomas laikas ir data.

Pastaba: „SetTime“ kodas pakeistas iš DS1307RTC kodo pavyzdžio, siekiant optimizuoti laidų jungtis RTC moduliui, įkeliant originalų kodą laikas nebus nustatytas.

Skaitmeninis žadintuvas naudojant „Arduino“

Pirmiau mes sužinojome, kaip sukurti pagrindinį „Arduino“ laikrodį naudojant RTC modulį, kitoje sekcijoje mes ištirsime, kaip tai galima atnaujinti į skaitmeninę žadintuvo grandinę naudojant „Arduino“.

Yra žmonių, kuriems nereikia žadintuvo, jie pabunda natūraliai ir yra žmonių, kurie pabunda po to, kai žadintuvas suskamba kelis kartus, o yra žmonių, kurie kelis kartus paspaudžia snaudimo mygtuką ir vėlai eina į savo kolegiją / darbą keletas pasiteisinimų.

Siūlomas įdomus mažas žadintuvo projektas gali susidurti su tingumu ryte pabudus. Daugumoje žadintuvų yra snaudimo mygtukas ir iš anksto nustatytas aliarmo laikas, jei vartotojas neatsako.

Mes sukūrėme šį žadintuvą be tinginio mygtuko (snaudimo mygtuko) ir žadintuvas neišsijungs, kol vartotojas nepaspaus mygtuko.

Šis laikrodis gali rodyti laiką 12 valandų formatu ir datą DD / MM / YYYY formatu.

Laikas ir data bus rodomi 16 x 2 LCD ekrane. RTC arba realaus laiko laikrodžio modulis pasirūpins laiko stebėjimu ir gali išlaikyti teisingą laiką net po ilgo elektros energijos tiekimo nutraukimo.

Pateikiami 5 mygtukai, kurių funkcija bus greitai paaiškinta. „Arduino“ projekto smegenys gali bet kurį jūsų pasirinktą modelį, todėl mes rekomenduotume „Arduino pro mini“ arba „Arduino nano“ dėl kompaktiško dydžio.

Dabar pasinerkime į schemas.

Pirmiau pateikiama schema, skirta „Arduino“ rodyti ryšį, reguliuoti ekrano kontrastą sukant 10K potenciometrą.

Žemiau yra likusi grandinė:

Kontūras gali būti maitinamas 9V 500mA sieniniu adapteriu.

5 mygtukų funkcijos:

S1 - tai naudojama aliarmui sustabdyti (tai taip pat yra atstatymo mygtukas).
S2 - naudojamas nustatyti žadintuvą. Ilgai paspaudę S2, pateksite į aliarmo nustatymo meniu.
S3 - jis naudojamas valandoms didinti.
S4 - jis naudojamas minutėms didinti.
S5 - naudojamas pavojaus signalo būsenai perjungti. Jei LCD ekrane dešiniajame šoniniame kampe yra „*“, žadintuvas yra ĮJUNGTAS, jei „*“ nėra, aliarmo statistika yra išjungta.

Išsamesnė informacija apie tai, kaip nustatyti žadintuvą, paaiškinta straipsnio apačioje.

Atsisiųskite žemiau esančius bibliotekos failus:

1 nuoroda: github.com/PaulStoffregen/DS1307RTC
2 nuoroda: github.com/PaulStoffregen/Time

Dabar mes turime nustatyti laiką iki RTC modulio, laikas bus sinchronizuojamas iš jūsų kompiuterio į RTC modulį.

Įkelkite žemiau esantį kodą, kad nustatytumėte laiką ir atidarytumėte nuoseklųjį monitorių:

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

Dabar jūs sėkmingai nustatėte laiką RTC
Tada turite įkelti šį pagrindinį kodą:

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

Įkėlę aukščiau nurodytą kodą, ekrane turite matyti tinkamą laiką ir datą.

Dabar pažiūrėkime, kaip nustatyti žadintuvą:
• Ilgai spauskite S2, kol pamatysite „Alarm“ meniu.
• Norėdami sureguliuoti valandas ir minutes, paspauskite S3 ir S4.
• Nustatę norimą laiką, dar kartą paspauskite S2. Joje bus parašyta „Signalas nustatytas xx: xx valandoms“.
• Jei žadintuvas įjungtas, ekrane galite pamatyti „*“ simbolį, jei žadintuvas išjungtas, „*“ simbolio nebus.
• Galite įjungti / išjungti žadintuvą pusę sekundės paspausdami S5. Nespauskite ilgai, kol „*“ išnyks (jis vėl grįš), tiesiog paspauskite pusę sekundės, kad pakeistumėte aliarmo būseną.

SVARBI PASTABA:

Dažniausia bet kurio laikrodžio žadintuvo nustatymo klaida yra netyčinis ryto / ryto perjungimas, dėl kurio aliarmas neskambės mūsų norų metu.

Norėdami išspręsti šią problemą, siūlomas žadintuvo nustatymas yra sukurtas 24 valandų laikrodžio formatu.

Skystųjų kristalų ekrane rodomas laikas bus 12 valandų AM / PM formatu, tačiau, nustatydami žadintuvą pagal šį projektą, turite nustatyti 24 valandų formatą nuo 0 iki 23 valandų.

Pavyzdžiui: jei norite nustatyti žadintuvą 21:00, turite nustatyti 21 valandą ir 0 minutes. Už 5 val. 5 val. 0 min. Ir pan.

Autoriaus prototipas:

Ar jums patinka šis projektas? Turite klausimų apie šį projektą, nedvejodami išsakykite komentarą, galite gauti greitą atsakymą.

Vaizdo įrašas:




Pora: Švyturio lygio indikatoriaus grandinė kombainų grūdų cisternoms Kitas: 3 didelės galios SG3525 gryno „Sinewave“ keitiklio grandinės