Merhaba arkadaşlar, bu konumuzda 7 segment display nedir, Arduino ile nasıl kullanılır ve nelere dikkat edilmelidir bunları göreceğiz. Aslında biraz düşündüm bu konuyu açmadan önce çünkü bir çok konuda  örnek uygulamaları 7 segment display ile gerçekleştirdim ve orada da nasıl kullanıldığını az çok görmüş oldunuz. Bildiğiniz gibi birden fazla display kullanımı için aslında tarama yöntemi kullanılır ancak burada bundan bahsetmeyeceğim çünkü tarama yöntemini uygulamak için önce display kullanımı konusunda bilgimizin oturmuş olması gerekiyor. Kısacası basitten zora doğru bir yol izlemeye çalışıyorum. Tabi arada ileri seviye konulara değiniyor olabilirim ancak gerekli olabilecek konular olduğunu düşündüğümden es geçemiyorum. O halde başlayalım…

Yazar: z1rqdym

7 Segment Display Nedir?

7 Segment Display aslında içerisinde nokta işareti yoksa 7, noktalama işareti varsa 8 adet LED’den oluşan bir rakam görüntüleme elemanıdır. 7 Segment Display’ler hane sayılarına ve boyutlarına göre bir çok çeşidi olmasının yanında temel olarak iki tipi vardır. Bunlar ortak katot ve ortak anot olan 7 Segment Display’lerdir. 

Ortak anot olan 7 Segment Display’lerin içerisindeki bütün LED’lerin anot bacakları birbirine bağlıdır ve katotları birbirinden bağımsızdır.
Ortak katot olan 7 Segment Display’lerin içerisindeki bütün LED’lerin katot bacakları birbirine bağlıdır ve anotları birbirinden bağımsızdır.

Rakamları oluşturan her bir LED’e Segment denilir ve bir rakamı oluşturan tüm bu segment’lerin sayısı 7 adet olduğundan dolayı bu display’lere 7 segment display denilmektedir. Segmentlerin oluşturduğu yapıya da ” Digit (dijit diye okunur) ” denir.

Aşağıdaki görselde şematik olarak 7 Segment Display’lerin iç yapısı görünmektedir.

7 segment display

7 Segment Display Kullanım Amacı Nedir?

7 Segment Display’leri günlük hayatta asansör kabinlerinin kontrol panellerinde, takometrelerde, ölçüm aletlerinde, banka gibi sıra sistemi olan yerlerde bulunan numeratör panolarında ve daha bir çok yerde görebilirsiniz. 
Mesela yapmak istediğiniz bir projede LCD alacak bütçeniz yok ise daha az bir maliyetle 7 Segment Display kullanabilirsiniz, benim yaptığım gibi. 
Bir de eğer yazı yazmak isterseniz Alfanümerik Segmentli Displayler de piyasada bulunmaktadır tabi bunun için ileride ayrı bir konu hazırlayacağım.

7 Segment Display Nasıl Kullanılır?

Yukarıdaki görselde olduğu gibi her segment için temsili olarak bir harf bulunmaktadır. mesela eğer arduinonun 2,3,4,5,6,7,8,9 nolu pinlerini kullanarak bir adet displayde herhangi bir rakamı göstermek istiyorsak önce rakamları oluşturacak olan segmentlerin hangilerinin aktif olacağını belirlememiz gerekmektedir. Bunun için Arduino’nun bu pinlerini (2,3,4,5,6,7,8,9) ilgili segmentlerle (a,b,c,d,e,f,g,h) eşleştiremek gerekiyor ve bununla ilgili bir tablo hazırlayarak ilgili rakam bilgilerini elde edebiliriz. Ben bu eşleştirmeyi şöyle yaptım;

  • 2-a
  • 3-b
  • 4-c
  • 5-d
  • 6-e
  • 7-f
  • 8-g
  • 9-h (displaydeki nokta)

Bu eşleşme ortak katot ya da ortak anot 7 segment display için fark etmez. Fark sadece elde edilecek bilgilerin ortak anot ve ortak katot 7 segment displayler için farklı olmasıdır.

Ortak anot olan bir 7 segment displayin herhangi bir segmentini aktif etmek için arduino’dan bu segmente bağlı olan pini LOW yapmamız gerekir.
Ortak katot olan bir 7 segment displayin herhangi bir segmentini aktif etmek için arduino’dan bu segmente bağlı olan pini HIGH yapmamız gerekir.

HIGH, sayısal olarak 1 demektir. LOW ise sayısal olarak 0 demektir. Şimdi bunlara dayanarak Ortak anot ve ortak anot 7 segment displayler için hazırladığım aşağıdaki tabloyu inceleyelim.

Tabloya baktığımızda aslında her bir mavi renkli satırda binary olarak 8 bit bilgiyi otomatik olarak elde etmiş oluyoruz. Ancak binary bilgiyi kodlama esnasında yazılması da kullanması da dert olduğundan HEX yani ” on altılık ” tabandaki hallerini yanlarına gri sütunda yazdım. Binary’den HEX’e dönüşümü başka bir başka konuda ele alacağım. Buradan da anlaşılıyor ki ” h ”  8 bitlik binary rakam bilgisinin 0.biti ve ” a ” segmenti de 7.biti oluyor. 

Arduino’da doğrudan port yönlendirmesi için hazır bir fonksiyon olmadığı için digitalWrite ile bu bacakları teker teker bu tabloya göre HIGH veya LOW yapmak hem gereksiz yere Arduino’da kodların fazla yer kaplamasına neden olur hem de yazdığınız kodlar kullanışlı olmaz.

Aşağıdaki örnek kod ile bunun yerine sadece bir adet digitalWrite satırını bir adet for döngüsü ile nasıl bir rakama ait bilgiyi 8 adet pine gönderdiğimizi göreceksiniz.

int i; // for döngüsü değişkeni tanımlanıyor
int rakam=0xFC; // ortak katot 7 segment display için 0 rakamı bilgisi tablodan bakınız
for(i=2,i<10;i++) // 2'den başlıyor çünkü i değikenini pini seçmek içinde kullanıcağız. 10'a kadar döngü 8 kere işleyecek
{
 if(bitRead(rakam, (9-i))==HIGH) // rakam bilgisinin okunacak biti HIGH ise şart doğru olur
  {
   digitalWrite(i, HIGH); // ve i numaralı arudino pini HIGH yapılır
 }
  if(bitRead(rakam, (9-i))==LOW) // eğer rakam bilgisinin okunak biti LOW ise şart doğru olur
 {
   digitalWrite(i, LOW); // ve i numaralı arduino pini LOW yapılır
 }
}

bu döngünün sonunda Arduino’nun 2-9 arasındaki, 8 adet pinden rakam bilgisini ortak katot 7 segment displaye vermiş olur.
if içerisinde kullandığım bitRead fonksiyonu ile istenen herhangi bir verinin istenen biti okunur sonucu HIGH ya da LOW olarak geri döndürür. 

bitRead(rakam, (9-i)) 

burada ilk parametre okunacak veri oluyor yani bizim ” rakam ” değişkenimiz. ikinci parametre ise okunacak bit numarasıdır. okunacak bit numarasına (9-i) yazdım çünkü okunması gereken ilk bit 7.bit olması gerekiyordu ancak döngü değişkeni olan ” i ” 2’den başlıyor. Bu yüzden ” i ” kadar 9’dan  eksilttim ve okunacak bit numarasını 0 yapmış oldum. for döngüsü tekrar ettikçe artan ” i ” değişkeni mesela 9 olduğunda da 9’dan ” i ” kadar eksiğinden 0.biti okuyabilecek. Böylece rakam bilgisinin 7’den 0.bitine kadar tüm 8 biti de okunup ona göre digitalWrite ile ilgili pin HIGH ya da LOW yapılır. ilgili pin de yine ” i ” değişkenine bağlı. ben segment ile pin eşleşmesini 2 numaralı pinden 9’a kadar yapmıştım. bu yüzden digitalWrite(i, HIGH); ya da digitalWrite(i, LOW); kullandım. i bize pin numarasını vermektedir. yani ” i ” 2 den başlıyor dolayısı ile ” i ” 2 oluyor. ” i ” 9 olunca da 9 nolu pin HIGH ya da LOW oluyor.

yukarıdaki kodun yaptığı işi ise en basit şu şekilde yapabilirsiniz.

int i; // for döngüsü değişkeni tanımlanıyor

int rakam=0xFC; // ortak katot 7 segment display için 0 rakamı bilgisi tablodan bakınız

// a segmenti için pin 2 HIGH ya da LOW yapılır.
if(bitRead(2, 7)==HIGH) 
{
  digitalWrite(2, HIGH);  
}
if(bitRead(2, 7)==LOW)
{
  digitalWrite(2, LOW);  
}

// b segmenti için pin 3 HIGH ya da LOW yapılır.
if(bitRead(3, 6)==HIGH) 
{
  digitalWrite(i, HIGH);  
}
if(bitRead(3, 6)==LOW) 
{
  digitalWrite(i, LOW);  
}

// c segmenti için pin 4 HIGH ya da LOW yapılır.
if(bitRead(4m,5)==HIGH) 
{
  digitalWrite(i, HIGH); 
}
if(bitRead(4, 5)==LOW) 
{
  digitalWrite(i, LOW);  
}

// d segmenti için pin 5 HIGH ya da LOW yapılır.
if(bitRead(5, 4)==HIGH) 
{
  digitalWrite(i, HIGH);  
}
if(bitRead(5, 4)==LOW) 
{
  digitalWrite(i, LOW);  
}

// e segmenti için pin 6 HIGH ya da LOW yapılır.
if(bitRead(6, 3)==HIGH) 
{
  digitalWrite(i, HIGH);  
}
if(bitRead(6, 3)==LOW) 
{
  digitalWrite(i, LOW);  
}

// f segmenti için pin 7 HIGH ya da LOW yapılır.
if(bitRead(7, 2)==HIGH) 
{
  digitalWrite(i, HIGH);  
}
if(bitRead(7, 2)==LOW) 
{
  digitalWrite(i, LOW);  
}

// g segmenti için pin83 HIGH ya da LOW yapılır.
if(bitRead(8, 1)==HIGH) 
{
  digitalWrite(i, HIGH);  
}
if(bitRead(8,1)==LOW) 
{
  digitalWrite(i, LOW);  
}

// h (nokta) segmenti için pin 9 HIGH ya da LOW yapılır.
if(bitRead(9, 0)==HIGH) 
{
  digitalWrite(i, HIGH); 
}
if(bitRead(9, 0)==LOW) 
{
  digitalWrite(i, LOW);  
}

Şimdi bu kadar uzun bir kodu ilk yaptığım örnek koddaki gibi for döngüsü ile yapmak mı daha mantıklı daha sade ve kolay? Yoksa; bu basit, uzun ve kafa karıştırıcı olan yöntem mi? Siz karar verin.

7 Segment Display ve Arduino ile 0-9 Arası Yukarı ve Aşağı Sayıcı Uygulaması

Bu uygulamada bir adet ortak anot 7 segment display iki adet buton ve Arduino ile 0’dan 9’a yukarı ve aşağı sayıcı uygulaması yapacağız. Aşağıda devre şeması görünmektedir. Proteus 8 simülasyon dosyasını konu sonunda ekten indirebilirsiniz.

7 Segment Display ve Arduino ile 0-9 Arası Yukarı ve Aşağı Sayıcı Uygulaması Proteus görseli

Uygulamaya ait Arduino kodu aşağıdadır. Rakam bilgilerini tablodan alıp 0’dan başlayarak rakam_tablosu adlı dizi değişkene aktardım. Kodların açıklamasını yapmadım, inceleyince nasıl çalıştığını kendiniz anlayacaksınızdır 🙂

Böylece bir konunun daha sonuna gelmiş bulunmaktayım. Faydalı olmasını umut ediyorum. Sorularınızı ve düşüncelerinizi yorum atarak paylaşmaktan çekinmeyin.

Sitemizdeki diğer makaleleri okumak için -> Makaleler