Jam Digital Arduino Menggunakan Modul RTC

Coba Instrumen Kami Untuk Menghilangkan Masalah





Dalam posting ini kita akan membuat jam digital menggunakan modul RTC atau Real Time Clock. Kami akan memahami apa itu modul 'RTC', bagaimana berinteraksi dengan Arduino dan apa fungsinya.

Oleh:



Modul RTC adalah sirkuit yang melacak waktu saat ini secara akurat. Ia melakukan dua fungsi, ia berkomunikasi dengan mikrokontroler dan mikroprosesor untuk memberikan waktu saat ini dan bertindak sebagai sirkuit cadangan untuk menjaga waktu jika terjadi kegagalan daya, karena ia memiliki sistem cadangan baterai bawaan.

Kami dapat menemukan RTC di perangkat elektronik mana pun di mana waktu merupakan fungsi penting dari gadget.



Misalnya, komputer atau laptop kita mempertahankan waktunya bahkan setelah daya dicabut atau baterai dicabut. Di motherboard komputer mana pun kita dapat menemukan baterai CMOS, yang memberi daya pada sirkuit RTC.

Jenis sirkuit serupa yang akan kita gunakan dalam proyek ini.

Modul RTC adalah perangkat murah yang dapat ditemukan di situs E-commerce mana pun dan toko proyek elektronik lokal Anda.

Ilustrasi modul RTC DS1307 biasa:

Sebagian besar modul RTC dilengkapi dengan baterai (CR2032) pada saat pembelian. Ada berbagai ukuran dan model, ilustrasi di atas mungkin tidak sama untuk Anda. Tapi pastikan nomor modelnya adalah DS1307. Kode yang ditulis di posting ini hanya kompatibel dengan DS1307.

Sekarang Anda tahu sesuatu tentang RTC. Sekarang mari beralih ke desain jam digital. Sebelum melanjutkan proyek ini, Anda perlu mengunduh pustaka dari tautan berikut dan menginstalnya di IDE Anda:

• DS1307RTC.h

Tautan: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Tautan: github.com/PaulStoffregen/Time

Dua pustaka lainnya telah diinstal sebelumnya di Arduino IDE, jika Anda menggunakan versi terbaru.

• LiquidCrystal.h

• Wire.h

Sirkuit:

Koneksi sirkuit antara arduino dan layar LCD adalah standar, yang dapat kita temukan koneksi serupa pada proyek berbasis LCD lainnya. Satu-satunya komponen tambahan adalah RTC.

Untuk mengurangi kemacetan kabel selama prototipe, RTC dapat dimasukkan ke pin analog langsung dari arduino. Solder SCl, SDA, Vcc, dan GND dengan pin header jantan dan masukkan pin A2 ke A5 seperti yang ditunjukkan pada prototipe.

Prototipe penulis:

Cara memasukkan RTC dengan benar di Arduino:

Jika RTC Anda memiliki lokasi pin yang berbeda dan tidak dapat mereplikasi seperti yang diilustrasikan di atas, Anda selalu dapat menggunakan kabel untuk koneksi. Sekarang penyiapan perangkat keras Anda selesai, mari beralih ke bagian perangkat lunak dari proyek tersebut.

Cara mengatur waktu:

Setelah modul RTC diprogram, ia mempertahankan waktu meskipun modul tersebut dihapus dari arduino. Baterai harus bertahan setidaknya beberapa tahun.

Tidak ada tombol untuk mengatur waktu program berikut akan mengatur waktu di RTC. Waktu secara otomatis disinkronkan dengan waktu komputer Anda, saat menyusun kode, jadi pastikan komputer Anda disetel ke waktu yang benar, sebelum mengunggah program.
Unggah kode 'SetTime' ini untuk menyetel 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 kode ini diunggah, buka monitor serial dan pesan sukses akan muncul yang mengatakan waktu telah ditetapkan.

Ini menandakan bahwa koneksi Anda antara RTC dan Arduino sudah benar dan waktu sudah diatur.

Sekarang unggah kode berikut untuk menampilkan waktu di 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 waktu dan tanggal ditampilkan pada LCD dan berjalan.

catatan: Kode 'SetTime' dimodifikasi dari kode contoh DS1307RTC untuk mengoptimalkan koneksi kabel untuk modul RTC, mengupload kode asli tidak akan menyetel waktu.

Jam Alarm Digital Menggunakan Arduino

Di atas ini kita belajar bagaimana membangun jam Arduino dasar menggunakan modul RTC, pada bagian berikut kami menyelidiki bagaimana ini dapat ditingkatkan menjadi rangkaian jam alarm digital menggunakan Arduino.

Ada sebagian orang yang tidak memerlukan jam weker, mereka bangun secara alami dan ada sebagian orang yang bangun setelah jam weker berdering beberapa kali dan ada sebagian orang yang menekan tombol snooze beberapa kali dan pergi ke kampus / bekerja sampai larut malam. beberapa alasan.

Proyek jam alarm kecil yang menyenangkan yang diusulkan mungkin menghadapi masalah dengan kemalasan saat bangun pagi. Sebagian besar jam alarm memiliki tombol tunda dan batas waktu yang ditentukan sebelumnya untuk alarm jika pengguna tidak merespons.

Kami merancang jam alarm ini tanpa tombol malas (tombol snooze) dan alarm tidak akan mati sampai pengguna menekan tombol.

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

Waktu dan tanggal akan ditampilkan pada layar LCD 16 x 2. Modul waktu jam RTC atau waktu nyata akan menangani pelacakan waktu dan dapat mempertahankan waktu yang tepat bahkan setelah pemadaman listrik yang lama.

Ada 5 tombol yang fungsinya akan dijelaskan sebentar lagi. Otak proyek Arduino dapat model apa pun pilihan Anda, kami akan merekomendasikan Arduino pro mini atau Arduino nano karena ukurannya yang ringkas.

Sekarang mari selami skema.

Di atas adalah skema untuk Arduino untuk menampilkan koneksi, mengatur kontras tampilan dengan memutar potensiometer 10K.

Di bawah ini adalah sisa rangkaiannya:

Sirkuit dapat didukung adaptor dinding 9V 500mA.

Fungsi dari 5 tombol:

S1 - Ini digunakan untuk menghentikan alarm (juga tombol reset).
S2 - Digunakan untuk mengatur alarm. Dengan menekan S2 lama Anda akan masuk ke menu pengaturan alarm.
S3 - Digunakan untuk menambah jam.
S4 - digunakan untuk menambah menit.
S5 - Digunakan untuk mengubah status alarm. Jika '*' ada pada tampilan LCD di pojok kanan bawah, alarm ON, jika '*' tidak ada, statistik alarm OFF.

Detail lebih lanjut tentang cara menyetel alarm dijelaskan di bagian bawah artikel.

Unduh file perpustakaan di bawah ini:

Tautan1: github.com/PaulStoffregen/DS1307RTC
Tautan2: github.com/PaulStoffregen/Time

Sekarang, kita harus mengatur waktu ke modul RTC, waktu akan disinkronkan dari modul PC ke RTC Anda.

Unggah kode di bawah ini untuk mengatur waktu dan membuka 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 } //----------------------------------------// 

Sekarang Anda telah berhasil mengatur waktu ke RTC
Selanjutnya, Anda perlu mengunggah kode 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-------// 

Setelah mengupload kode di atas, Anda harus melihat waktu dan tanggal yang benar di layar.

Sekarang mari kita lihat cara menyetel alarm:
• Tekan lama S2 sampai Anda dapat melihat menu Alarm.
• Tekan S3 dan S4 untuk menyesuaikan jam dan menit masing-masing.
• Setelah pengaturan waktu yang diinginkan, tekan S2 sekali lagi. Ini akan mengatakan 'Alarm disetel untuk xx: xx jam'.
• Jika alarm ON Anda dapat melihat simbol '*' pada tampilan, jika alarm OFF tidak akan ada simbol '*'.
• Anda dapat menghidupkan / mematikan alarm dengan menekan S5 selama setengah detik. Jangan tekan lama sampai '*' hilang (muncul kembali), cukup tekan setengah detik untuk beralih status alarm.

CATATAN PENTING:

Kesalahan paling umum saat menyetel alarm pada jam mana pun adalah tidak sengaja mengubah AM / PM, yang mengakibatkan tidak berderingnya alarm pada waktu yang kita inginkan.

Untuk mengatasi masalah ini, pengaturan jam alarm yang diusulkan dirancang dalam format jam 24 jam.

Waktu yang ditampilkan di LCD adalah 12 jam dengan format AM / PM tetapi, ketika Anda menyetel alarm dengan proyek ini, Anda harus menyetel dalam format 24 jam dari 0 hingga 23 jam.

Misalnya: jika Anda ingin menyetel alarm pada pukul 21.00 Anda harus menyetel 21 jam dan 0 menit. Untuk jam 5 pagi: 5 jam 0 menit dan seterusnya.

Prototipe penulis:

Apakah Anda menyukai proyek ini? Punya pertanyaan tentang proyek ini, jangan ragu untuk mengungkapkannya di komentar, Anda dapat menerima balasan cepat.

Klip video:




Sepasang: Sirkuit Indikator Level Suar untuk Combine Harvester Grain Tanks Berikutnya: 3 Sirkuit Inverter Sinewave Murni SG3525 Daya Tinggi