9 Mart 2014 Pazar

Arduino - Ortak Katot 7 Segmentli Gösterge 0-9 Sayıcı

Bir önceki yazımda ledleri buton yardımıyla sırasıyla yakmıştık. Bu yazımda ise 7 segment gösterge (display) kullanarak 0-9 sayıcı yapacağız. Ama önce 7 segment display hakkında biraz bilgi edinmeliyiz.

Displaylerin bir çok çeşiti bulunmakta (ortak anot,ortak katot, 7seg,14 seg, 16 seg vs.). Biz projemizde 7 segmentli ortak katot display kullanacağız. 






Display 8 adet ledden oluşmakta. Bunlardan 7 tanesini
istediğimiz rakamları göstermek için kullanacağız. Bu yüzden de hangi ledi hangi harfle adlandırdığımızı programlamanın ve sayıcının sağlığı açısından iyi öğrenmemiz gerekiyor. Sağdaki resim hangi ledin hangi harf ile standardize edildiğini gösteriyor. Bu isimler standarttır tabi siz kendi istediğiniz gibi adlandırabilirsiniz fakat şimdiki proje için standarda uyacağız.



Elimizde bulunan katot displayin hangi pininin hangi ledi yaktığı yandaki resim göstermekte. A ledini yakmak için örneğin 7 numaralı display pinine gerilim vermeliyiz. Tabii ki 5 voltu aşmamak ve 8.,3. pinlerin toprağa bağlı olması şartı ile. 

Herhangi bir lede gerilim uygulamadaki direnç bağlama kuralımızı burda da işleyebiliriz o yüzden pinlere direkt 9v veya benzeri gerilimleri uygulamayın :) .




Projemize gelince, yanmasını istediğimiz ledleri teker teker Arduino'muzdaki belirlediğimiz pinlere takıyoruz. Kusura bakmayın fritzingde devre biraz karışık çıktı fakat eminim ki kodlara bakarak zaten devreyi kendiniz de kurabilirsiniz rahatlıkla.

Devrede bir önceki yazıda yaptığımız uygulamaya benzer olacak sadece daha gösterişli ve daha anlamlı daha işe yarar bir proje olacak. Geliştirilerek skorboard yapılabilir bu proje ile.



Butona her bastığımızda sırasıyla istediğimiz sayılar yanmaya başlayacak. Örneğin, 1 sayısı için B ve C ledlerine bağlı pinler 1, diğerleri 0 olacak. Peki bunu nasıl yapacağız.

Kodlarımızda "sayi" isimli bir integer değer gireceğiz ve  0'da itibaren her döngüde 1 artacak.  Bu integer değerin 10 ile bölümünden kalan sayıyı displayde göstereceğiz. Yani "%10"  ifadesini kullanacağız.


Devrede butonu Arduino'ya bağlarken pull-down direnci koymadım. Eğer siz de koymazsanız aşağıdaki kodları çalıştırabilirsiniz.



Pull-down direnci eklerseniz 
 if (butondurumu==0)  kodu yerine

 if (butondurumu==1)  kodunu yazmanız gerekiyor. 


 Kodlarımız;

int buton=12;



int a=2; // her pine displaydeki bir led bağlı
int b=6;
int c=8;
int d=9;
int e=4;
int f=3;
int g=7;
int x=5;  //Displaydeki nokta led

int sayi=0; // Modu alınacak sayi

void setup () {
  pinMode(a,OUTPUT);
  pinMode(b,OUTPUT);
  pinMode(c,OUTPUT);
  pinMode(d,OUTPUT);
  pinMode(e,OUTPUT);
  pinMode(f,OUTPUT);
  pinMode(g,OUTPUT);
  pinMode(x,OUTPUT);
  pinMode(buton,INPUT_PULLUP);
  Serial.begin (9600);}  // Sayi değerini monitörde görmek için
void loop () {
    int butondurumu=digitalRead(buton); // buton durumu okuyoruz
    if (butondurumu==0)  //butona her basıldığında; 
    {sayi=sayi+1;}       // sayi değeri 1 artacak    
    
    if (sayi%10==0)         //sayinin moduna göre display ledleri
    {digitalWrite(a,HIGH);  //yanacak
     digitalWrite(b,HIGH);
     digitalWrite(c,HIGH);
     digitalWrite(d,HIGH);
     digitalWrite(e,HIGH);
     digitalWrite(f,HIGH);
     digitalWrite(g,LOW);    
     }
     else if (sayi%10==1)
     {digitalWrite(a,LOW);
     digitalWrite(b,HIGH);
     digitalWrite(c,HIGH);
     digitalWrite(d,LOW);
     digitalWrite(e,LOW);
     digitalWrite(f,LOW);
     digitalWrite(g,LOW);     
     }
     else if (sayi%10==2)
     {digitalWrite(a,HIGH);
     digitalWrite(b,HIGH);
     digitalWrite(c,LOW);
     digitalWrite(d,HIGH);
     digitalWrite(e,HIGH);
     digitalWrite(f,LOW);
     digitalWrite(g,HIGH);    
     }
     else if (sayi%10==3)
     {digitalWrite(a,HIGH);
     digitalWrite(b,HIGH);
     digitalWrite(c,HIGH);
     digitalWrite(d,HIGH);
     digitalWrite(e,LOW);
     digitalWrite(f,LOW);
     digitalWrite(g,HIGH);    
     }
     else if (sayi%10==4)
     {digitalWrite(a,LOW);
     digitalWrite(b,HIGH);
     digitalWrite(c,HIGH);
     digitalWrite(d,LOW);
     digitalWrite(e,LOW);
     digitalWrite(f,HIGH);
     digitalWrite(g,HIGH);    
     }
     else if (sayi%10==5)
     {digitalWrite(a,HIGH);
     digitalWrite(b,LOW);
     digitalWrite(c,HIGH);
     digitalWrite(d,HIGH);
     digitalWrite(e,LOW);
     digitalWrite(f,HIGH);
     digitalWrite(g,HIGH);    
     }
     else if (sayi%10==6)
     {digitalWrite(a,HIGH);
     digitalWrite(b,LOW);
     digitalWrite(c,HIGH);
     digitalWrite(d,HIGH);
     digitalWrite(e,HIGH);
     digitalWrite(f,HIGH);
     digitalWrite(g,HIGH);    
     }
     else if (sayi%10==7)
     {digitalWrite(a,HIGH);
     digitalWrite(b,HIGH);
     digitalWrite(c,HIGH);
     digitalWrite(d,LOW);
     digitalWrite(e,LOW);
     digitalWrite(f,LOW);
     digitalWrite(g,LOW);    
     }
     else if (sayi%10==8)
     {digitalWrite(a,HIGH);
     digitalWrite(b,HIGH);
     digitalWrite(c,HIGH);
     digitalWrite(d,HIGH);
     digitalWrite(e,HIGH);
     digitalWrite(f,HIGH);
     digitalWrite(g,HIGH);    
     }
     else if (sayi%10==9)
     {digitalWrite(a,HIGH);
     digitalWrite(b,HIGH);
     digitalWrite(c,HIGH);
     digitalWrite(d,HIGH);
     digitalWrite(e,LOW);
     digitalWrite(f,HIGH);
     digitalWrite(g,HIGH);    
     }
        
     delay(100);
     Serial.println(sayi); //Bilgisayardaki değere bakarak
     delay(10);           //displayin doğru olup olmadığını
                        //anlayabiliriz.
}
Devremizin Resmi;

"Serial.Println(sayi)" komutu ile yaptığımız haberleşmenin resmi;




Videomuz da burda...








2 yorum:

  1. if (butondurumu==0) yerine if (butondurumu==HIGH) yazılması gerekiyor yoksa buton sadece sayacı durdurmaya yarıyor.

    YanıtlaSil
    Yanıtlar
    1. Ben Pull-Down direnci koymadan bağladım butonu. Eğer butonu pull-down direnciyle koymuşsanız butondurumu ==HIGH yazmanız gerekiyor.
      Uyardığınız için teşekkür ederim, yazıda belirteyim ben.

      Sil