Bu yazıda DS1307 RTC modülünün özelliklerini inceleyecek ve Arduino ile nasıl kullanabileceğimizi öğreneceğiz.
Önceki yazımız olan DS1302‘de bir RTC modülüne neden ihtiyacımız olduğunu açıklamıştık. Kısaca açıklamak gerekirse RTC, cihaz kapalıyken bile saat ve tarihi hafızada tutabilen ve kendine ait bir pille çalışan modüllere verilen isim.
RTC modülleri hem ana sistem üzerindeki işlem yükünü azaltır, hem de zamanı çok daha hassas bir doğrulukla tutar. Üstelik bunu çok düşük güç tüketimi ile ana sistemin gücü kesildiğinde dahi çalışmaya devam edebilecek şekilde yapar.
DS1307 modülü en uygun fiyatlı ve yaygın RTC modüllerinden biridir. Sahip olduğu I2C bağlantı arayüzü ile Arduino’ya kolaylıkla bağlanabilir. Üstelik üzerindeki BAT pini üzerinden modül üzerindeki pilin gerilimi de ölçülebilir, böylece pil azalmaya başladığında düşük pil uyarısı verilebilir.
DS1307’yi Arduino’ya sadece 4 adet pin üzerinden bağlıyoruz. VCC pini Arduino üzerinde 5V’a ve GND de GND pinine bağlanıyor. SDA ve SCL pinleri ise Arduino’nun ilgili pinlerine veya sırasıyla A4 (SDA) ve A5 (SCL) pinlerine bağlanıyor.
Devre kurulumunu inceleyelim;
DS1307 RTC modülünü yine bir kütüphane ile kullanıyoruz. Bunun için Adafruit‘in RTClib kütüphanesini kullanıyoruz. Bu kütüphane Arduino’nun kendi kütüphane kataloğunda yer alıyor ve Araçlar > Kütüphaneleri Yönet… menüsünden adıyla aratılıp kurulabilir.
Aşağıdaki sketch DS1307 RTC modülünden saati okuyor ve Seri Port Ekranı’nda görüntülüyor.
RTC modülüne pili takıp ilk kez kullanırken bir defalığına güncel zamanı yüklememiz gerekiyor. Bunu yapmanın iki yolu var. İlki aşağıdaki kod ile Arduino IDE üzerinden otomatik olarak aktarmak:
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
İkinci yöntem ise aşağıdaki kod ile istediğimiz zamanı elle girmek:
rtc.adjust(DateTime(YIL, AY, GÜN, SAAT, DAKİKA, SANİYE));
Projelerimizde saati sadece bir kez yüklemeliyiz. Geri kalan işi RTC modülümüz kendi başına halledecektir. Bu yüzden kodu yukarıdaki satırlarla sadece bir kez çalıştırmalı, ardından bu kodu başına // koyup yorum haline getirerek tekrar yüklemeliyiz.
Bunu yapmazsak sketch her açılışta ilk girdiğimiz saati yükler ve doğal olarak saatimiz yanlış ayarlanmış olur.
Arduino’da iyi olmak için öncelikle elektronikte iyi olmak gerekir. Türkiye’nin en iyi temel elektronik eğitim seti ARDUINO ÖNCESİ TEMEL ELEKTRONİK EĞİTİM VE DENEY SETİ‘ni keşfedin. Gereksiz bilgilerden arındırılmış basit ve eğlenceli anlatımla ELEKTRONİK öğrenin ve Arduino’ya METE HOCA farkıyla güçlü başlayın!
Sketch kodunu kopyalamak için pencerenin sağ üst köşesindeki butona tıklayabilir veya buraya tıklayarak ZIP dosyası olarak indirebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/* DS1307 RTC Modülü Arduino ile Nasıl Kullanılır? DS1307 RTC Modülünün detaylı açıklaması ve örnek projelerini web sitemizde bulabilirsiniz. Mete Hoca https://www.metehoca.com/ */ #include "RTClib.h" // Kütüphanemizi ekliyoruz // Adafruit'in RTClib kütüphanesi RTC_DS1307 rtc; // Kütüphanemiz başlatılıyor char HaftaninGunleri[7][12] = {"Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"}; void setup() { Serial.begin(9600); // Seri Port Ekranı'nı başlatıyoruz if (!rtc.begin()) { // Modüle bağlantı kontrol ediliyor Serial.println("RTC Bulunamadı!"); while(1); } if (!rtc.isrunning()) { // RTC'nin ayarlı olup olmadığı kontrol ediliyor Serial.println("RTC çalışmıyor!"); // Alttaki satır Arduino IDE'den gelen saat ve tarihi alarak RTC'yi ayarlar // Bu halde bir defalığına Arduino'ya yükledikten sonra satırı başına // // koyarak yorum yapıp tekrar yüklemeliyiz. // Aksi halde her açılışta tekrar saat yüklemeye çalışır. rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } } void loop() { DateTime now = rtc.now(); // Güncel saati bu satırda okuyoruz if (now.day() < 10) {Serial.print("0");} // 3. ayı 03 olarak gösterelim Serial.print(now.day(), DEC); // Günü yazalım Serial.print("."); if (now.month() < 10) {Serial.print("0");} Serial.print(now.month(), DEC); // Ayı yazalım Serial.print("."); Serial.print(now.year(), DEC); // Yılı yazalım Serial.print(" "); Serial.print(HaftaninGunleri[now.dayOfTheWeek()]); // Günün adı Serial.print(" | "); if (now.hour() < 10) {Serial.print("0");} Serial.print(now.hour(), DEC); // Saati yazalım Serial.print(":"); if (now.minute() < 10) {Serial.print("0");} Serial.print(now.minute(), DEC); // Dakikayı yazalım Serial.print(":"); if (now.second() < 10) {Serial.print("0");} Serial.println(now.second(), DEC); // Saniyeyi yazalım delay(1000); // Biraz bekleyelim } |