Bu yazıda yaygın RTC modüllerinden biri olan DS1302‘nin Arduino ile nasıl kullanılacağını öğrenecek ve I2C OLED ekran ile birleştirerek masa saati uygulaması yapacağız.
DS1302 ve I2C OLED ekranın tek başlarına nasıl kullanıldıklarını daha önce uzun uzun anlatmıştık. Bu bölümde bu iki kodu birleştirirken yeni bir kütüphane keşfedeceğiz.
RTC bir kısaltma, Real Time Clock demek. Yani Gerçek Zamanlı Saat. Peki böyle bir modüle neden ihtiyacımız var? Bunun iki sebebi var; İlki Arduino’nun bir kez ayarlanan saati sayabilmesi için sürekli güç almasının gerekmesi. Elektrikler kesilirse her şey gider, değil mi?
İkincisi ise Arduino mikrokontrolcüsünün saati doğru bir şekilde saymak için yeterince hassas olmaması. Evet, o kadar kabiliyetli bir mikrokontrolcü bile zamanı sayarken ciddi kaymalar yaşatabilir.
Bu sorun RTC adı verilen ve üzerlerinde CR2032 kodlu, halk arasında para pil olarak da bilinen bir pil bulunan modüllerle çözülüyor. Bilgisayarımızın anakartında da böyle bir pil görmüş olmalıyız. İşte o pil bilgisayarımız kapalıyken saati ve BIOS gibi temel ayarları hafızada tutuyor.
RTC modülü üzerindeki piliyle birlikte sürekli açık kalıyor ve Arduino’nun gücü kesilse bile saati içinden saymaya devam ediyor!
DS1302’yi Arduino’ya 5 adet pini üzerinden bağlıyoruz. VCC pini Arduino üzerinde 5V’a ve GND tahmin edebileceğimiz gibi GND’ye bağlanıyor. CLK, DAT ve RST pinleri ise Arduino’nun dijital pinlerine bağlanıyor.
Bu tür modüller genelde pille birlikte gelmezler. Bu yüzden modülden sipariş verirken yanında bir de CR2032 kodlu pillerden sipariş etmeyi unutmamalıyız. Pili modüle takalım ve sketch koduna geçelim.
DS1302 RTC modülünü kolay bir şekilde kullanabilmek için bir kütüphane kullanmak akıllıca. Bunun için Michael Miller’in Rtc by Makuna kütüphanesini kullanıyoruz. Kütüphaneyi Arduino IDE’nin ana menüsünden Araçlar > Kütüphaneleri Yönet… bölümüne girip Rtc by Makuna kelimesini aratarak ekleyebiliriz.
Bu sketch’te ek olarak SSD1306 adlı yaygın kullanılan Arduino kütüphanesini kullanacağız. Kütüphaneyi Arduino IDE’nin ana menüsünden Araçlar > Kütüphaneleri Yönet… bölümüne girip SSD1306 kelimesini aratarak Adafruit tarafından hazırlanmış versiyonu kurarak ekleyebiliriz. Kütüphane kurulumu esnasında Adafruit GFX gibi bazı ek kütüphanelerin de kurulumu istenebilir. Hepsini kuralım.
Bu örnekte DS1302’nin CLK pinini 4, DAT pinini 5. ve RST pinini 6. Arduino pinlerine bağladım. I2C OLED ekranı da VCC pini 5V, GND pini GND, SDA pini A4 ve SCL pini de A5 pinlerine bağlanacak şekilde bağladım. Farklı bir bağlantı yapmak isterseniz DS1302’nin 3 veri pinini kod içinden değiştirebilirsiniz.
Sketch kodunu kopyalamak için pencerenin sağ üst köşesindeki butona tıklayabilirsiniz.
NOT: Arduino’ya tekrar güç verdikten sonra siyah ekran alıyorsanız RESET butonuna basmayı deneyin.
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
/* DS1302 RTC Modülü 128x64 I2C OLED Ekran ile Nasıl Kullanılır? DS1302 RTC Modülünün detaylı açıklaması ve örnek projelerini web sitemizde bulabilirsiniz. Mete Hoca https://www.metehoca.com/ */ #include <ThreeWire.h> // RTC kütüphanesi içinde mevcut #include <RtcDS1302.h> // Kütüphanemizi ekliyoruz // Michael Miller'in "Rtc by Makuna" kütüphanesi #include <Wire.h> // I2C bağlantısı için gerekli #include <Adafruit_GFX.h> // Adafruit'in metin, şekil vs kütüphanesi #include <Adafruit_SSD1306.h> // Adafruit'in OLED ekran kütüphanesi int CLK = 4; // DS1302'nin CLK pini int DAT = 5; // DS1302'nin DAT pini int RST = 6; // DS1302'nin RST pini const static char* Hafta[] = // Haftanın günlerini kenara yazalım, lazım olacak { " Pazar ", "Pazartesi ", " Sali ", " Carsamba ", " Persembe ", " Cuma ", "Cumartesi " }; ThreeWire myWire(DAT,CLK,RST); // RTC kütüphanemizi ayarlıyoruz RtcDS1302<ThreeWire> Rtc(myWire); Adafruit_SSD1306 display(128, 64, &Wire, -1); // OLED kütüphanemizi ayarlıyoruz void setup() { Rtc.Begin(); RtcDateTime derleme_saati = RtcDateTime(__DATE__, __TIME__); // Arduino IDE'den derleme zamanını al if (!Rtc.IsDateTimeValid()) Rtc.SetDateTime(derleme_saati); // Kayıtlı zaman geçersiz ise yeniden ayarla if (Rtc.GetIsWriteProtected()) Rtc.SetIsWriteProtected(false); // Varsa RTC yazma korumasını kaldır if (!Rtc.GetIsRunning()) Rtc.SetIsRunning(true); // RTC çalışmıyorsa çalışır hale getir RtcDateTime now = Rtc.GetDateTime(); // Anlık zamanı al if (now < derleme_saati) Rtc.SetDateTime(derleme_saati); // Anlık zaman daha eskiyse güncelle if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) for(;;); display.display(); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); } void loop() { RtcDateTime now = Rtc.GetDateTime(); // Güncel zamanı bu satırda okuyoruz display.clearDisplay(); display.setCursor(18, 0); // İmleci istediğimiz konuma getiriyoruz (x,y) if (now.Hour() < 10) display.print("0"); // Gerekiyorsa saatin başına sıfır ekliyoruz display.print(now.Hour()); // Saati gösteriyoruz 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()); display.setCursor(6, 25); if (now.Day() < 10) display.print("0"); display.print(now.Day()); display.print("."); if (now.Month() < 10) display.print("0"); display.print(now.Month()); display.print("."); display.print(now.Year()); display.setCursor(12, 50); display.print(Hafta[now.DayOfWeek()]); display.display(); delay(100); // Biraz bekleyelim } |
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!
ÖZGÜN ve KULLANIŞLI projeler yapabilmek için ARDUINO’yu doğru öğrenmek gerekir. Arduino’ya güçlü başlamanın en iyi yolu ARDUINO’YA GÜÇLÜ BAŞLANGIÇ EĞİTİM VE PROJE SETİ‘dir. Arduino Uno üzerine kurulu olan set ile bu müthiş geliştirme platformunu tüm detaylarıyla anlayacak, başka hiçbir yerde bulamayacağınız inceliklerini öğrenecek ve en sık kullanılan Arduino sensör ve modüllerine aşina olacaksınız.