Arduino projelerimizde zaman zaman gerçek zaman saatine ihtiyaç duyarız. Saate göre açılıp kapanan röleler, tarih veya saate göre veri kaydetme gibi konularda enerji kayıplarından (elektrik kesilmesi vs.) etkilenmeyen bir saate ihtiyaç duyuyorsanız DS1307ile bu temel devreyi kurarak ihtiyacınızı karşılayabilirsiniz.
Gerekli Malzemeler:
- 1 adet 32.768 KHz kristal
- 1 adet CR2032 pil
- 1 adet CR2032 pil yuvası
- 1 adet DS1307
- 1 adet 0.1μF kondansatör
- 3 adet 10K direnç
Yukarıda şemasını verdiğim devreyi breadboard ya da delikli bakır plakete kurduktan sonra SDA-Arduino Analog4 ve SCL-Arduino Analog5 bağlantılarını yapıyoruz. İnternetteDS1307 gerçek zaman saati (RTC) pek çok kütüphane mevcut.
Aşağıda DS1307new kütüphanesi ile çalışan, (en alttaki bağlantılardan dosyalarını indirebilirsiniz.) düzenleyip sadeleştirdiğim örnek bir programı paylaşıyorum. Program eğer daha önce ayarlanmamışsa saat ve tarih verilerini sizin girdiğiniz değerlere göreDS1307 NV-RAMine kaydediyor. Daha sonra saniyede bir tarih ve saat bilgilerini serial monitorde yazdırıyor.
Programda içerisinde açıklamalarda da belirttim fakat yine yazayım. Saat ve tarihi tekrar ayarlamak içinDS1307nin pil ve 5v bağlantısını kesip bir süre beklemek gerekiyor. Daha sonra sketchdeki değerleri değiştirerek saat ve tarih değerlerini ayarlayabilirsiniz.
// ##################################################################################
// # Yazar : Ercan Çağlayan
// # Kod İsmi : Arduino RTC
// # DS1307new kütüphanesi için test programı. CR2032 pil desteği ile hazırladığınız
// # DS1307 devrenizi Arduinonuzun I2C pinlerine bağladıktan sonra programı
// # yükleyerek devrenizi test edebilirsiniz.
// ##################################################################################
#include <Wire.h> // Wire kütüphanesini ekliyoruz.
#include <DS1307new.h> // DS1307new kütüphanesini ekliyoruz.
// Değişkenler
uint16_t startAddr = 0x0000; // NV-RAM'de saklamak için başlangıç adresi
uint16_t lastAddr; // NV-RAM'de saklamak için yeni adres
uint16_t TimeIsSet = 0xaa55; // Saatin tekrar ayarlanmamasına yardımcı olur.
void setup()
{
Serial.begin(9600);
// Store startAddr in NV-RAM address 0x08
RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet != 0xaa55)
// Saat ve tarih daha önce ayarlanmış mı kontrol ediyoruz. Eğer ayarlanmamışsa
// TimeIsSet değişkeni 0xaa55 değerine eşit değilse aşağıda girdiğimiz
// verilerle saati ayarlamış oluruz.
{
RTC.stopClock();
// Bu kısımdan sketchi yüklemeden önce tarih ve saati ayarlayabilirsiniz.
// Bir kez ayarlayıp yükledikten sonra tekrar tarih saat ayarı yapabilmek
// için entegreye bağlı batarya bağlantısı ve Arduinodan sağladığımız
// 5v enerjiyi kesip bir süre beklemek gerekiyor. Daha sonra programda tarih
// ve saati ayarladıktan sonra yüklediğinizde NV-RAMe ayarladığınız tarih ve
// saat bilgileri kaydedilecektir. İlk satırı (Yıl,Ay,Gün), ikinci satırı
// (Saat,Dakika,Saniye) formatında yazmanız gerekiyor.
RTC.fillByYMD(2011,4,8);
RTC.fillByHMS(22,7,0);
RTC.setTime();
TimeIsSet = 0xaa55;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
RTC.startClock();
}
else
{
RTC.getTime();
}
Serial.println("DS1307new Kutuphanesi Test Programi");
Serial.println("Tarih Saat Formati "SS:DD:ss GG-AA-YYY DDD"");
Serial.println("Her saniye alt satira gecerek o anki zamani gosterir.");
Serial.println();
}
void loop()
{
RTC.getTime(); // Saat ve Tarih verilerini al
if (RTC.hour < 10)
{
Serial.print("0");
Serial.print(RTC.hour, DEC);
}
else
{
Serial.print(RTC.hour, DEC);
}
Serial.print(":");
if (RTC.minute < 10)
{
Serial.print("0");
Serial.print(RTC.minute, DEC);
}
else
{
Serial.print(RTC.minute, DEC);
}
Serial.print(":");
if (RTC.second < 10)
{
Serial.print("0");
Serial.print(RTC.second, DEC);
}
else
{
Serial.print(RTC.second, DEC);
}
Serial.print(" ");
if (RTC.day < 10)
{
Serial.print("0");
Serial.print(RTC.day, DEC);
}
else
{
Serial.print(RTC.day, DEC);
}
Serial.print("-");
if (RTC.month < 10)
{
Serial.print("0");
Serial.print(RTC.month, DEC);
}
else
{
Serial.print(RTC.month, DEC);
}
Serial.print("-");
Serial.print(RTC.year, DEC); // Yılda herhangi bir değişikliğe gerek yok
Serial.print(" ");
switch (RTC.dow) // Haftanın günü
{
case 1:
Serial.print("PZT");
break;
case 2:
Serial.print("SAL");
break;
case 3:
Serial.print("CAR");
break;
case 4:
Serial.print("PER");
break;
case 5:
Serial.print("CUM");
break;
case 6:
Serial.print("CTS");
break;
case 7:
Serial.print("PAZ");
break;
}
Serial.println();
delay(1000); // 1 saniye bekle
}
DS1307new kütüphanesinde pek çok fonksiyon bulunmakta. Yukarıdaki örnekte sadece saat ve tarih verilerini ayarlama ve alma fonksiyonlarını kullanılmış.
Kaynaklar:
Hiç yorum yok:
Yorum Gönder