Arduino DS1302 ile Saat İşlemleri

Bu modül ile saat bilgileri anlık ds1302 entegresinde tutulur. Modülün üzerindeki pil sayesinde arduino yu güçten çekseniz bile saat bilgisi kaybolmayacaktır. Zaman ilerlemeye devam edecektir.

Bu modülü kullanarak sadece saat yapılır gibi düşünmeyin. Farklı projelerde, zamanlanmış görevlere ihtiyacınız olduğunda bu modül sizin işinizi görecektir. Bu modül ile yapılabilecek benim aklıma gelen bazı projeler şöyle ;

  • Evinizde ki kombilerinizi bu modül ile belirli saatlerde açıp kapatabilirsiniz. Bunu yaparken sadece ekstra röle modülüne  ihtiyacınız olacaktır.
  • Kuluçka makinesi yaparken kuluçka zamanını bu modül ile ayarlayabilirsiniz elektrik kesilip gelse bile saat verisi kaybolmayacak ve kaldığı yerden devam edecektir.
  • MFRC 522 kartlı giriş  projesinde giriş ve çıkış zamanlarını hesaplamak istediğinizde bu modül size yardımcı olacaktır.

Şimdi kendi konumuz olan saat yapımına geçelim. Bu iş için bize gerekli olan parçalar şu şekilde;

  • Arduino herhangi bir modeli
  • lcd5110 display (isterseniz başka bir lcd 16×2 kullanabilirsiniz)
  • DS1302 modülü
  • Birkaç adet jumper kablo (dişi -erkek ve erkek erkek kablo)

 DS1302'nin temel kullanım şeması

Arduino DS1302 ile Saat İşlemleri

Arduino DS1302 ile Saat İşlemleri

Devrenin bağlantılarını aşağıdaki resimde görüldüğü gibi yapın.

Arduino DS1302 ile Saat İşlemleri

Bağlantıyı yaptıktan sonra Arduino IDE yi açıyoruz. Bize ilk başta iki adet kütüphane gerekiyor. 5110 lcd kütüphanesi ve DS1302 kütüphanesi.

indirdiğiniz kütüphaneleri Arduino IDE ye dahil etmek için Arduino IDE menüsünden Taslak  –  Library ekle  – ZIP kitaplığı ekle yoluna girin. Açılan pencereden indirdiğiniz kütüphaneleri seçip open’ e tıklayın.

Bazı forumlarda I/O (Data) ucuna 1Klık direnç takılması tavsiyesi var.

Bu işlemide tamamladıktan sonra aşağıdaki kodu arduinoya yükleyin.

#include <stdio.h>
#include <DS1302.h>
#include <LCD5110_Basic.h>
int lcdledi=12;
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
LCD5110 myGLCD(7,8,5,4,6); //CLK,DİN, DC, RST,CE
int i=0;
namespace {
const int kCePin   = 11;  // Chip Enable
const int kIoPin   = 10;  // Input/Output
const int kSclkPin = 9;  // Serial Clock


DS1302 rtc(kCePin, kIoPin, kSclkPin);

String dayAsString(const Time::Day day) {
  switch (day) {
    case Time::kSunday: return "Pazar";
    case Time::kMonday: return "Pazartesi";
    case Time::kTuesday: return "Salı";
    case Time::kWednesday: return "Çarşamba";
    case Time::kThursday: return "Perşembe";
    case Time::kFriday: return "Cuma";
    case Time::kSaturday: return "Cumartesi";
  }
  return "(unknown day)";
}

void printTime() {
  // Get the current time and date from the chip.
  Time t = rtc.time();

  // Name the day of the week.
  const String day = dayAsString(t.day);

  // Format the time and date and insert into the temporary buffer.
  String saat = String(t.hr);
  String dakika = String(t.min);
  String saniye = String(t.sec);
  String gun=String(day.c_str());
  String ay;
  String kaci=String(t.date);
  switch (t.mon){
    case 1: ay="Ocak"; break;
    case 2: ay="Şubat"; break;
    case 3: ay="Mart"; break;
    case 4: ay="Nisan"; break;
    case 5: ay="Mayıs"; break;
    case 6: ay="Haziran"; break;
    case 7: ay="Temmuz"; break;
    case 8: ay="Ağustos"; break;
    case 9: ay="Eylül"; break;
    case 10: ay="Ekim"; break;
    case 11: ay="Kasım"; break;
    case 12: ay="Aralık"; break;
    }
         

  myGLCD.print(saat,28,0);
  myGLCD.print(":",40,0);
  myGLCD.print(dakika,46,0);
  myGLCD.print(":",58,0);
  myGLCD.print(saniye,64,0);
   myGLCD.print(kaci,0,18);
   myGLCD.print(ay,20,18);
   myGLCD.print(gun,50,18);
   
}

}  

void setup() {
  pinMode(lcdledi, OUTPUT);
  myGLCD.InitLCD();
 myGLCD.setContrast(60);
  Serial.begin(9600);

  rtc.writeProtect(false);
  rtc.halt(false);
}

void loop() {
  String a= String(i);
i +=1;
   myGLCD.setFont(SmallFont);
   
   digitalWrite(lcdledi, LOW);
   delay(1000);
  printTime();
}

   Eğer tarihi ve saati değiştirmek isterseniz aşağıdaki kodda belirtmiş olduğum yeri değiştirip yükleyin ardından tekrar üstteki kodu yükleyin.

#include <stdio.h>
#include <DS1302.h>

namespace {

const int kCePin   = 11;  // Chip Enable
const int kIoPin   = 10;  // Input/Output
const int kSclkPin = 9;  // Serial Clock

// Create a DS1302 object.
DS1302 rtc(kCePin, kIoPin, kSclkPin);

}  

void setup() {
  rtc.writeProtect(false);
  rtc.halt(false);
  Time t(2013, 9, 22, 1, 38, 50, Time::kSunday);  //Buradan değiştireceğini zamanı yıl,ay gün,saat,dakika,saniye olarak yazıp yükleyin

  rtc.time(t);
}

void loop() {

}

 

Projeye Alarm Ekleyelim

#include <stdio.h>
#include <DS1302.h>

int i = 0;

namespace {
  const int kCePin   = 11;  // Chip Enable
  const int kIoPin   = 10;  // Input/Output
  const int kSclkPin = 9;  // Serial Clock
 
  DS1302 rtc(kCePin, kIoPin, kSclkPin);
 
  String dayAsString(const Time::Day day) {
    switch (day) {
      case Time::kSunday: return "Pazar";
      case Time::kMonday: return "Pazartesi";
      case Time::kTuesday: return "Salı";
      case Time::kWednesday: return "Çarşamba";
      case Time::kThursday: return "Perşembe";
      case Time::kFriday: return "Cuma";
      case Time::kSaturday: return "Cumartesi";
    }
    return "(unknown day)";
  }
 
  void printTime() {
    // Get the current time and date from the chip.
    Time t = rtc.time();
 
    // Name the day of the week.
    const String day = dayAsString(t.day);
 
    // Format the time and date and insert into the temporary buffer.
    String saat = String(t.hr);
    String dakika = String(t.min);
    String saniye = String(t.sec);
    String gun = String(day.c_str());
    String ay;
    String kaci = String(t.date);
    switch (t.mon) {
      case 1: ay = "Ocak"; break;
      case 2: ay = "Şubat"; break;
      case 3: ay = "Mart"; break;
      case 4: ay = "Nisan"; break;
      case 5: ay = "Mayıs"; break;
      case 6: ay = "Haziran"; break;
      case 7: ay = "Temmuz"; break;
      case 8: ay = "Ağustos"; break;
      case 9: ay = "Eylül"; break;
      case 10: ay = "Ekim"; break;
      case 11: ay = "Kasım"; break;
      case 12: ay = "Aralık"; break;
    }
 
    Serial.print(String(t.hr));
    Serial.print(":");
    Serial.print(String(t.min));
    Serial.print(":");
    Serial.print(String(t.sec));
    Serial.print("n");
 
  }
 
  void SaatiKur() {
    Time t(2019, 6, 6, 4, 14, 05, Time::kSaturday);  //Buradan değiştireceğini zamanı yıl,ay gün,saat,dakika,saniye olarak yazıp yükleyin
    rtc.time(t);
  }
 
  void Alarm() {
    Time t = rtc.time();
 
    if (t.min % 5 == 0) { //dakika 5'in katıysa alarm led yakıyoruz
      digitalWrite(13, HIGH);
    }
    else {
      digitalWrite(13, LOW);
    }
  }
}

void setup() {

  pinMode(13, OUTPUT);
  Serial.begin(9600);

  //SaatiKur();
  rtc.writeProtect(false);
  rtc.halt(false);
}

void loop() {
  delay(1000);
  printTime();

  Alarm();
}

 

Kaynaklar

Yorumunuzu Ekleyin


Yükleniyor...
    Yükleniyor...