DS1307 ile Gerçek Zaman Saati (RTC) Yapımı ve Arduino ile Kullanımı
Arduino projelerimizde zaman zaman gerçek zaman saatine ihtiyaç duyarız. Saate göre açılıp kapanan röleler, tarih veya saate göre veri kaydetme gibi konularda enerji kayıplarından (elektrik kesilmesi vs.) etkilenmeyen bir saate ihtiyaç duyuyorsanız DS1307 ile bu temel devreyi kurarak ihtiyacınızı karşılayabilirsiniz.
Gerekli Malzemeler:
- 1 adet 32.768 KHz kristal
- 1 adet CR2032 pil
- 1 adet CR2032 pil yuvası
- 1 adet DS1307
- 1 adet 0.1?F kondansatör
- 3 adet 10K direnç
Yukarıda şemasını verdiğim devreyi breadboard ya da delikli bakır plakete kurduktan sonra SDA-Arduino Analog4 ve SCL-Arduino Analog5 bağlantılarını yapıyoruz. İnternette DS1307 gerçek zaman saati (RTC) pek çok kütüphane mevcut.
Aşağıda DS1307new kütüphanesi ile çalışan, (en alttaki bağlantılardan dosyalarını indirebilirsiniz.) düzenleyip sadeleştirdiğim örnek bir programı paylaşıyorum. Program eğer daha önce ayarlanmamışsa saat ve tarih verilerini sizin girdiğiniz değerlere göre DS1307 NV-RAMine kaydediyor. Daha sonra saniyede bir tarih ve saat bilgilerini serial monitorde yazdırıyor.
Programda içerisinde açıklamalarda da belirttim fakat yine yazayım. Saat ve tarihi tekrar ayarlamak için DS1307nin pil ve 5v bağlantısını kesip bir süre beklemek gerekiyor. Daha sonra sketchdeki değerleri değiştirerek saat ve tarih değerlerini ayarlayabilirsiniz.
// ################################################################################## // # Yazar : Peter Schmelzer, Oliver Kraus // # Düzenleme : İsmail BUÇGÜN // # DS1307new kütüphanesi için test programı. CR2032 pil desteği ile hazırladığınız // # DS1307 devrenizi Arduinonuzun I2C pinlerine bağladıktan sonra programı // # yükleyerek devrenizi test edebilirsiniz. // ################################################################################## #include <Wire.h> // Wire kütüphanesini ekliyoruz. #include <DS1307new.h> // DS1307new kütüphanesini ekliyoruz. // Değişkenler uint16_t startAddr = 0x0000; // NV-RAM'de saklamak için başlangıç adresi uint16_t lastAddr; // NV-RAM'de saklamak için yeni adres uint16_t TimeIsSet = 0xaa55; // Saatin tekrar ayarlanmamasına yardımcı olur. void setup() { Serial.begin(9600); // Store startAddr in NV-RAM address 0x08 RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t)); RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); if (TimeIsSet != 0xaa55) // Saat ve tarih daha önce ayarlanmış mı kontrol ediyoruz. Eğer ayarlanmamışsa // TimeIsSet değişkeni 0xaa55 değerine eşit değilse aşağıda girdiğimiz // verilerle saati ayarlamış oluruz. { RTC.stopClock(); // Bu kısımdan sketchi yüklemeden önce tarih ve saati ayarlayabilirsiniz. // Bir kez ayarlayıp yükledikten sonra tekrar tarih saat ayarı yapabilmek // için entegreye bağlı batarya bağlantısı ve Arduinodan sağladığımız // 5v enerjiyi kesip bir süre beklemek gerekiyor. Daha sonra programda tarih // ve saati ayarladıktan sonra yüklediğinizde NV-RAMe ayarladığınız tarih ve // saat bilgileri kaydedilecektir. İlk satırı (Yıl,Ay,Gün), ikinci satırı // (Saat,Dakika,Saniye) formatında yazmanız gerekiyor. RTC.fillByYMD(2011,4,8); RTC.fillByHMS(22,7,0); RTC.setTime(); TimeIsSet = 0xaa55; RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); RTC.startClock(); } else { RTC.getTime(); } Serial.println("DS1307new Kutuphanesi Test Programi"); Serial.println("Tarih Saat Formati "SS:DD:ss GG-AA-YYY DDD""); Serial.println("Her saniye alt satira gecerek o anki zamani gosterir."); Serial.println(); } void loop() { RTC.getTime(); // Saat ve Tarih verilerini al if (RTC.hour < 10) { Serial.print("0"); Serial.print(RTC.hour, DEC); } else { Serial.print(RTC.hour, DEC); } Serial.print(":"); if (RTC.minute < 10) { Serial.print("0"); Serial.print(RTC.minute, DEC); } else { Serial.print(RTC.minute, DEC); } Serial.print(":"); if (RTC.second < 10) { Serial.print("0"); Serial.print(RTC.second, DEC); } else { Serial.print(RTC.second, DEC); } Serial.print(" "); if (RTC.day < 10) { Serial.print("0"); Serial.print(RTC.day, DEC); } else { Serial.print(RTC.day, DEC); } Serial.print("-"); if (RTC.month < 10) { Serial.print("0"); Serial.print(RTC.month, DEC); } else { Serial.print(RTC.month, DEC); } Serial.print("-"); Serial.print(RTC.year, DEC); // Yılda herhangi bir değişikliğe gerek yok Serial.print(" "); switch (RTC.dow) // Haftanın günü { case 1: Serial.print("PZT"); break; case 2: Serial.print("SAL"); break; case 3: Serial.print("CAR"); break; case 4: Serial.print("PER"); break; case 5: Serial.print("CUM"); break; case 6: Serial.print("CTS"); break; case 7: Serial.print("PAZ"); break; } Serial.println(); delay(1000); // 1 saniye bekle }
DS1307new kütüphanesinde pek çok fonksiyon bulunmakta. Yukarıdaki örnekte sadece saat ve tarih verilerini ayarlama ve alma fonksiyonlarını kullanılmış. Kütüphanedeki diğer fonksiyonlar hakkındaki bilgilere kütüphane sayfasındaki Wiki bölümünden ulaşabilirsiniz.
İyi çalışmalar…
Kaynaklar:
Gerekli Olabilecek Bağlantılar:

