Bu uygulamamızda daha önce değindiğimiz 7 segmentli display uygulamamızı biraz daha geliştirerek Arduino Sayıcı Uygulaması ile 2 dijit 7 segmentli displayde 99′ a kadar saydırma işlemini yapacağız. Kullanılan displayler 2 dijit olup ortak katot bağlantılıdır. Transistör ile displayleri ayrı ayrı kontrol edebildiğimiz için aynı anda 2 dijite farklı değerler yansıtabiliriz. Bunu yapmak için televizyondaki gibi tarama mantığını kullanacağız.

Yani 1. dijite rakamı gösterip(bu esnada 2. dijit kapalı) sonra 2. dijite rakamı gösterip(bu esnada 1. dijit kapalı) bu döngüyü  10ms aralıklarla saniyede 25 kere yaparsanız aynı anda iki farklı değer sürekli gözüüküyormuş gibi olur. Bu zaman aralığı ve taramayı değiştirerek 7 segmentli displaylerde parlaklık ayarını yapmış olursunuz.

Arduino ile 7 Segmentli Display kullanarak 99′ a kadar sayaç uygulaması devre şeması aşağıdaki gibi yapılabilir.

Arduino Double Segmentli Display Devre Şeması

Arduino Double Segmentli Display Devre Şeması

Arduino ile 7 Segmentli Display kullanarak 99′ a kadar sayaç uygulaması Arduino programı aşağıdadır. Bu programı incelerseniz for döngüleri ile tarama ve numaraları gösterme işlemi yapılmaktadır. Devre şemanızı ve Arduino’ nuzun pin sayısı kadar çok sayıda dijit ekleyerek istediğiniz sayıya kadar sayadırma işlemini yaptırabilirsiniz. İsterseniz geriye doğru saydırma, atlayarak saydırın.

Arduino Double Segmentli Display Uygulaması

Arduino Double Segmentli Display Uygulaması

Ayrıca 7 segmentli Display Truth Table’ ı değiştirerek te farklı karakterleri gösterebilirsiniz. gerisi sizin hayal gücünüze kalmış.

Arduino Sayıcı Uygulaması Kodları

/* www.kaizen40.com

2 digit 7 segmentli display

alt soldan başlayarak
1: c
2: dp(nokta)
3: e
4: d
5: g
6: f
7: ds1 (1.digit ortak katot)
8: ds2 (2.digit ortak katot)
9: b
10: a

*/

int sayac = 0;

//**************** DISPLAY ATAMALARI *****************//
// 7 segmentli dipslay Arduino pin bağlantıları
//                         a, b, c, d, e, f, g
const int segmentPin[7] = {3, 4, 5, 6, 7, 8, 9};
const int nDisplayPin[2] = {10, 11}; // dipslay ortak katodu

// a, b, c, d, e, f, g  (7 segmentli Display Truth Table)
int sayi[10][7] = {    // satır, sutun
  {1, 1, 1, 1, 1, 1, 0}, // 0
  {0, 1, 1, 0, 0, 0, 0}, // 1
  {1, 1, 0, 1, 1, 0, 1}, // 2
  {1, 1, 1, 1, 0, 0, 1}, // 3
  {0, 1, 1, 0, 0, 1, 1}, // 4
  {1, 0, 1, 1, 0, 1, 1}, // 5
  {0, 0, 1, 1, 1, 1, 1}, // 6
  {1, 1, 1, 0, 0, 0, 0}, // 7
  {1, 1, 1, 1, 1, 1, 1}, // 8
  {1, 1, 1, 0, 0, 1, 1}  // 9
};

//***************** KONFİGURASYONLAR *****************//
void setup()
{
  //Serial.begin(9600);
  //delay(500);
  
  // pinleri çıkış olarak ayarla
  for (int i = 0; i <= 7; i++)
  {
    pinMode(segmentPin[i], OUTPUT);
  }
  
  for (int i = 0; i <= 2; i++)
  {
    pinMode(nDisplayPin[i], OUTPUT);
  }
}

//********************* ANA PROGRAM ******************//
void loop()
{
  if (sayac <= 9)                                     // 0-9' a kadar ilk dijite yaz
  {
    digitalWrite(nDisplayPin[0], HIGH);               // 1. dipslay aktif
    digitalWrite(nDisplayPin[1], LOW);                // 2. dipslay pasif 

    for (int i = 0; i <= 9; i++)                      // sayılar
    {
      for (int j = 0; j <= 7; j++)                    // segmentler
      {
        digitalWrite(segmentPin[j], sayi[i][j]);
      }
      delay(500);
      sayac++;
    }
  }
  else                                                // 10-99' a kadar ikinci dijite yaz
  {
    // sayıyı dijitlere böl
    String number = (String)sayac;
    int dsp1 = ((String)number[0]).toInt();           // 1. dijit
    int dsp2 = ((String)number[1]).toInt();           // 2. dijit

    //Serial.println("dsp1: " + (String)dsp1 + "   dsp2: " + (String)dsp2);

    for ( int t = 0; t < 25; t++)
    {
      // 1. dijiti göster
      digitalWrite(nDisplayPin[0], LOW);              // 1. dipslay pasif
      digitalWrite(nDisplayPin[1], HIGH);             // 2. dipslay aktif
      
      for (int j = 0; j <= 7; j++)                    // segmentler
      {
        digitalWrite(segmentPin[j], sayi[dsp1][j]);
      }
      delay(10);

      // 2. dijiti göster
      digitalWrite(nDisplayPin[0], HIGH);             // 1. dipslay aktif
      digitalWrite(nDisplayPin[1], LOW);              // 2. dipslay pasif
      
      for (int j = 0; j <= 7; j++)                    // segmentler
      {
        digitalWrite(segmentPin[j], sayi[dsp2][j]);
      }
      delay(10);
    }
  }

  // sayac 99' a ulaşmış ise sıfırla
  if (sayac >= 99)
  {
    sayac = 0;
  }
  else
  {
    sayac++;
  }
}

İyi çalışmalar,


0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.