DS1307 RTC Gerçek Zaman Saati Kullanımı ve OLED Ekran Saat
Bu içeriğimizde, DS1307 RTC modülünü arayüzlemeyi ve kullanmayı öğreneceğiz. Öncelikle şu soruları inceleyeceğiz; RTC (Gerçek zamanlı saat) nedir? Neden gerçek zamanlı saat kullanılır? Bir RTC modülü, bir I2C iletişim veriyolunda Arduino ile nasıl iletişim kurar? Arduino ve DS1307 RTC modülünü kullanarak dijital saat nasıl yapılır? Devamında, pin diyagramı, pin konfigürasyon detayları, Arduino ile arayüzleme devresi ve sonunda örnek koda bakacağız.
Hatırlatma
Bu makaleye geçmeden önce, Arduino programlama ve Arduino IDE’nin nasıl kullanılacağı hakkında temel bir bilgiye sahip olmalısınız. Arduino ile LCD’yi nasıl arayüzleyeceğinizi ve Arduino’nun giriş/çıkış portlarını nasıl kullanacağınızı bilmelisiniz. Bunları nasıl yapacağınızı bilmiyorsanız, bu makaleleri daha iyi anlamak için aşağıdaki makaleleri incelemenizi öneririz:
- Arduino Kütüphane Kurulumu
- Arduino Buton Kullanımı
- Arduino Led Yakma
- Arduino If Else Döngüsü
- Arduino I2C OLED Ekran Kullanımı
Gerçek Zaman Saati (RTC) Nedir?
Adından da anlaşılacağı gibi, zamanın kaydını tutmak ve zamanı görüntülemek için gerçek zamanlı bir saat kullanılır. Bilgisayarlar, dijital akıllı saatler, veri kaydediciler gibi birçok dijital elektronik cihazda ve zamanı takip etmeniz gereken durumlarda kullanılır. Gerçek zamanlı saatin en büyük avantajlarından biri, güç kaynağı mevcut olmasa bile zamanın kaydını tutmasıdır.
Şimdi soru şu ki, bir elektronik cihaz, bir güç kaynağı kullanmadan gerçek zamanlı saat gibi nasıl çalışabilir. Çünkü neredeyse tüm RTC modülleri, yıllarca çalışabilen küçük madeni para boyutunda 20mm 3V lityum pil hücreleri ile birlikte gelir. Genellikle CR2032 bobin hücreleri kullanılır.
DS1307 RTC Entegresi
DS1307 RTC modülünün merkezinde 8 pinli bir DS1307 entegresi bulunur. Saniyeleri, dakikaları, saatleri, günleri, ayları ve yılları takip etmek için kullanılan gerçek zamanlı bir saat sağlar. Bizim durumumuzda Arduino kullandığımız gibi diğer cihazlarla iletişim kurmak için I2C iletişim protokolünü kullanır. Arduino, I2C iletişim protokolünü kullanarak DS1307’den saat ve tarih değerlerini okur. Ayrıca, yedek pil yardımı ile elektrik kesintisi durumunda tam zamanı kaydetme özelliğine de sahiptir.
DS1307 Pin Diyagramı
- X1 ve X2: kristal osilatörler için kullanılır. Genellikle DS1307 ile kullanılan kristal osilatör değeri 32.768k Hz’dir.
- VBAT: CR2032 pili yedek güç olarak bağlama yeri. Değeri 3-5 volt arasında olmalıdır. 5 volttan fazla voltaj DS1307’yi kalıcı olarak bozabilir. Elektrik kesintisi durumunda zamanı takip etmek için yedek pil kullanılır.
- Vcc ve GND: güç kaynağı pinleridir
- SDA ve SCL: I2C haberleşme bağlantı pinleridir, diğer cihazlarla haberleşmek için kullanılır.
- SQW:, 1Hz, 4kHz, 8kHz veya 32kHz gibi farklı frekanslarda kare dalgalar sağlar. Çıkış dalgasının frekansı, I2C veri yolu üzerinden DS1307’ye bir sinyal gönderilerek seçilebilir.
Bu entegreyi doğrudan Arduino ile kullanmak istiyorsanız, DS1307 ile bağlantı kurmak için harici bileşenler kullanmanız gerekir. Aşağıdaki devre şeması, DS1306 ile gerekli tüm bileşenlerin bağlantılarını gösterir:
Ancak DS1307 entegresini tek başına kullanmak ve kendi PCB tasarımınızı yapmak yerine çok düşük maliyetle kullanıma hazır bir DS1307 RTC modülü alabilirsiniz.
DS1307 RTC Modülü
DS1307 RTC modülü, bir DS3107 entegresinin doğru işlevselliği için gerekli olan tüm yerleşik bileşenlere sahiptir. Bunun da ötesinde, 20 mm 3V lityum pili bağlamak için bir yuva içerir. Bu yuva herhangi bir CR2032 pil içerebilir. Şimdi bu modülün bileşenlerini tek tek göz atalım:
DS1307 RTC modülünün merkezinde daha önce bahsettiğimiz bir entegre var. Bu entegre saniyeleri, dakikaları, saatleri, günleri ve ayları takip eder. Her ayın sonunda bu çip saniye:dakika:saat ve tarihi otomatik olarak ayarlar. Saat gösterimini 24 saatlik formatta ya da12 saatlik olarak yapılandırmak da mümkündür.
32kHz Kristal Osilatör
DS1307 entegresinin çalışması için (zaman tutma) 32kHz harici bir kristal osilatör gerektirir. Bu nedenle, RTC modülü 32kHz harici kristal osilatör ile birlikte gelir.
Ancak bu 32kHz kristal osilatörle ilgili bir sorun var ki, ortam sıcaklığındaki bir değişiklik kristal osilatörün salınım frekansını etkiler. 32KHz harici kristal salınım frekansındaki bu değişiklik ihmal edilebilir düzeydedir. Ama uzun vadede bir hataya sebep olabilir. Ayda yaklaşık 2-3 dakikalık bir saat kaymasına sahiptir.
Bu sıcaklıktan kaynaklanan sapmayı engellemek için gelişitirilmiş başka DS1307 modülleri mevcuttur, örneğin:
Bu modülde harici olarak DS18B20 sıcaklık sensörü bulunmaktadır, bu sayede sıcaklıktan kaynaklanan sapmalar en aza indirilebilir.
24C32 EEPROM’u
DS1307 RTC modülü ayrıca yerleşik 24C32 EEPROM içerir. Bu EEPROM 32 bayt veri depolayabilir ve sınırlı okuma-yazma işlemlerine sahiptir. Alarm tabanlı projeler için RTC modülü kullanmak istediğinizde bu hafızayı zaman almak için kullanabilirsiniz. Örneğin, her gün sabah 8:00’de bir alarm kurmak isterseniz, bu zaman değerini EEPROM’a kaydedebilir ve zaman bu kaydedilen değerle eşleştiğinde alarm başlatabilirsiniz.
Bu EEPROM entegresi ayrıca I2C veri yolu üzerinden mikrodenetleyiciler veya Arduino ile iletişim kurabilir. Bu nedenle, DS1307 ile aynı I2C veri yolunu paylaşır. EEPROM’a (o 0x50 Hex) ve DS1307 entegresine, aynı I2C veriyolu üzerinden iletişim kurmak için farklı bağımlı adresler atanır.
Yedek Pil
Bu RTC modülünün arka tarafında, CR2032 pilini bağlamak için bir tutucu bulunur. Bu yedek pil, DS1307’ye bağlanan ana güç kaynağı arızalandığında bile zamanı doğru takip etmek için kullanılır. Bu entegre, ana gücü algılayan ve ana güç kapatıldığında, yedek pile geçiş yapan bir güç algılama devresi içerir.
Yedek pil kullanımdayken, DS1307 yalnızca 300nA akım tüketir. Bu pilin 17 yıldan fazla çalışabileceği anlamına gelir. Çünkü, genel olarak, CR2032 pilin kapasitesi 47mAh’dir ve modül yalnızca 300nA tüketir.
Çalışma süresi = 47mAh/300nA = 156666 saat = 6527 gün = 17+ yıl
DS18B20 Sıcaklık Sensörü
Bazı modüllerde DS18B20 dijital termometre bağlamak için boş bir yuva bulunmaktadır. Sağ alt köşedeki üç boş pin çıkışı DS18B20 sensörü için ayrılmıştır ve sensörün çıkışı RTC modülünün DS pininden alınabilir.
DS1307 RTC Modülü Pin Diyagramı
Aşağıdaki şekil pin diyagramını göstermektedir. Bu modül, ikisi güç kaynağı pini ve ikisi I2C iletişim veriyolu için SCL ve SDA pinleri için olmak üzere toplam 7 pine sahiptir. Tüm bu pinlerin işlevselliğini daha önceki bölümlerde görmüştük.
DS1307 Arduino Örneği
Öncelikle DS1307 RTC modülü ve Arduino ile bu bağlantı şemasına göre bağlantıları yapın:
DS1307 Kütüphanesi Kurulumu
DS1307 RTC modülünü kullanmak için Arduino’nun I2C iletişim pinlerini kullanıyoruz. I2C iletişiminden anlamıyorsanız, bu içeriğimizi okuyabilirsiniz.
RTC modülünden zaman ölçümleri almak için kullanılan bir Arduino RTClib kütüphanesi mevcuttur. Bu kütüphane, I2C iletişimi üzerinden bir RTC modülü ile etkileşim kurmanın tüm karmaşıklığını gizler. DS1307’den veri okumak için RTClib tarafından uygulanan basit fonksiyonları kullanabilirsiniz.
Bu nedenle Arduino ile bir DS1307 RTC modülünü kullanmak için Arduino IDE’de bulunan RTClib kütüphanesini kullanmamız gerekiyor.
Bu kütüphaneyi indirmek için öncelikle Arduino’nun kütüphane yöneticisine giderek bu kütüphaneyi Arduino IDE’ye kurmamız gerekiyor. Arduino IDE’yi açın, Araçlar > Kütüphaneleri Yönet’e gidin.
Bundan sonra, bu pencere kütüphane yöneticisi penceresi görünecektir. Arama çubuğuna “RTClib” yazarak arayın. DS1307 için birçok seçenek göreceksiniz. Ancak bu içerikte kullanacağımız Adafruit’ten RTClib’dir. Adafruit tarafından RTClib’i seçin ve yükle düğmesine tıklayın.
Yükle düğmesine tıkladığınızda, RTClib’in Arduino IDE’nizde şu anda yüklü olmayan diğer kitaplık bağımlılıklarını gerektirebileceğine dair bir mesaj alabilirsiniz. Yükle düğmesine tıklayarak tüm bağımlılıkları yüklemenizi öneririz. Aksi takdirde, RTClib düzgün çalışmayacaktır.
Program Kodu
#include "RTClib.h" RTC_DS1307 DS1307_RTC; char Week_days[7][12] = {"Pazar", "Pazartesi", "Sali", "Carsamba", "Persembe", "Cuma", "Cumartesi"}; void setup () { Serial.begin(57600); #ifndef ESP8266 while (!Serial); #endif if (! DS1307_RTC.begin()) { Serial.println("RTC bulunamadı"); Serial.flush(); abort(); } if (DS1307_RTC.lostPower()) { Serial.println("RTC güç kaybetti, zamanı ayari..."); // Yeni bir cihazda saat ayarlanması gerektiğinde veya güç kaybından sonra, // aşağıdaki satır, RTC'yi bu kodun derlendiği tarih ve saate ayarlar DS1307_RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // Bu satır, RTC'yi açık bir tarih ve saatle ayarlar, örneğin // 28 Şubat 2022, saat 3'e ayarlamak isterseniz: // DS1307_RTC.adjust(DateTime(2022, 2, 28, 3, 0, 0)); } // Önceden yapılandırılmış bir cihazda zamanın yeniden ayarlanması gerektiğinde, // aşağıdaki satır, RTC'yi bu çizimin derlendiği tarih ve saate ayarlar // DS1307_RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // Bu satır, RTC'yi açık bir tarih ve saatle ayarlar, örneğin // 1 Mart 2022, saat 3'e ayarlamak isterseniz: // DS1307_RTC.adjust(DateTime(2022, 3, 1, 3, 0, 0)); } void loop () { DateTime now = DS1307_RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(Week_days[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.print(" gece yarisindan beri 1/1/1970 = "); Serial.print(now.unixtime()); Serial.print("s = "); Serial.print(now.unixtime() / 86400L); Serial.println("g"); // 7 gün, 12 saat, 30 dakika, 6 saniye ilerisi olan bir tarih hesaplama DateTime future (now + TimeSpan(7,12,30,6)); Serial.print(" suan + 7d + 12h + 30m + 6s: "); Serial.print(future.year(), DEC); Serial.print('/'); Serial.print(future.month(), DEC); Serial.print('/'); Serial.print(future.day(), DEC); Serial.print(' '); Serial.print(future.hour(), DEC); Serial.print(':'); Serial.print(future.minute(), DEC); Serial.print(':'); Serial.print(future.second(), DEC); Serial.println(); Serial.print("Sicaklik: "); Serial.print(DS1307_RTC.getTemperature()); Serial.println(" C"); Serial.println(); delay(3000); }
OLED Ekran Saat Uygulaması
OLED ekranda saat ve verileri görüntülemek istiyorsanız bu şemaya göre bağlantıları yapın. SSD1306 OLED’i aynı I2C veriyoluna bağlayın.
Başlamadan önce, Araçlar > Kitaplık Yöneticisi‘ne giderek Arduino IDE’ye Adafruit SSD1306 OLED kitaplığını kurduğunuzdan emin olun.
Program Kodu
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "RTClib.h" #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, 4); RTC_DS1307 RTC; void setup() { Serial.begin(115200); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { Serial.println(F("SSD1306 baglanamadi")); for(;;); } delay(1000); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 11); display.println("Dijital Saat"); display.display(); delay(1000); display.clearDisplay(); } void loop() { display.setTextSize(1); DateTime now = RTC.now(); display.setCursor(40,30); display.setTextSize(1); display.print(now.day()); display.print('/'); display.print(now.month()); display.print('/'); display.print(now.year()); display.print(' '); display.setCursor(40, 40); if (now.hour()<10) display.print('0'); display.print(now.hour()); display.print(':'); if (now.minute()<10) display.print('0'); display.print(now.minute()); display.print(':'); if (now.second()<10) display.print('0'); display.print(now.second()); delay(1000); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(10, 4); display.println("Dijital Saat"); display.display(); delay(1000); }
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.