Arduino 7 Segment Display kullanımı

0
116

Sayısal verileri görüntülemek için 7 segment display kullanmak ekonomik bir seçim olacağı gibi aynı zamanda ekranın gece ve gündüz görünebilir olmasını sağlayacaktır.

Rakamları oluşturmak için 7 led ve nokta için 1 led olmak üzere toplam 8 led birleşiminden oluşan 7 segmentli (bölümlü) bu ekranlar çeşitli boyut ve renklerde temin edilebilir. Ekran içerisindeki ledlerin katot ucu ortak bağlanmış ise ortak katot display, ledlerin anot ucu ortak bağlanmış ise ortak anot display olarak adlandırılırlar.

7segment_uc

Arduino 7 segment display bağlantısı

Arduino kart ile 7 segment display arasında bağlantı yapmak için iki adet 74HC595 entegresinden faydalanacağız. Ekrana veri seri iletileceğinden Arduino I/O uçlarından tasarruf yapacağız.

7 segment display şema

Yukarıdaki şemada bütün ekranlara ait a,b,c,d,e,f ve g uçlarının birbirine paralel bağlandığı görülecektir. Bu tür matrix bağlantılardaki amaç yine entegre pinlerinden tasarruf sağlamaktır. Bu bağlantı şeklini daha iyi anlamak için devrenin çalışma mantığına geçelim.

Örneğin yukarıdaki ekrana 5298 sayısını yazdırmak için gerekli adımları özetleyelim.

Önce birbirine paralel bağlı a,b,c,d,e,f ve g uçlarına 5 rakamını oluşturmak için gerekli gerilimi uygularız. Ancak ekranın çalışabilmesi için ortak katot ucunu şaseye çekmemiz (0 Volt uygulamamız) gerekir. Sadece en baştaki ekranın ortak katot ucu şaseye çekilirse en baştaki ekranda 5 rakamı yanar diğerleri sönük kalır.

İkinci aşamada 2 rakamını oluşturmak için a,b,c,d,e,f ve g uçlarına gerekli gerilimi uygulayıp sadece ikinci ekranın ortak katot ucunu şaseye çekersek ikinci ekranda 2 rakamı yanar diğerleri sönük kalır.

Üçüncü ve dördüncü aşamada da aynı şekilde 9 ve 8 rakamları için döngü devam ettirilirse ekran üzerinde rakamlar tek tek belirmesine karşın göz yanılmasından dolayı bütün ekranların aynı anda çalıştığı görülür. Yani ekran üzerinde yanıp sönen rakamlar değil sabit 5298 sayısını okuruz.

Aşağıdaki kodları incelemek bu bağlantı şeklini daha iyi anlamanızı sağlayacaktır.


int latchPin = 5;                                                              
int clockPin = 6;                                                               
int dataPin = 4;                                                                 

int sayi = 5298;                                                                 // Ekrana aktarılacak sayı
int basamak[4];                                                                 
int sayac = 0;

byte ArraySegment[] = {                                                         
B11111100, B01100000, B11011010, B11110010, B01100110, B10110110,                // 0,1,2,3,4,5,6,7,8,9 sayıları 7 segment kodlama
B10111110, B11100000, B11111110, B11110110                                           
};

byte ArrayBasamak[] = {
B11101111, B11011111, B10111111, B01111111                                       // 7 segment digit kodlama
};

void setup() {

pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);

}

void loop() {
  

  basamak[2] = sayi % 1000;                                                       // Sayının 1000'e bölümünden kalan ( Örnek; 1298 --> 298 )
  basamak[3] = (sayi - basamak[2]) / 1000;                                        // Binler basamağındaki rakam ( Örnek; 1298 --> 1 ) 
  basamak[1] = basamak[2] % 100;                                                  // Onlar basamağından itibaren sayı ( Örnek; 298 --> 98 ) 
  basamak[2] = (basamak[2] - basamak[1]) / 100;                                   // Yüzler basamağındaki rakam ( Örnek; 298 --> 2 ) 
  basamak[0] = basamak[1] % 10;                                                   // Birler basamağındaki sayi ( Örnek; 98 --> 8 )
  basamak[1] = (basamak[1] - basamak[0]) / 10;                                    // Onlar basamağındaki sayı ( Örnek 98 --> 9 )

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, ArrayBasamak[sayac]);                     // Digit için veri gönder.
  shiftOut(dataPin, clockPin, LSBFIRST, ArraySegment[basamak[sayac]]);            // Segment için veri gönder.
  digitalWrite(latchPin, HIGH);
  delay(10);
  
  sayac++;
  if (sayac == 4) {
  sayac = 0;
  }
  
}

Rakamları ekrana yazarken hangi ledlerin yanacağı ArraySegment veri dizininde kodlanmış şekildedir. Yine seçilen basamak değerine göre hangi ortak katot ucunun aktif olacağı yine ArrayBasamak veri dizininde kodlanmış haldedir.

Örneğin; ArraySegment[2] ile ArraySegment veri dizininden B11011010 değerini çağırırız. Böylece 2 rakamını yakmak için a,b,c,d,e,f ve g uçlarından hangilerine gerilim uygulanacağını önceden belirlemiş oluruz.

Sayının içindeki rakamları teker teker ekrana yazdıracağımızdan sayıyı basamaklarına ayırmak gerekir. Mod işlemi (%) kullanarak elde ettiğimiz basamak[0] değişkeni birler basamağındaki rakamı, basamak[1] değişkeni onlar basamağındaki rakamı, basamak[2] değişkeni yüzler basamağındaki rakamı, basamak[3] değişkeni binler basamağındaki rakamı bize verir.

Sayac değişkeni rakamların sırayla ekrana basılmasını sağlar.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz