Arduino ile Saat Uygulaması

Merhabalar..

Bu konuda Arduino da 4′ lü 7 segment yardımı ile saat yapımına değineceğiz.

Saatimiz 00:00 dan başlayıp sayma işlemi gerçekleştirecek. Aynı zamanda bilgisayar saatine erişmek bir C# ile yazılmış bir uygulama ile mümkün olacak.

Uygulamamızda daha önceden bahsettiğimiz çoklu segment kullanım mantığı olacak. Bundan kastımız 4 adet 7 segmentin aktif etmek için kullandığımız pinleri milisaniyeler içinde yakıp söndürme işlemi. Bu işlem gözün algılayabileceği hızdan daha fazla olduğu için fark edilmeyecek. Veriyi bilgisayardan alırken C# da veriyi datetime formatından string’ lere çevirip, seri port üzerinden arduino ya aktarma ve burada gerekli parçalara ayırma işlemi gerçekleştirilecek. Bu parçalara ayırma işleminde substring fonksiyonu kullanılacak. Ayrıca kullandığımız ufak bir buton ile uygulamadaki saniye değerini segmentler üzerine yazdırabileceğiz.

Ancak burada dikkat etmemiz gereken bir nokta var. O da 7 segmentimizin ortak anot mu yoksa ortak katot mu olduğu. Benim yazdığım kodlar ve vereceğim bağlantı şeması için ortak anot için. Siz kendi segmentinizin türünü öğrenmeden bağlantı gerçekleştirmeyiniz. Aksi taktirde beklenmedik sonuçlar ile karşılaşabilirsiniz …

Tekli 7 segment kullanımına buradan ulaşabilirsiniz

Öncelikle bağlantı şemamızı verelim:

LCD_bb

 

 Arduino’ nun fritzing de mega adk olmasına takılmayın. Normal Mega da kullanabilirsiniz..

Üstte belirttiğimiz gibi buradaki bağlantılar ortak anot içindir. Herhangi bir segmentin yanması için yazılımda Arduino’ da ilgili pin i LOW a çekeceğiz. Bu ortak katot segmentler de tam tersidir.

Şimdi de Arduino Kodumuz:

#include<String.h>    //string fonksiyonlarını içieren kütüphane

const int katotPin[7] = {2,3,4,5,6,7,8};    //segment pinlerimiz

//HIGH e çekilecek display aktif etme pinlerimiz
const int dkBirler = 13;            
const int dkOnlar = 12;
const int saatBirler = 11;
const int saatOnlar = 10;

//aradaki iki nokta
const int nokta = 22;    //high e çekiecek

//buton pini
const int butonPin = 41;
int butonDurumu = 0;

int dakika,saat,saniye;

String gelenDeger = "";
char deger[10];

int sayac = 0;
bool durum = true;

//ortak anot için rakamlar
                      //a,b,c,d,e,f,g
int rakamlar[10][7] = {{0,0,0,0,0,0,1},
                       {1,0,0,1,1,1,1},
                       {0,0,1,0,0,1,0},
                       {0,0,0,0,1,1,0},
                       {1,0,0,1,1,0,0},
                       {0,1,0,0,1,0,0},
                       {0,1,0,0,0,0,0},
                       {0,0,0,1,1,1,1},
                       {0,0,0,0,0,0,0},
                       {0,0,0,0,1,0,0}
                    };

void setup() {
  Serial.begin(9600);
  for(int i = 0; i < 7; i++){
    pinMode(katotPin[i], OUTPUT);
  }
  pinMode(dkBirler, OUTPUT);
  pinMode(dkOnlar, OUTPUT);
  pinMode(nokta, OUTPUT);
  pinMode(saatBirler, OUTPUT);
  pinMode(saatOnlar, OUTPUT);
  pinMode(butonPin, INPUT);
}

void loop() {
  
  //buton durumunu oku
  butonDurumu = digitalRead(butonPin);
  
  //seri portta veri mi varmı?
  if(Serial.available() > 0){
    delay(15);      //hassas okuma için ufak bir gecikme
    
    //seri porttaki değerleri bir string e yazdık
    for(int i = 0; i < Serial.available(); i++){
      deger[i] = Serial.read();
      gelenDeger = gelenDeger + deger[i];
    }
    
    //string deki değer null değilken substring işlemlerini gerçekleştirdik
    if(gelenDeger != ""){
      saat = gelenDeger.substring(0,2).toInt();
      dakika = gelenDeger.substring(3,5).toInt();
      saniye = gelenDeger.substring(5,gelenDeger.indexOf('|')).toInt();
    }
  }else{
    gelenDeger = "";      //eğer seri port kapalı ise string i boşalttık
  }
  
  //butona basılı değilken saati göstersin
  if(butonDurumu == 0){
    
    //displeye rakam yazma işleminde ilgili displayi aktif edip çıkışlara o displayde
    //gözükecek sayinin bitlerini gönderdik
    //bu işlem 5 er ms lik gözün algılayamacağı gecikme ile gerçekleştirildi
    
    rakam(dakika % 10);    
    digitalWrite(dkBirler, HIGH);
    digitalWrite(dkOnlar, LOW);
    digitalWrite(saatBirler, LOW);
    digitalWrite(saatOnlar, LOW);
    
    delay(5);
    
    rakam(dakika / 10);
    digitalWrite(dkBirler, LOW);
    digitalWrite(dkOnlar, HIGH);
    digitalWrite(saatBirler, LOW);
    digitalWrite(saatOnlar, LOW);
    
    delay(5);
    
    rakam(saat % 10);
    digitalWrite(dkBirler, LOW);
    digitalWrite(dkOnlar, LOW);
    digitalWrite(saatBirler, HIGH);
    digitalWrite(saatOnlar, LOW);
    
    delay(5);
    
    rakam(saat / 10);
    digitalWrite(dkBirler, LOW);
    digitalWrite(dkOnlar, LOW);
    digitalWrite(saatBirler, LOW);
    digitalWrite(saatOnlar, HIGH);
    
    delay(5);
  }else{
    
    //butona basılıyorsa pinlere saniye değerini gönderildi
    
    rakam(saniye % 10);
    digitalWrite(dkBirler, HIGH);
    digitalWrite(dkOnlar, LOW);
    digitalWrite(saatBirler, LOW);
    digitalWrite(saatOnlar, LOW);
    
    delay(10);
    
    rakam(saniye / 10);
    digitalWrite(dkBirler, LOW);
    digitalWrite(dkOnlar, HIGH);
    digitalWrite(saatBirler, LOW);
    digitalWrite(saatOnlar, LOW);
    
    delay(10);
  }
  
  
  //programın kararlılığını engelleyen kısım
  //her sorgu programa mikrosaniyeler boyutunda da olsa gecikme verir
  //belli bir süre sonra yazılım geri kalamya başlıyacaktır
  
  sayac++;
  if(sayac == 20){
    digitalWrite(nokta, HIGH);
  }else if(sayac == 40){
    digitalWrite(nokta,LOW );
  }
    if(sayac == 50){
      sayac = 0;
      saniye++;
      if(saniye == 60){
        saniye = 0;
        dakika++;
      }
      if(dakika == 60){
        dakika = 0;
        saat++;
      }
      if(saat == 24){
        saat = 0;
      }
  }
    
}

void rakam(byte sayi){
  for(int i = 0; i < 7 ; i++){
    digitalWrite(katotPin[i], rakamlar[sayi][i]);
  }
}

//Prepared by Oğuzhan Başer

 

Yazılımın içerisinde de belirttiğimiz gibi ufak bir gecikme sorunu yaşanmaktadır. Bunu en yakında daha iyi bir algoritmanın bulunduğu fonksiyonlar ile değiştereceğim.. :)

Arayüzümüzün görüntüsü ve exe dosyası:

 

Screenshot 2014-10-15 21.49.14
İndirmek İçin Resme Tıkla

 

Arayüz kaynak kodlarına buradan ulaşabilirsiniz..

 

10 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir