Arduino Shift Register ile Çoklu 7 Segment Display Kullanımı

Herkese merhaba, bu makalede Arduino ile herhangi bir Shift Register entegresi kullanarak birden fazla (Multiple Digit) 7 Segment Display kullanımını anlatacağım. Öncelikle her zaman olduğu gibi neden böyle bir bilgiye ihtiyaç duyacağınızı açıklamak istiyorum. Normal şartlarda Arduino ile ya da herhangi bir mikrodenetleyici ile doğrudan 7 Segment Display sürebilebilirsiniz fakat bunu yapmanın avantajları olduğu gibi dezavantajları da vardır. Bu şekilde kullanırsanız her bir digit yani rakam için en az 7 pin kullanmanız gerekecektir algoritmanızı biraz daha iyileştirerek insan gözünün farkedemeyeceği hızda digitleri güncelleyerek pin sayısını biraz daha azaltabilirsiniz (Bu yöntem için de bir makale yayınlacağım) Bu yöntem ile tüm digitler için ortak 7 pin ve her digit için +1 pine ihtiaç duyacaksınız yani 4 haneli bir sayıyı göstermek için 7+4=11 pine ihtiyacınız olacak. Bu profesyonel bir proje için büyük bir israf çünkü sınırlı sayıdaki pinlerinizi sensörler okumak, motorlar sürmek veya dijital çıkışlar vermek içni kullanmanız gerekecek ve sadece display için bu kadar pin kullanmanız gereksiz olacaktır.

Bu durumda en iyi seçenek bir Display sürücü kullanmak ya da daha ucuz olan Shift Register kullanmak. Shift Register kullanarak onlarca yüzlerce basamaklı segment display’leri sürebilirsiniz. Tabii ki her bir rakam için bir adet Shift Register entegresine ihtiyacınız olaraktır. Genelde DotMatrix ve 8 Digit 7 Segment Display için Max7219 ve benzeri entegreler kullanılır bu entegreler mikrodenetleyici ile SPI arayüzü ile haberleşir ve kendi içlerinde 8×8=64 Bit RAM bulunur bu da tek bir entegrenin 64 piksellik DotMatrix’leri veya 8 digit displayleri sürmesini sağlar fakat fiyatları biraz daha pahalıdır dolayısı ile ufak projelerde Shift Register kullanmak daha uygundur. Biz bu projede 75HC595 entegresini kullanacağız bu entegre 8 Bit yani 1 Byte veriyi hafızasında tutabiliyor ve aynı anda 8 pine çıkış olarak verebiliyor içindeki Flip-Flop’lar sayesinde elektrik olduğu sürece güncellemeye gerek olmadan çıkış verisini koruyabiliyor bizim işimize yarayan özelliği de bu zaten mikro denetleyiciyi en az şekilde kullanarak display kullanmak. Shift Register’lar hakkında daha fazla bilgi için buradaki adresi ziyaret edin.

Şimdi aşağıdaki devreyi inceleyin

Devreyi kurduktan sonra Arduino Uno’ya aşağıdaki kodu yükleyin.

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
int number = 0;
unsigned long previousMillis = 0;
const long interval = 500;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  digitalWrite(13, HIGH);
  
  Serial.begin(9600);
}

void loop() {

unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
  previousMillis = currentMillis;
  number = number + 1;

  if(number == 100) number = 0;
  SayiYaz(number);
}

}
void SayiYaz(int sayi) {

int step1 = 0;
int step2 = 0;
String strnumber = String(sayi);

if(strnumber.length() == 2) {
  step1 = strnumber.substring(0,1).toInt();
  step2 = strnumber.substring(1,2).toInt();
}
else if(strnumber.length() == 1) {
  step1 = 0;
  step2 = strnumber.substring(0,1).toInt();
}

   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, myfnNumToBits(step2));
   shiftOut(dataPin, clockPin, LSBFIRST, myfnNumToBits(step1));
   digitalWrite(latchPin, HIGH);
}

byte myfnNumToBits(int someNumber) {
  switch (someNumber) {
    case 0:
      return B00000011;
      break;
    case 1:
      return B10011111;
      break;
    case 2:
      return B00100101;
      break;
    case 3:
      return B00001101;
      break;
    case 4:
      return B10011001;
      break;
    case 5:
      return B01001001;
      break;
    case 6:
      return B01000001;
      break;
    case 7:
      return B00011111;
      break;
    case 8:
      return B00000001;
      break;
    case 9:
      return B00001001;
      break;
    case 10:
      return B00010001; // Hexidecimal A
      break;
    case 11:
      return B11000001; // Hexidecimal B
      break;
    case 12:
      return B01100011; // Hexidecimal C or use for Centigrade
      break;
    case 13:
      return B10000101; // Hexidecimal D
      break;
    case 14:
      return B01100001; // Hexidecimal E
      break;
    case 15:
      return B01110001; // Hexidecimal F or use for Fahrenheit
      break;  
    default:
      return B01101101; // Error condition, displays three vertical bars
      break;   
  }
}

Umarım faydalı olmuştur.

Mustafa Tayyip Yetiş
Yazılım Geliştirici – Elektronik Meraklısı

0.0 Ort. (0% puan) - 0 oy

Bir Cevap Yazın

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