Merhaba arkadaşlar, bu konumuzda sizlere DS1307 RTC (Real Time Clock / Gerçek Zaman Saati) nedir, nasıl kullanılır devre kullanılması gereken minimum devre elemanlarından bahsedeceğim. 

Yazar: z1rqdym

DS1307 ile ilgili Arduino kütüphane dosyasını ve konu sonunda ise DS1307 ile ilgili Arduino uygulamasına ait Proteus8 simülasyonunu ekte zip olarak paylaşılacaktır.

Başlayalım…

DS1307 Nedir?

Bir RTC yani “Real Time Clock” Türkçesi ile “Gerçek Zaman Saati” olan DS1307 ile ayda sadece 1 dakikalık sapma meydana getiren, I2C senkron seri iletişim protokolü ile mikrodenetleyiciler ile haberleşebilen bir entegredir. Saat özelliğinin yanı sıra devrede elektrik olmadığı durumlarda, ayarlanmış saat bilgisini hafızasında tutmaya devam etmekle kalmayıp saatin arka planda çalışmasını harici bir pil ile koruyabilmektedir.

Aşağıda DS1307 entegresini ve bacak isimlerini görebileceğiniz görsel bulunmaktadır.

DS1307 Kullanım Amacı Nedir?

Belli başlı bir kullanım amacı bulunmuyor diyebiliriz. Yapılacak uygulamaya göre değişiklik gösterir. Mesela bir masa üstü çalar saat için kullanılabilir ya da zamana göre değişim gösteren sistemler için saat kaynağı olarak da kullanılabilir. Ancak esas kullanım amacı tasarlanan ve zaman bilgisine ihtiyaç duyulan uygulamalarda sapması en az olacak şekilde bir saat kaynağı olarak kullanılmasıdır. Bundan dolayı RTC olarak piyasada bir çok firmanın Gerçek Zaman Saati çözümleri bulunuyor tıpkı DS1302, DS1307 ya da DS3231 gibi. Aralarındaki en temel fark zaman içinde meydana gelen zaman sapmasıdır. Zaten zaman sapmasının en az meydana gelen yer internet bazlı olduğu düşünülürse bu tarz entegrelerle uğraşmak isteyenlerin bu zaman sapmalarını göze almaları gerektiği ortadadır. DS1307 konumuz olduğundan söylemek gerekir ki bu entegrenin zaman sapması ayda 1-2 dakika arasında değişmektedir. Buna etken olan şeyler ise sıcaklık değişimleri, PCB tasarımındaki hatalar ve kullanılan kristalin kalitesidir.

DS1307 Arduino Kütüphane Dosyası ve Fonksiyonları

Ekte kütüphane dosyasını bulabilirsiniz. Dosya zip formatında kurulabilir bir kütüphanedir. Arduino’da ” Taslak>library Ekle> ZIP. kitaplığı ekle ” yolıunu izleyip indirdiğiniz zip dosyasını seçerek kütüphaneyi kurabilirsiniz. Kütüphanenin kendine ait örnekleri bulunuyor ancak tüm özelliklerini yani fonksiyonlarını yeterince iyi ifade edemiyor zaten açıklamaların ingilizce olması bir çok arkadaşımız için sorun oluyor.

Fonksiyonlar ve Açıklamaları

Gelin şimdi sizlere bu fonksiyonların hepsini tanıtalım ve ne işe yaradıklarını ve nasıl kullanıldıklarını öğrenelim.

  •  void readClock();
    Bu fonksiyonun görevi DS1307 içerisinde saat bilgisini okuyup readHours(), readMinutes() ve readSeconds() fonksiyonları ile saat bilgilerini okumadan önce okumaya hazırlamaktır. Eğer readClock() fonksiyonu kullanılmadan readHours(), readMinutes() ve readSeconds() fonksiyonları ile saat bilgileri okunursa her zaman eski saat bilgisini okursunuz.
  • void setClock();
    Bu fonksiyon ayarlanan yeni saat bilgisini DS1307’ye kaydeder ve saati bu ayarlanan değerlerde çalıştırmaya başlamasını sağlar. setHours(), setMinutes(), setSeconds() fonksiyonları ile saat ayarlandıktan sonra mutlaka setClock() fonksiyonu kullanılmalıdır
  •     void stop();
    Bu fonksiyonun görevi saatin çalışmasını durdurmaktır. Saat durdurulunca okunan saat ve tarih bilgisi her zaman sabit kalır ve arka planda işlemesini engeller.
  •     void start();
    Bu fonksiyonun görevi saatin çalışmasını başlatmaktır. Devreye enerji verildiğinde DS1307 çalışmaz ancak arka planda çalışmasını sağlayan Vbat bacağına bağlı 3V pil bağlı ise saat çalışır ancak start() fonksiyonu kullanılmadan DS1307’den hiç bir şekilde saat ve tarih bilgisini okuyamazsınız.
  •     int getHours();
    Bu fonksiyon geri dönüş değeri int tipinde bir değişken olup mevcut saat bilgisini DS1307’den geri döndürür. Öncesinde readClock() fonksiyonu kullanılmalıdır.
  •     int getMinutes();
    Bu fonksiyon geri dönüş değeri int tipinde bir değişken olup mevcut saat bilgisini DS1307’den geri döndürür. Öncesinde readClock() fonksiyonu kullanılmalıdır.
  •     int getSeconds();
    Bu fonksiyon geri dönüş değeri int tipinde bir değişken olup mevcut saat bilgisini DS1307’den geri döndürür. Öncesinde readClock() fonksiyonu kullanılmalıdır.
  •     int getYear();
    Bu fonksiyon geri dönüş değeri int tipinde bir değişken olup mevcut yıl bilgisini DS1307’den geri döndürür. Öncesinde readClock() fonksiyonu kullanılmalıdır.
  •     int getMonth();
    Bu fonksiyon geri dönüş değeri int tipinde bir değişken olup mevcut olan yıldaki kaçıncı ayda olduğumuza ait bilgiyi DS1307’den geri döndürür. Öncesinde readClock() fonksiyonu kullanılmalıdır.
  •     int getDate();
    Bu fonksiyon geri dönüş değeri int tipinde bir değişken olup mevcut ayın kaçında olduğumuza ait bilgiyi DS1307’den geri döndürür. Öncesinde readClock() fonksiyonu kullanılmalıdır.
  •     int getDayOfWeek();
    Bu fonksiyon geri dönüş değeri int tipinde bir değişken olup mevcut haftanın kaçıncı gününde olduğumuza ait bilgiyi DS1307’den geri döndürür. Öncesinde readClock() fonksiyonu kullanılmalıdır.
  •     void setSeconds(int);
    Bu fonksiyonun görevi saatin saniyesini ayarlamaktır. Parametresine saniyeye ait int tipinde bir sayı (0-59arasında olmalıdır, 60 ve üstü kabul edilmiyor) yazarsanız bunu mevcut saniye olarak DS1307 üzerinde ayarlar. Bu fonksiyondan sonra setClock() fonksiyonu mutlaka kullanılmalıdır.
  •     void setMinutes(int);
    Bu fonksiyonun görevi saatin dakikasını ayarlamaktır. Parametresine dakikaya ait int tipinde bir sayı (0-59arasında olmalıdır, 60 ve üstü kabul edilmiyor) yazarsanız bunu mevcut dakika olarak DS1307 üzerinde ayarlar. Bu fonksiyondan sonra setClock() fonksiyonu mutlaka kullanılmalıdır.
  •     void setHours(int);
    Bu fonksiyonun görevi saatin saati ayarlamaktır. Parametresine saate ait int tipinde bir sayı ı(0-23arasında olmalıdır, 24 ve üstü kabul edilmiyor) yazarsanız bunu mevcut saat olarak DS1307 üzerinde ayarlar. Bu fonksiyondan sonra setClock() fonksiyonu mutlaka kullanılmalıdır.
  •     void setDayOfWeek(int);
    Bu fonksiyonun görevi haftanın gününü ayarlamaktır. Parametresine haftanın gününe ait int tipinde bir sayı yazarsanız bunu mevcut haftanın günü olarak DS1307 üzerinde ayarlar. Bu fonksiyondan sonra setClock() fonksiyonu mutlaka kullanılmalıdır. Haftanın günü her gün gece 00:00 olduğu an bir sonraki güne geçmektedir. Parametreye ait sayılar ve günlere ait ilişki şöyledir;1: Pazar2: Pazartesi3: Salı4: Çarşamba5: Perşembe6: Cuma7: Cumartesi 
  •     void setDate(int);
    Bu fonksiyonun görevi ayın gününü ayarlamaktır. Parametresine ayın gününe ait int tipinde bir sayı (1-31, 32 ve üstü ve 0 sayısı kabul edilmiyor) yazarsanız bunu mevcut ayın günü olarak DS1307 üzerinde ayarlar. Bu fonksiyondan sonra setClock() fonksiyonu mutlaka kullanılmalıdır.
  •     void setMonth(int);
    Bu fonksiyonun görevi hangi ayda olduğumuzu ayarlamaktır. Parametresine aya ait int tipinde bir sayı (1-12, 12 ve üstü ve 0 sayısı kabul edilmiyor) yazarsanız bunu mevcut ay olarak DS1307 üzerinde ayarlar. Bu fonksiyondan sonra setClock() fonksiyonu mutlaka kullanılmalıdır.
  •     void setYear(int);
    Bu fonksiyonun görevi yılı ayarlamaktır. Parametresine yıla ait int tipinde bir sayı (0-99, 100 ve üstü kabul edilmiyor) yazarsanız bunu mevcut yıl olarak DS1307 üzerinde ayarlar. Yıl olarak yılın son iki hanesi kullanılıyor 2016 derken 16 olarak kullanılır. Bu fonksiyondan sonra setClock() fonksiyonu mutlaka kullanılmalıdır. 

Bu fonksiyonların hepsinin başında ” RTC. ” ile kullanılması gerekmektedir.

Örnek; 

  • RTC.start();
  • RTC.setMonth(11);
  • RTC.setClock();
  • RTC.readClock();
  • int yil=RTC.getYear();

Görüldüğü gibi hepsinin başında ” RTC. ” bulunmaktadır.

DS1307 ve Arduino Kullanarak 2×16 LCD Ekranlı Ayarlanabilir Saat ve Tarih Uygulaması

Aşağıdaki devre şemasında görüldüğü gibi bir adet 2×16 LCD, 4 adet buton ve bu butonlar birer 10k direnç ile pull-down edilmiştir, DS1307 I2C için 2k2 pull-up dirençleri ve 32.768kHz kristal bulunmaktadır. Proteus’da LCD ekran kontrastı değiştirilemese bile gerçekte devreyi kuracak arkadaşlar için kontrast potansiyometresi koydum 10k her hangi bir potansiyometre kullanılabilir.
LCD kullanmak için LiquidCrystal kütüphanesini kullandım.
DS1307 için internette bulup denediğim ve çalışan iyi bir kütüphane kullandım, bunun kütüphanesini ekte bulabilirsiniz.
Proteus8 simülasyon dosyasını da ekte bulabilirsiniz.

Devreye ait Arduino kodu aşağıdaki gibidir. Kodların açıklamalarını her zamanki gibi yapmıyorum. yukarıdaki bilgiler ile kodu kendiniz anlayabilmenizi sağlamak istiyorum böylece kodlama konusunda kendinizi de geliştirmiş olursunuz. 🙂

Böylece bir konun daha sonuna gelmiş bulunmaktayım. Ekte Proteus 8 simülasyon doyası ve DS1307 için kütüphane dosyaları bulunmaktadır.
Düşüncelerinizi, anlayamadığınız her hangi bir şeyi yorum atarsanız sevinirim

EK-1: DS1307 Arduino Kütüphanesi

https://drive.google.com/open?id=1vsqvZSvPD0nEGdjGB4p-kLcIoknYE2Na

EK-2: Proteus 8 Simülasyonu

https://drive.google.com/open?id=127jEL-MeE8bgHgRTDV2W0f3SHjYjrvSi

Sitemizdeki diğer makaleleri okumak için -> Makaleler