Jam Digital Arduino Menggunakan Modul RTC

Cuba Instrumen Kami Untuk Menghapuskan Masalah





Dalam catatan ini kita akan membina jam digital menggunakan modul RTC atau Real Time Clock. Kami akan memahami apa itu modul 'RTC', bagaimana berinteraksi dengan Arduino dan apa yang dilakukannya.

Oleh:



Modul RTC adalah litar, yang mengesan masa semasa dengan tepat. Ia melakukan dua fungsi, ia berkomunikasi dengan mikrokontroler dan mikropemproses untuk memberi masa semasa dan bertindak sebagai litar sandaran untuk mengekalkan masa sekiranya berlaku gangguan kuasa, kerana ia mempunyai sistem sandaran bateri bawaan.

Kita boleh menemui RTC di mana-mana peranti elektronik di mana masa adalah fungsi penting alat.



Sebagai contoh, komputer atau komputer riba kita mengekalkan waktunya walaupun setelah bekalan elektrik dicabut atau bateri dikeluarkan. Di papan induk komputer mana pun kita dapat menemui bateri CMOS, yang menguatkan rangkaian RTC.

Litar sejenis yang akan kita gunakan dalam projek ini.

Modul RTC adalah peranti murah yang boleh didapati di mana-mana laman web E-dagang dan kedai projek elektronik tempatan anda.

Ilustrasi modul RTC khas DS1307:

Sebilangan besar modul RTC dilengkapi dengan bateri (CR2032) pada masa pembelian. Terdapat pelbagai ukuran dan model, gambar di atas mungkin tidak sama untuk anda. Tetapi pastikan nombor modelnya adalah DS1307. Kod yang ditulis dalam catatan ini hanya serasi dengan DS1307.

Sekarang anda mengetahui sesuatu mengenai RTC. Sekarang mari beralih ke reka bentuk jam digital. Sebelum meneruskan projek ini, anda perlu memuat turun perpustakaan dari pautan berikut dan pasang di IDE anda:

• DS1307RTC.h

Pautan: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Pautan: github.com/PaulStoffregen/Time

Dua perpustakaan lain akan diprapasang di Arduino IDE, jika anda menggunakan versi terbaru.

• LiquidCrystal.h

• Wire.h

Litar:

Sambungan litar antara paparan arduino dan LCD adalah standard, yang mana kami dapati sambungan serupa pada projek berasaskan LCD lain. Satu-satunya komponen tambahan ialah RTC.

Untuk mengurangkan kesesakan wayar semasa prototaip, RTC dapat dimasukkan ke pin analog langsung dari arduino. Selesaikan SCl, SDA, Vcc, dan GND dengan pin header lelaki dan masukkan pin A2 hingga A5 seperti yang ditunjukkan dalam prototaip.

Prototaip pengarang:

Cara memasukkan RTC dengan betul di Arduino:

Sekiranya RTC anda mempunyai lokasi pin yang berbeza dan tidak dapat meniru seperti yang digambarkan di atas, anda selalu boleh menggunakan kabel untuk sambungan. Sekarang persediaan perkakasan anda selesai, mari kita beralih ke bahagian perisian projek.

Cara menetapkan masa:

Setelah modul RTC diprogramkan, ia akan mengekalkan waktu walaupun dikeluarkan dari arduino. Bateri boleh bertahan sekurang-kurangnya beberapa tahun.

Tidak ada butang untuk menyesuaikan waktu program berikut akan menetapkan waktu dalam RTC. Waktu diselaraskan secara automatik dengan waktu komputer anda, semasa menyusun kod, jadi pastikan komputer anda disetel untuk membetulkan waktu, sebelum memuat naik program.
Muat naik kod 'SetTime' ini untuk menetapkan waktu dengan RTC terpasang:

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

Setelah kod ini dimuat, buka monitor bersiri dan mesej kejayaan akan muncul dengan mengatakan bahawa waktunya telah ditetapkan.

Ini menandakan bahawa hubungan anda antara RTC dan arduino betul dan masa telah ditetapkan.

Sekarang muat naik kod berikut untuk memaparkan waktu dalam 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-------// 

Setelah ini selesai, anda akan melihat masa dan tarikh dipaparkan di LCD dan berjalan.

Catatan: Kod 'SetTime' diubah dari contoh kod DS1307RTC untuk mengoptimumkan sambungan wayar untuk modul RTC, memuat naik kod asal tidak akan menetapkan masa.

Jam Penggera Digital Menggunakan Arduino

Di atas ini kita belajar bagaimana membuat jam Arduino asas menggunakan modul RTC, pada bahagian berikut kita menyiasat bagaimana ini dapat ditingkatkan menjadi litar jam penggera digital menggunakan Arduino.

Ada beberapa orang yang tidak memerlukan jam penggera, mereka bangun secara semula jadi dan ada beberapa orang yang bangun setelah jam penggera berdering beberapa kali dan ada beberapa orang yang menekan butang tunda beberapa kali dan pergi ke kuliah / bekerja mereka lewat beberapa alasan.

Projek jam penggera kecil yang dicadangkan dapat mengatasi masalah dengan kemalasan ketika bangun pagi. Sebilangan besar jam penggera mempunyai butang tunda dan waktu pemutusan yang telah ditentukan untuk penggera sekiranya pengguna tidak memberi respons.

Kami merancang jam penggera ini tanpa butang malas (butang tunda) dan penggera tidak akan mematikan sehingga pengguna menekan butang.

Jam ini dapat menunjukkan waktu dalam format 12 jam dan tarikh dalam format DD / MM / YYYY.

Waktu dan tarikh akan dipamerkan pada paparan LCD 16 x 2. Modul waktu jam RTC atau masa nyata akan menjaga pengesanan masa dan dapat mengekalkan waktu yang betul walaupun selepas pemotongan kuasa yang lama.

Terdapat 5 butang dengan syarat fungsi siapa yang akan dijelaskan sebentar lagi. Otak projek Arduino dapat model pilihan anda, kami akan mengesyorkan Arduino pro mini atau Arduino nano kerana saiznya yang padat.

Sekarang mari kita selami skema.

Di atas adalah skema untuk Arduino menampilkan sambungan, menyesuaikan kontras paparan dengan memutar potensiometer 10K.

Berikut adalah litar yang selebihnya:

Litar boleh dihidupkan sebagai penyesuai dinding 9V 500mA.

Fungsi 5 butang:

S1 - Ini digunakan untuk menghentikan penggera (ia juga butang reset).
S2 - Digunakan untuk menetapkan penggera. Dengan menekan lama S2, anda akan sampai ke menu tetapan penggera.
S3 - Ia digunakan untuk menambah jam.
S4 - ia digunakan untuk menambah minit.
S5 - Digunakan untuk menukar status penggera. Sekiranya '*' ada di paparan LCD di sudut kanan bawah sebelah kanan, alarm dihidupkan, jika '*' tidak ada, statistik penggera MATI.

Lebih terperinci mengenai cara menetapkan penggera dijelaskan di bahagian bawah artikel.

Muat turun fail perpustakaan di bawah:

Pautan1: github.com/PaulStoffregen/DS1307RTC
Pautan2: github.com/PaulStoffregen/Time

Sekarang, kita harus menetapkan waktu ke modul RTC, waktunya akan diselaraskan dari modul PC ke RTC anda.

Muat naik kod di bawah untuk menetapkan masa dan buka monitor Serial:

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

Kini anda berjaya menetapkan masa ke RTC
Seterusnya, anda perlu memuat naik kod utama berikut:

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

Selepas memuat naik kod di atas, anda mesti melihat masa dan tarikh yang betul berjalan di paparan.

Sekarang mari kita lihat cara menetapkan penggera:
• Tekan lama S2 sehingga anda dapat melihat menu Penggera.
• Tekan S3 dan S4 untuk menyesuaikan jam dan minit masing-masing.
• Selepas masa yang diinginkan, tekan S2 sekali lagi. Ia akan berbunyi 'Penggera ditetapkan untuk xx: xx jam'.
• Jika penggera AKTIF, Anda dapat melihat simbol '*' di layar, jika penggera MATI tidak akan ada simbol '*'.
• Anda boleh menghidupkan / mematikan penggera dengan menekan S5 selama setengah saat. Jangan tekan lama sehingga '*' lenyap (ia kembali lagi), cukup tekan setengah saat untuk menukar status penggera.

NOTA PENTING:

Kesalahan yang paling biasa semasa menetapkan penggera pada jam mana pun adalah tidak sengaja menukar PG / PM, yang mengakibatkan tidak membunyikan penggera pada waktu keinginan kita.

Untuk mengatasi masalah ini, tetapan jam penggera yang dicadangkan dirancang pada format jam 24 jam.

Masa yang dipaparkan di LCD akan menjadi 12 jam dengan format AM / PM tetapi, apabila anda menetapkan penggera dengan projek ini, anda harus menetapkan format 24 jam dari 0 hingga 23 jam.

Contohnya: jika anda mahu menetapkan penggera pada 21:00, anda mesti menetapkan 21 jam dan 0 minit. Untuk, 5 AM: 5 jam 0 minit dan seterusnya.

Prototaip pengarang:

Adakah anda suka projek ini? Ada sebarang pertanyaan mengenai projek ini, jangan ragu untuk memberikan komen, anda mungkin akan mendapat balasan cepat.

Klip video:




Sebelumnya: Litar Petunjuk Tahap Beacon untuk Menggabungkan Tangki Biji Harvester Seterusnya: 3 Litar Inverter Sinewave Tulen SG3525 Daya Tinggi