Gelin entegremizi biraz yakından tanıyalım. Aslında birer mikrokontrolcü gibi içlerinde işlem birimi,ram,registerler ve veri yolu arabirimi vardır. “Saat” gibi çalışması için 32.768khz hızında bir kristal osilatör kullanılır. Bu frekans saatin doğru çalışması için çok önemlidir. DS1307 gibi RTCler I2C seri veriyolu ile mikroişlemciler veya mikrokontrolcülerle iletişime geçer. Bir sıra halinde verileri gönderir. O sıraya göre hangi ay hangi yıl hangi gün hangi saat mikrokontrolcüler tarafından yorumlanıp kullanılmak üzere kaydedilir. İlk değer kaydedileceği zaman da mikrokontrolcü tarafından veriler RTC’nin içerisine yazılır. İlk değeri doğru bir şekilde verdiğiniz zaman yüksek hassasiyetle uzun süre (hatta yıllarca) RTC’nizi çalıştırabilirsiniz çünkü çok düşük güç tüketir. Bazı RTC entegrelerinde Alarm ve karedalga çıkışı da bulunur. Böylece ayrıca sesli alarm devresi kurmanıza gerek kalmaz.
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.
DS1307, I2C protokolüne göre çalışan gerçek zaman üretmek için kullanılan ve seri bilgi alışverişi yapan bir entegredir. Çalışma gerilimi 5 V?tur. Çalışması için bğlanması gereken iki önemli bileşeni vardır bunlardan biri 3.2 voltluk pil (bios pili olarakta bilinir) ve 32.768 Khz kristaldir. Enerji kesildiğinde enerjisini bu pilden karşılar. Bu pilin takılması kesinlikle zorunludur yoksa entegremiz düzgün çalışamaz.
DS1307 Arduino Kütüphane Dosyası ve Fonksiyonları:
Ekstradan ek bir kütüphaneye ihtiyaç duymadan, Arduino’nun programın kendi içindeki kütüphaneyi kullanarak hazırlanmış bir proje hazırladım arkadaşlar bu işimizi biraz daha kolaylaştırdı.
Şimdi sizlere bu fonksiyonları tanıtalım, 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.setMonth(11);
- RTC.setClock();
- RTC.readClock();
- RTC.start();
- int yil=RTC.getYear();
DS1307 ve Arduino Kullanarak 2×16 LCD Ekranlı Saat ve Tarih Uygulaması
Gerekli Mazlemeler:
- 1 ADET ARDUİNO UNO
- 1 ADET RTC DS-1307 MODÜLÜ
- 1 ADET 2×16 LCD EKRAN
- YETERİ KADAR JUMPER KABLO
Devre Şeması:

Gerekli Kodlar:
#include "Wire.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define DS1307_adresi 0x68
byte SIFIR = 0x00;
byte san_ayar=00, dak_ayar=13, saat_ayar=11, hgun_ayar=1;//0-59 0-59 0-23 1-7
byte gun_ayar=04, ay_ayar=12, yil_ayar=17; //1-31 1-12 0-99
int san,dak,saat,hgun,gun,ay,yil;
void setup()
{
Wire.begin();
Serial.begin(9600);
// tarih_saat_kaydet(); //başlangıç değerlerini DDS1307'ye yaz
lcd.begin(16, 2);
lcd.print("DS1307 Saat:");
}
void loop()
{
ds1307();
lcd.setCursor(5, 1); lcd.print(":");if (san<10) {lcd.print("0");} lcd.print(san);
lcd.setCursor(2, 1); lcd.print(":");if (dak<10) {lcd.print("0");} lcd.print(dak);
lcd.setCursor(0, 1); if (saat<10) {lcd.print("0");} lcd.print(saat);
}
void tarih_saat_kaydet()
{
Wire.beginTransmission(DS1307_adresi);
Wire.write(SIFIR);
Wire.write(decToBcd(san_ayar));
Wire.write(decToBcd(dak_ayar));
Wire.write(decToBcd(saat_ayar));
Wire.write(decToBcd(hgun_ayar));
Wire.write(decToBcd(gun_ayar));
Wire.write(decToBcd(ay_ayar));
Wire.write(decToBcd(yil_ayar));
Wire.write(SIFIR); //Saati başlat
Wire.endTransmission();
}
void ds1307()
{
// önce DS1307 adres registerini sıfırlayalım
Wire.beginTransmission(DS1307_adresi);
Wire.write(SIFIR);
Wire.endTransmission();
//Şimdi 0.adresten itibaren 7 adet veriyi DS1307'den isteyelim.
Wire.requestFrom(DS1307_adresi, 7);
san = bcdToDec(Wire.read());
dak = bcdToDec(Wire.read());
saat = bcdToDec(Wire.read() & 0b111111); //24 saat time
hgun = bcdToDec(Wire.read());
gun = bcdToDec(Wire.read());
ay = bcdToDec(Wire.read());
yil = bcdToDec(Wire.read());
}
byte decToBcd(byte val) // Sayma sayıyı BCD'ye çevir
{
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) // BCD'yi Sayma sayıya çevir
{
return ( (val/16*10) + (val%16) );
}





Son yorumlar