Arduino Digital Clock Gamit ang RTC Module

Subukan Ang Aming Instrumento Para Sa Pagtanggal Ng Mga Problema





Sa post na ito magtatayo kami ng isang digital na orasan gamit ang module ng RTC o Real Time Clock. Mauunawaan namin kung ano ang module na 'RTC', kung paano makikipag-interface sa Arduino at kung ano ang ginagawa nito.

Ni:



Ang module ng RTC ay isang circuit, na tumpak na sumusubaybay sa kasalukuyang oras. Gumagawa ito ng dalawang pag-andar, nakikipag-usap ito sa mga microcontroller at microprocessor upang bigyan ang kasalukuyang oras at kumilos bilang backup circuit para sa pagpapanatili ng oras sa kaso ng pagkabigo sa kuryente, dahil mayroon itong built-in na backup na system ng baterya.

Mahahanap namin ang RTC sa anumang mga elektronikong aparato kung saan ang oras ay isang mahalagang pag-andar ng gadget.



Halimbawa, pinapanatili ng aming computer o laptop ang oras nito kahit na naka-plug off ang kuryente o natanggal ang baterya. Sa motherboard ng anumang computer maaari kaming makahanap ng isang baterya ng CMOS, na nagpapagana sa RTC circuit.

Katulad na uri ng circuit na gagamitin namin sa proyektong ito.

Ang module ng RTC ay isang murang aparato na maaaring matagpuan sa anumang mga site ng E-commerce at iyong mga lokal na tindahan ng proyekto sa elektronikong proyekto.

Paglalarawan ng tipikal na module ng RTC DS1307:

Karamihan sa mga module ng RTC ay mayroong baterya (CR2032) sa oras ng pagbili. Mayroong iba't ibang laki at modelo, ang nakalarawan sa itaas ay maaaring hindi pareho para sa iyo. Ngunit siguraduhin na ang numero ng modelo ay DS1307. Ang code na nakasulat sa post na ito ay tumutugma lamang sa DS1307.

Ngayon may alam ka tungkol sa RTCs. Ngayon, magpatuloy tayo sa disenyo ng digital na orasan. Bago magpatuloy sa proyektong ito kailangan mong i-download ang library mula sa mga sumusunod na link at i-install sa iyong IDE:

• DS1307RTC.h

Link: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Link: github.com/PaulStoffregen/Time

Ang iba pang dalawang mga aklatan ay na-preinstall sa Arduino IDE, kung ikaw ay nasa pinakabagong bersyon.

• LiquidCrystal.h

• Wire.h

Ang Circuit:

Ang koneksyon sa circuit sa pagitan ng arduino at LCD display ay pamantayan, na maaari naming makita ang katulad na koneksyon sa iba pang mga proyektong batay sa LCD. Ang tanging karagdagang sangkap ay ang RTC.

Upang mabawasan ang kasikipan ng kawad sa panahon ng prototype, ang RTC ay maaaring maipasok sa mga analogue pin nang direkta ng arduino. Paghinang ng SCl, SDA, Vcc, at GND gamit ang mga male header pin at ipasok ito A2 hanggang A5 pin tulad ng ipinakita sa prototype.

Prototype ng may-akda:

Paano maayos na ipasok ang RTC sa Arduino:

Kung ang iyong RTC ay may iba't ibang mga lokasyon ng pin at hindi maaaring gayahin tulad ng nakalarawan sa itaas, maaari mong palaging gumamit ng mga wire para sa koneksyon. Ngayon kumpleto na ang pag-set up ng iyong hardware, lumipat tayo sa bahagi ng software ng proyekto.

Paano magtakda ng oras:

Kapag na-program ang module ng RTC, pinapanatili nito ang oras kahit na ito ay tinanggal mula sa arduino. Ang baterya ay dapat tumagal ng hindi bababa sa isang pares ng mga taon.

Walang pindutan upang ayusin ang oras na susundan ng sumusunod na programa ang oras sa RTC. Ang oras ay awtomatikong na-synchronize sa oras ng iyong computer, habang pinagsasama ang code, kaya tiyaking ang iyong computer ay nakatakda upang itama ang oras, bago i-upload ang mga programa.
I-upload ang code na 'SetTime' na ito upang maitakda ang oras gamit ang RTC na naka-plug in:

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

Kapag na-upload na ang code na ito, buksan ang serial monitor at isang mensahe ng tagumpay ay dapat na mag-pop up na sinasabi na ang oras ay itinakda.

Ito ay nagpapahiwatig na ang iyong koneksyon sa pagitan ng RTC at arduino ay tama at ang oras ay itinakda.

Ngayon i-upload ang sumusunod na code para sa pagpapakita ng oras sa 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-------// 

Kapag tapos na ito dapat mong makita ang oras at petsa ay ipinapakita sa LCD at tumatakbo.

Tandaan: Ang code na 'SetTime' ay binago mula sa halimbawang code ng DS1307RTC upang ma-optimize ang mga koneksyon sa wire para sa module ng RTC, hindi magtatakda ng oras ang pag-upload ng orihinal na code.

Digital Alarm Clock Gamit ang Arduino

Sa itaas na ito natutunan namin kung paano bumuo ng pangunahing orasan ng Arduino gamit ang module ng RTC, sa sumusunod na seksyon ay sinisiyasat namin kung paano ito maa-upgrade sa isang digital alarm circuit circuit gamit ang Arduino.

Mayroong ilang mga tao na hindi nangangailangan ng orasan ng alarma, natural silang gumising at may ilang mga tao na gumising pagkatapos ng pag-ring ng alarm clock ilang beses at may ilang mga tao na pinindot ang pindutan ng pag-snooze ng maraming beses at pumunta para sa kanilang kolehiyo / nagtatrabaho nang huli ilang mga dahilan

Ang iminungkahing masaya na maliit na proyekto ng alarm clock ay maaaring harapin ang problema sa katamaran sa paggising ng umaga. Karamihan sa mga orasan ng alarma ay may isang pindutan ng pag-snooze at paunang natukoy na oras ng pag-cut para sa alarma kung hindi tumugon ang gumagamit.

Dinisenyo namin ang orasan ng alarma na ito nang walang isang tamad na pindutan (pindutan ng pag-snooze) at hindi papatayin ang alarma hanggang sa itulak ng gumagamit ang isang pindutan.

Ang orasan na ito ay maaaring magpakita ng oras sa format na 12 oras at petsa sa format na DD / MM / YYYY.

Ang oras at petsa ay ipapakita sa 16 x 2 LCD display. Ang isang RTC o module ng oras ng real time na orasan ay mag-aalaga ng pagsubaybay sa oras at maaaring mapanatili ang tamang oras kahit na matapos ang isang mahabang pagputol ng kuryente.

Mayroong 5 mga pindutan na ibinigay kung sino ang pagpapaandar ay ipapaliwanag sa ilang sandali. Ang utak ng proyektong Arduino ay maaaring may anumang modelo na iyong pinili, inirerekumenda namin ang Arduino pro mini o Arduino nano dahil sa compact size nito.

Ngayon sumisid tayo sa mga iskema.

Ang nasa itaas ay ang eskematiko ay para sa Arduino upang ipakita ang koneksyon, ayusin ang kaibahan sa display sa pamamagitan ng pag-ikot ng 10K potentiometer.

Ang nasa ibaba ay ang natitirang circuit:

Ang circuit ay maaaring pinalakas 9V 500mA wall adapter.

Mga pagpapaandar ng 5 mga pindutan:

S1 - Ginagamit ito para ihinto ang alarma (ito rin ay naka-reset na pindutan).
S2 - Ginagamit para sa setting ng alarma. Sa pamamagitan ng mahabang pagpindot sa S2 makakarating ka sa menu ng setting ng alarma.
S3 - Ginagamit ito upang magdagdag ng oras.
S4 - ginagamit ito upang magdagdag ng minuto.
S5 - Ginagamit para sa pag-toggle ng katayuan sa alarma. Kung ang '*' umiiral sa LCD display sa kanang sulok sa ibabang sulok ay nakabukas ang alarma, kung ang '*' ay hindi umiiral ang mga istatistika ng alarma ay OFF.

Ang mas maraming detalye sa kung paano magtakda ng alarma ay ipinaliwanag sa ilalim ng artikulo.

I-download ang mga file ng library sa ibaba:

Link1: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

Ngayon, kailangan naming magtakda ng oras sa module ng RTC, ang oras ay mai-synchronize mula sa iyo PC sa module ng RTC.

I-upload ang code sa ibaba upang magtakda ng oras at buksan ang Serial monitor:

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

Ngayon ay matagumpay mong naitakda ang oras sa RTC
Susunod, kailangan mong i-upload ang sumusunod na pangunahing code:

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

Matapos i-upload ang code sa itaas dapat mong makita ang tamang oras at petsa na tumatakbo sa display.

Tingnan natin ngayon kung paano magtakda ng alarma:
• Pindutin nang matagal ang S2 hanggang sa makita mo ang menu ng Alarm.
• Pindutin ang S3 at S4 upang ayusin ang mga oras at minuto ayon sa pagkakabanggit.
• Matapos ang nais na oras na itinakda, pindutin muli ang S2. Sasabihin nito na 'Ang alarma ay nakatakda para sa xx: xx oras'.
• Kung NAKA-ON ang alarma maaari mong makita ang simbolong “*” sa display, kung ang alarm ay NAKA-OFF ay walang simbolong “*”.
• Maaari mong i-on / i-off ang alarma sa pamamagitan ng pagpindot sa S5 sa kalahating segundo. Huwag pindutin nang matagal hanggang sa mawala ang '*' (bumalik ulit ito), pindutin lamang ang kalahating segundo ang haba upang i-toggle ang katayuan ng alarma.

MAHALAGANG PAALAALA:

Ang pinakakaraniwang pagkakamali habang nagtatakda ng isang alarma sa anumang orasan ay hindi sinasadya na pag-toggle ng AM / PM, na nagreresulta sa hindi pag-ring ng alarma sa oras ng pagnanasa.

Upang kontrahin ang isyung ito ang iminungkahing setting ng alarm clock ay idinisenyo sa 24 na oras na format ng orasan.

Ang oras na ipinapakita sa LCD ay 12 oras na may AM / PM format ngunit, kapag nagtakda ka ng isang alarma sa proyektong ito kailangan mong itakda sa 24 na oras na format mula 0 hanggang 23 oras.

Halimbawa: kung nais mong magtakda ng alarma sa 9:00 PM kailangan mong magtakda ng 21 oras at 0 minuto. Para sa, 5 AM: 5 oras at 0 minuto at iba pa.

Prototype ng may-akda:

Gusto mo ba ng proyektong ito? Magkaroon ng anumang katanungan tungkol sa proyektong ito, huwag mag-atubiling ipahayag sa komento, maaari kang makatanggap ng mabilis na tugon.

Video Clip:




Nakaraan: Circuit Level Level ng Beacon para sa Combine Harvester Grain Tanks Susunod: 3 Mataas na Lakas ng SG3525 Purong Sinewave Inverter Circuits