Arduino Alarm Clock ម៉ោងអូតូ
នៅក្នុងគម្រោងនេះយើងបានបង្កើតនាឡិការ Real Time Clock មួយជាមួយនឹងការជូនដំណឹង។ នាឡិការពិតប្រាកដឬ RTC គឺជានាឡិកាប្រើថ្មដែលវាស់ពេលសូម្បីតែពេលគ្មានថាមពលខាងក្រៅឬ microcontroller ត្រូវបានគេធ្វើឡើងវិញ។
RTC បង្ហាញនាឡិកានិងប្រតិទិនជាមួយនឹងមុខងារគ្រប់ពេលទាំងអស់។ ថ្មដែលត្រូវបានតភ្ជាប់ទៅ RTC គឺដាច់ដោយឡែកមួយហើយមិនត្រូវបានទាក់ទងឬភ្ជាប់ទៅនឹងការផ្គត់ផ្គង់ថាមពល។
RTC បង្ហាញនាឡិកានិងប្រតិទិនជាមួយនឹងមុខងារគ្រប់ពេលទាំងអស់។ ថ្មដែលត្រូវបានតភ្ជាប់ទៅ RTC គឺដាច់ដោយឡែកមួយហើយមិនត្រូវបានទាក់ទងឬភ្ជាប់ទៅនឹងការផ្គត់ផ្គង់ថាមពល។
នៅពេលដែលថាមពលត្រូវបានស្តារឡើងវិញ RTC បង្ហាញពេលវេលាពិតដោយមិនគិតពីរយៈពេលដែលថាមពលបិទ។ នាឡិការនាឡិកាពិតប្រាកដនេះត្រូវបានគេរកឃើញជាទូទៅនៅក្នុងកុំព្យូទ័រហើយត្រូវបានគេសំដៅជា CMOS (លោហធាតុផ្សំពីលោហធាតុផ្សំ) ។
microcontrollers និង microprocessors ភាគច្រើនបានសាងសង់ឡើងនៅក្នុងកម្មវិធីកំណត់ពេលវេលាសម្រាប់ការរក្សាទុកពេលវេលា។ ប៉ុន្តែពួកវាដំណើរការបានតែនៅពេលដែលឧបករណ៍បញ្ជាមីក្រូត្រួតពិនិត្យត្រូវបានភ្ជាប់ទៅនឹងការផ្គត់ផ្គង់ថាមពល។
នៅពេលដែលថាមពលត្រូវបានបើកឧបករណ៍កំណត់ពេលខាងក្នុងត្រូវបានកំណត់ទៅជា 0. ដូច្នេះឈីប RTC ដាច់ដោយឡែកត្រូវបានរួមបញ្ចូលនៅក្នុងកម្មវិធីដូចជាឧបករណ៍ចូលទិន្នន័យឧទាហរណ៍ដែលមិនកំណត់ទៅជា 0 នៅពេលដែលថាមពលត្រូវបានបិទឬកំណត់ឡើងវិញ។
នាឡិការពិតប្រាកដជារឿយៗមានប្រយោជន៍ក្នុងការកត់ត្រាទិន្នន័យកម្មវិធីម៉ោងបណ្តោះអាសន្នសញ្ញារោទ៍នាឡិកាពេលវេលានាឡិកាបង្កើតជាដើម។ នៅក្នុងគម្រោងនេះនាឡិការហ្វ្រេសពិតប្រាកដដែលបង្ហាញពេលវេលានិងកាលបរិចេ្ឆទត្រឹមត្រូវរួមជាមួយនឹងលក្ខណៈពិសេសនៃការជូនដំណឹងត្រូវបានរចនាឡើង។
មួយក្នុងចំណោម ICTC ដែលប្រើជាញឹកញាប់ ICs DS1307 ត្រូវបានប្រើនៅក្នុងគម្រោងនេះរួមជាមួយ Arduino ។ សៀគ្វីការរចនានិងការងារត្រូវបានពន្យល់នៅក្នុងផ្នែកដូចខាងក្រោម។
Components Required
- Arduino UNO – 1
- DS 1307 RTC Module – 1
- Push Buttons – 3
- 16X2 LCD Display – 1
- Buzzer – 1
- 10 KΩ – 2
- 10 KΩ POT – 1
សេចក្ដីពិពណ៌នាសមាសភាគ
DS1307
DS1307 គឺជានាឡិការពេលវេលាជាក់ស្តែង (RTC) ដែលគេប្រើញឹកញាប់បំផុតសម្រាប់ម៉ោងនិងប្រតិទិន។ មុខងារនាឡិកាផ្តល់នូវវិនាទីនាទីនិងម៉ោងខណៈពេលដែលមុខងារប្រតិទិនផ្តល់នូវតម្លៃថ្ងៃ, កាលបរិច្ឆេទ, ខែនិងឆ្នាំ។
នាឡិកាអាចដំណើរការបានក្នុងរយៈពេល 12 ម៉ោងជាមួយការបង្ហាញពី AM / PM ឬ 24 ម៉ោង។ ថ្មបម្រុងទុក 3V ត្រូវភ្ជាប់ទៅ RTC ដូច្នេះ IC អាចប្តូរដោយស្វ័យប្រវត្ដិទៅការផ្គត់ផ្គង់ទិន្នន័យបម្រុងទុកក្នុងករណីដែលការដាច់ចរន្តអគ្គិសនី។ A
ខឿនគ្រីស្តាល់ 32.768 KHz ត្រូវបានភ្ជាប់ទៅនឹងស្ថានីយ៍លំយោលនៃ DS1307 សម្រាប់ការយោល 1 Hz ។
សៀគ្វីរចនា
ការទំនាក់ទំនងរវាង microcontroller និង RTC IC IC DS1307 គឺជារថយន្តស៊េរី I2C ពីរស៊េរី។ ពិធីការ I2C គឺជាវិធីសាស្រ្តនៃការទំនាក់ទំនងរវាងឧបករណ៍លឿនជាងមុន (Microcontroller ឬ Arduino ក្នុងករណីនេះ) នៅក្នុងមេនិងឧបករណ៍យឺត (RTC) នៅក្នុងរបៀប slave ។
មានម្ជុលពីរនៅលើ Arduino សម្រាប់ទំនាក់ទំនង I2C ។ ម្ជុលអាណាឡូក 4 និង 5 នឹងដើរតួជា SDA (Serial Data) និង SCL (Serial Clock) ។
ទាំងនេះត្រូវបានភ្ជាប់ទៅនឹង SDA និង SCL រៀងៗខ្លួនរបស់ RTC ។ ចំនុចទាំងពីរនៃ RTC ត្រូវបានទាញដោយប្រើកម្លាំង10KΩ។
LCD ត្រូវបានប្រើដើម្បីបង្ហាញនាឡិកា។ 6 បន្ទះ LCD ត្រូវភ្ជាប់ជាមួយ Arduino ។ ខ្សែ RS, E, D4, D5, D6 និង D7 (Pins 4, 6, 11, 12, 13 និង 14) នៃ LCD ត្រូវបានភ្ជាប់ទៅនឹងម្ជុល 2, 3, 4, 5, 6 និង 7 នៃ Arduino ។
ប៊ូតុងបីត្រូវបានប្រើដើម្បីកំណត់សំឡេងរោទិ៍។ ប៊ូតុងទាំងនេះត្រូវបានតភ្ជាប់ទៅម្ជុល 8, 9 និង 10 នៃ Arduino ។ ឧបករណ៍រោទ៍ត្រូវបានភ្ជាប់ទៅនឹងអា 11 របស់ Arduino ដែលដើរតួជាការជូនដំណឹង។
ធ្វើការគោលបំណងនៃគម្រោងនេះគឺដើម្បីបង្កើតនាឡិកាពេលវេលាពិតរួមជាមួយនឹងលក្ខណៈពិសេសការជូនដំណឹង។ ការងារនៃគម្រោងនេះត្រូវបានពន្យល់ដូចខាងក្រោម។រាល់ការតភា្ជប់ទាំងអស់ត្រូវបានបង្កើតឡើងតាមដ្យាក្រាមសៀគ្វីដែលបានបង្ហាញ។ កូដសំរាប់ Arduino ត្រូវបានផ្ទុកឡើងហើយអេក្រង់ LCD បង្ហាញកាលបរិច្ឆេទនិងពេលវេលាបច្ចុប្បន្ន។ដើម្បីកំណត់សំឡេងរោទិ៍យើងចុចប៊ូតុង។ វានឹងទៅជារបៀបដាស់តឿននិងសួររកម៉ោងដែលមានពេលវេលាបច្ចុប្បន្នកំពុងបង្ហាញ។ ប៊ូតុងបង្កើនបន្ថែមត្រូវតែត្រូវបានចុចដើម្បីប្តូរម៉ោង។នៅពេលនាឡិកាស្ថិតនៅក្នុងទ្រង់ទ្រាយ 24 ម៉ោងម៉ោងនឹងត្រូវបានបង្កើនរវាង 0 និង 23 ។ នៅពេលដែលម៉ោងនៃការជូនដំណឹងត្រូវបានកំណត់យើងត្រូវចុចប៊ូតុងបន្ទាប់ដើម្បីចូលទៅកាន់ផ្ទាំងនាទី។ប៊ូតុងបន្ថែមម្តងទៀតត្រូវបានចុចដើម្បីផ្លាស់ប្តូរនាទី។ នៅពេលការជូនដំណឹងបានបញ្ចូលប៊ូតុងកំណត់ត្រូវបានកំណត់ហើយសំឡេងរោទ៍ត្រូវបានកំណត់។តម្លៃដែលបានបញ្ចូលជារោទិ៍ត្រូវបានរក្សាទុកក្នុង EEPROM នៃ Arduino ។ តម្លៃទាំងនេះត្រូវបានប្រៀបធៀបជាបន្តបន្ទាប់ជាមួយពេលបច្ចុប្បន្ន។នៅពេលដែលតម្លៃដែលបានរក្សាទុកនិងតម្លៃបច្ចុប្បន្នផ្គូផ្គងនោះឧបករណ៍ជូនដំណឹងសម្រាប់សំឡេងរោទិ៍នឹងត្រូវបានកេះ។ ដើម្បីបញ្ឈប់ការជូនដំណឹងប៊ូតុងបន្ទាប់ត្រូវបានចុច។
Code
#include <Wire.h> | |
#include<EEPROM.h> | |
#include <RTClib.h> | |
#include <LiquidCrystal.h> | |
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); | |
RTC_DS1307 RTC; | |
int tmp,Inc,hor,mIn,add=11; | |
int set=8; | |
int cge=9; | |
int mod=10; | |
int off=0; | |
#define buz 11 | |
int Hor,Min,Sec; | |
///////////////////////////////////////Function to adjust the time////////////////////////////////// | |
void time() | |
{ | |
int tmp=1,mins=0,hors=0,secs=0; | |
while(tmp==1) | |
{ | |
off=0; | |
if(digitalRead(cge)==0) | |
{ | |
Hor++; | |
if(Hor==24) | |
{ | |
Hor=0; | |
} | |
} | |
lcd.clear(); | |
lcd.setCursor(0,0); | |
lcd.print("Set Alarm Time "); | |
lcd.setCursor(0,1); | |
if(Hor<=9) | |
lcd.print("0"); | |
lcd.print(Hor); | |
lcd.print(":"); | |
lcd.print(Min); | |
lcd.print(":"); | |
lcd.print(Sec); | |
delay(200); | |
lcd.setCursor(0,1); | |
lcd.print(" "); | |
lcd.print(":"); | |
lcd.print(Min); | |
lcd.print(":"); | |
lcd.print(Sec); | |
delay(200); | |
if(digitalRead(set)==0) | |
{ | |
hor=Hor; | |
EEPROM.write(add++,hor); | |
tmp=2; | |
while(digitalRead(set)==0); | |
} | |
} | |
while(tmp==2) | |
{ | |
if(digitalRead(cge)==0) | |
{ | |
Min++; | |
if(Min==60) | |
{Min=0;} | |
} | |
lcd.setCursor(0,1); | |
lcd.print(Hor); | |
lcd.print(":"); | |
if(Min<=9) | |
lcd.print("0"); | |
lcd.print(Min); | |
lcd.print(":"); | |
lcd.print(Sec); | |
lcd.print(" "); | |
delay(200); | |
lcd.setCursor(0,1); | |
lcd.print(Hor); | |
lcd.print(":"); | |
lcd.print(" "); | |
lcd.print(":"); | |
lcd.print(Sec); | |
lcd.print(" "); | |
delay(200); | |
if(digitalRead(set)==0) | |
{ | |
mIn=Min; | |
EEPROM.write(add++, mIn); | |
tmp=0; | |
while(digitalRead(set)==0); | |
} | |
} | |
off=1; | |
delay(10); | |
} | |
///////////////////////////////////////////function to sound the buzzer////////////////////////////////// | |
void Buz() | |
{ | |
if(digitalRead(set)==0) | |
off=0; | |
if(off==1) | |
{ | |
digitalWrite(buz,HIGH); | |
delay(500); | |
digitalWrite(buz, LOW); | |
delay(500); | |
} | |
} | |
//////////////////////////////////////////function to compare the alarm time with current RTC time////////////////// | |
void TimeCheck() | |
{ | |
int tem[17]; | |
for(int i=11;i<17;i++) | |
{ | |
tem[i]=EEPROM.read(i); | |
} | |
if(Hor == tem[11] && Min == tem[12] && off==1) | |
{ | |
add=11; | |
Buz(); | |
Buz(); | |
lcd.clear(); | |
lcd.print("alarm..........."); | |
lcd.setCursor(0,1); | |
lcd.print("...........alarm"); | |
Buz(); | |
Buz(); | |
} | |
} | |
////////////////////////////////////////////////////////////setup/////////////////////////// | |
void setup() | |
{ | |
Wire.begin(); | |
RTC.begin(); | |
lcd.begin(16,2); | |
pinMode(cge, INPUT); | |
pinMode(set, INPUT); | |
pinMode(mod, INPUT); | |
pinMode(buz, OUTPUT); | |
digitalWrite(set, HIGH); | |
digitalWrite(mod, HIGH); | |
digitalWrite(cge, HIGH); | |
lcd.setCursor(0,0); | |
lcd.print("ELECTRONICS HUB"); | |
lcd.setCursor(0,1); | |
lcd.print(" Alarm Clock "); | |
delay(2000); | |
if(!RTC.isrunning()) | |
{ | |
RTC.adjust(DateTime(__DATE__,__TIME__)); | |
} | |
} | |
////////////////////////////////////////////////////////////loop///////////////////////////////////// | |
void loop() | |
{ | |
DateTime now = RTC.now(); | |
if(digitalRead(mod) == 0) | |
{ | |
current(); | |
time(); | |
delay(1000); | |
lcd.clear(); | |
lcd.setCursor(0,0); | |
lcd.print(" Alarm On"); | |
delay(2000); | |
} | |
lcd.clear(); | |
lcd.setCursor(0,0); | |
lcd.print("Time:"); | |
lcd.setCursor(6,0); | |
Hor=now.hour(),DEC; | |
if(Hor<=9) | |
{ | |
lcd.print("0"); | |
lcd.print(Hor=now.hour(),DEC); | |
} | |
else | |
lcd.print(Hor=now.hour(),DEC); | |
lcd.print(":"); | |
Min=now.minute(),DEC; | |
if(Min<=9) | |
{ | |
lcd.print("0"); | |
lcd.print(Min=now.minute(),DEC); | |
} | |
else | |
lcd.print(Min=now.minute(),DEC); | |
lcd.print(":"); | |
Sec=now.second(),DEC; | |
if(Sec<=9) | |
{ | |
lcd.print("0"); | |
lcd.print(Sec=now.second(),DEC); | |
} | |
else | |
lcd.print(Sec=now.second(),DEC); | |
lcd.setCursor(0,1); | |
lcd.print("Date: "); | |
lcd.print(now.day(),DEC); | |
lcd.print("/"); | |
lcd.print(now.month(),DEC); | |
lcd.print("/"); | |
lcd.print(now.year(),DEC); | |
TimeCheck(); | |
delay(200); | |
} | |
///////////////////////////////////////////////////////function to get current RTC time////////////////////////////// | |
void current() | |
{ | |
lcd.setCursor(0,1); | |
lcd.print(Hor); | |
lcd.print(":"); | |
lcd.print(Min); | |
lcd.print(":"); | |
lcd.print(Sec); | |
} | |
referent :file:///D:/arduino/Arduino%20Alarm%20Clock.html/Arduino%20Alarm%20Clock.html
No comments: