RTC Modülünü Kullanan Arduino Dijital Saat

Sorunları Ortadan Kaldırmak Için Enstrümanımızı Deneyin





Bu yazıda RTC veya Gerçek Zamanlı Saat modülünü kullanarak dijital bir saat inşa edeceğiz. 'RTC' modülünün ne olduğunu, Arduino ile nasıl arayüz kurulacağını ve ne yaptığını anlayacağız.

Tarafından:



RTC modülü, güncel zamanı doğru bir şekilde takip eden bir devredir. Dahili batarya yedekleme sistemine sahip olduğu için elektrik kesintisi durumunda zamanı korumak için yedek devre olarak görev yapmak ve mevcut zamanı vermek için mikrodenetleyiciler ve mikro işlemcilerle iletişim kurar.

RTC'yi, zamanın gadget'ın önemli bir işlevi olduğu herhangi bir elektronik cihazda bulabiliriz.



Örneğin, bilgisayarımız veya dizüstü bilgisayarımız, güç kapatıldıktan veya pil çıkarıldıktan sonra bile zamanını korur. Herhangi bir bilgisayarın ana kartında, RTC devresine güç veren bir CMOS pil bulabiliriz.

Bu projede kullanacağımız benzer türden bir devre.

RTC modülü, herhangi bir E-ticaret sitesinde ve yerel elektronik proje mağazalarınızda bulunabilen ucuz bir cihazdır.

Tipik RTC modülü DS1307'nin resmi:

RTC modüllerinin çoğu, satın alma sırasında pil (CR2032) ile birlikte gelir. Farklı boyut ve modeller vardır, yukarıda gösterilenler sizin için aynı olmayabilir. Ancak model numarasının DS1307 olduğundan emin olun. Bu yazıda yazılan kod sadece DS1307 ile uyumludur.

Artık RTC'ler hakkında bir şeyler biliyorsunuz. Şimdi dijital saat tasarımına geçelim. Bu projeye geçmeden önce aşağıdaki bağlantılardan kitaplığı indirmeniz ve IDE'nize kurmanız gerekir:

• DS1307RTC.h

Bağlantı: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Bağlantı: github.com/PaulStoffregen/Time

En son sürümdeyseniz, diğer iki kitaplık Arduino IDE'ye önceden yüklenmiş olacaktır.

• LiquidCrystal.h

• Wire.h

Devre:

Arduino ve LCD ekran arasındaki devre bağlantısı standarttır ve diğer LCD tabanlı projelerde benzer bir bağlantı bulabiliriz. Tek ek bileşen RTC'dir.

Prototip sırasında kablo tıkanıklığını azaltmak için, RTC doğrudan arduino'nun analog pinlerine takılabilir. SCl, SDA, Vcc ve GND'yi erkek başlık pimleriyle lehimleyin ve prototipte gösterildiği gibi A2 ila A5 pimlerini takın.

Yazarın prototipi:

Arduino'ya RTC nasıl doğru bir şekilde eklenir:

RTC'nizin farklı pin konumları varsa ve yukarıda gösterildiği gibi çoğaltılamazsa, bağlantı için her zaman kablo kullanabilirsiniz. Artık donanım kurulumunuz tamamlandı, şimdi projenin yazılım kısmına geçelim.

Zaman nasıl ayarlanır:

RTC modülü programlandıktan sonra, arduino'dan çıkarılsa bile zamanı korur. Pil en az birkaç yıl dayanmalıdır.

Zamanı ayarlamak için bir düğme yoktur, aşağıdaki program zamanı RTC'de ayarlayacaktır. Kodu derlerken saat bilgisayarınızın saatiyle otomatik olarak eşitlenir, bu nedenle programları yüklemeden önce bilgisayarınızın doğru zamanı ayarladığından emin olun.
RTC takılıyken zamanı ayarlamak için bu 'SetTime' kodunu yükleyin:

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

Bu kod yüklendikten sonra, seri monitörü açın ve zamanın ayarlandığını belirten bir başarı mesajı açılmalıdır.

Bu, RTC ile arduino arasındaki bağlantınızın doğru olduğunu ve zamanın ayarlandığını gösterir.

Şimdi saati LCD'de görüntülemek için aşağıdaki kodu yükleyin.

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

Bu yapıldıktan sonra saat ve tarihin LCD'de görüntülendiğini ve çalıştığını görmelisiniz.

Not: 'SetTime' kodu, RTC modülü için kablo bağlantılarını optimize etmek için DS1307RTC'nin örnek kodundan değiştirilmiştir, orijinal kodun yüklenmesi zaman ayarlamaz.

Arduino Kullanarak Dijital Çalar Saat

Yukarıda, RTC modülünü kullanarak temel Arduino saatini nasıl oluşturacağımızı öğrendik, sonraki bölümde bunun Arduino kullanarak dijital bir çalar saat devresine nasıl yükseltilebileceğini araştırıyoruz.

Çalar saate ihtiyaç duymayan bazı insanlar var, doğal olarak uyanıyorlar ve çalar saat birkaç kez çaldıktan sonra uyanan bazı insanlar var ve birkaç kez erteleme düğmesine basıp üniversitelerine / işlerine geç gidenler var. bazı bahaneler.

Önerilen eğlenceli küçük çalar saat projesi, sabah uyanma sırasında tembellikle ilgili problemle yüzleşebilir. Çoğu çalar saatin bir erteleme düğmesi ve kullanıcının yanıt vermemesi durumunda alarm için önceden belirlenmiş bir kapanma süresi vardır.

Bu çalar saati yavaş bir düğme (erteleme düğmesi) olmadan tasarladık ve kullanıcı bir düğmeye basana kadar alarm kapanmayacak.

Bu saat, saati 12 saat biçiminde ve tarihi GG / AA / YYYY biçiminde gösterebilir.

Saat ve tarih 16 x 2 LCD ekranda gösterilecektir. Bir RTC veya gerçek zamanlı saat zaman modülü, zamanı takip etmeye özen gösterir ve uzun bir elektrik kesintisinden sonra bile doğru zamanı koruyabilir.

Kısaca açıklanacak olan 5 düğme bulunmaktadır. Arduino projesinin beyni, seçtiğiniz herhangi bir model olabilir, kompakt boyutu nedeniyle Arduino pro mini veya Arduino nano'yu tavsiye ederiz.

Şimdi şemalara dalalım.

Yukarıdaki şematik, Arduino'nun bağlantıyı görüntülemesi, 10K potansiyometreyi döndürerek ekran kontrastını ayarlaması içindir.

Aşağıdakiler devrenin geri kalanıdır:

Devre, 9V 500mA duvar adaptörüne güç verilebilir.

5 düğmenin işlevi:

S1 - Bu, alarmı durdurmak için kullanılır (aynı zamanda sıfırlama düğmesidir).
S2 - Alarmı ayarlamak için kullanılır. S2'ye uzun basarak alarm ayar menüsüne geçeceksiniz.
S3 - Saatleri artırmak için kullanılır.
S4 - dakikayı artırmak için kullanılır.
S5 - Alarm durumunu değiştirmek için kullanılır. Sağ alt köşede LCD ekranda '*' varsa alarm AÇIK, '*' yoksa alarm istatistikleri KAPALI'dır.

Alarmın nasıl ayarlanacağına dair daha fazla ayrıntı, makalenin altında açıklanmıştır.

Aşağıdaki kitaplık dosyalarını indirin:

Bağlantı1: github.com/PaulStoffregen/DS1307RTC
Bağlantı2: github.com/PaulStoffregen/Time

Şimdi, zamanı RTC modülüne ayarlamalıyız, zaman PC'nizden RTC modülüne senkronize edilecektir.

Saati ayarlamak ve Seri monitörü açmak için aşağıdaki kodu yükleyin:

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

Artık zamanı başarıyla RTC'ye ayarladınız
Ardından, aşağıdaki ana kodu yüklemeniz gerekir:

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

Yukarıdaki kodu yükledikten sonra, ekranda doğru saat ve tarihin işlediğini görmelisiniz.

Şimdi alarmı nasıl ayarlayacağımızı görelim:
• Alarm menüsünü görene kadar S2'ye uzun basın.
• Saatleri ve dakikaları ayarlamak için sırasıyla S3 ve S4'e basın.
• İstenilen zaman ayarlandıktan sonra tekrar S2'ye basın. 'Alarm xx: xx saate ayarlandı' diyecektir.
• Alarm AÇIK ise, ekranda “*” sembolü görebilirsiniz, alarm KAPALI ise “*” sembolü olmayacaktır.
• S5'e yarım saniye basarak alarmı açabilir / kapatabilirsiniz. '*' Kaybolana kadar uzun süre basmayın (tekrar geri gelir), alarm durumunu değiştirmek için sadece yarım saniye basın.

ÖNEMLİ NOT:

Herhangi bir saate alarm kurarken yapılan en yaygın hata, istemeden AM / PM arasında geçiş yapmaktır, bu da arzu ettiğimiz saatte alarmın çalmaması ile sonuçlanır.

Bu sorunu gidermek için önerilen çalar saat ayarı 24 saatlik formatta tasarlanmıştır.

LCD'de gösterilen zaman, AM / PM formatında 12 saat olacaktır, ancak bu proje ile bir alarm kurduğunuzda, 24 saat formatında 0 ila 23 saat arasında ayarlamanız gerekir.

Örneğin: alarmı 21: 00'a kurmak istiyorsanız, 21 saat 0 dakikayı ayarlamanız gerekir. Sabah 5 için: 5 saat 0 dakika vb.

Yazarın prototipi:

Bu projeyi beğendin mi? Bu proje ile ilgili herhangi bir sorunuz varsa, yorumda belirtmekten çekinmeyin, hızlı bir cevap alabilirsiniz.

Video klip:




Önceki: Biçerdöver Tahıl Tankları için Beacon Seviye Gösterge Devresi Sonraki: 3 Yüksek Güçlü SG3525 Tam Sinüs İnvertör Devreleri