7 Segment Display Kullanımı
Arduino ile 7 segment display ekranda 0’dan 9’a kadar rakamları göstermeyi öğreneceğiz.
7 segment display ekran, sayıların dijital olarak gösterileceği Arduino projelerinde kullanılabilir. Kullanımı basit olmasına rağmen bağlantı ve segment mantığı ilk başta biraz kafa karıştırıcı gelebilir.
7 segment display ekran, adından da anlaşılacağı üzere 7 adet LED segment kullanılarak rakamları dijital olarak göstermek için kullanılan bir gösterge elemanıdır.
Üzerindeki A, B, C, D, E, F ve G segmentleri farklı kombinasyonlarla yakılıp söndürülerek 0’dan 9’a kadar rakamlar elde edilir. Bazı modellerde ek olarak nokta için DP pini de bulunur.
Piyasada iki temel 7 segment display çeşidi bulunur: ortak anot ve ortak katot. Kullanım amacı aynıdır; fark, ortak pinlerin bağlantısı ve kodda segmentlerin yakılma mantığıdır.
Ortak anot display ekranlarda ortak pinler 5V’a bağlanır ve yakılmak istenen segmente LOW gönderilir. Ortak katot display ekranlarda ortak pinler GND’ye bağlanır ve yakılmak istenen segmente HIGH gönderilir.
Her segment bir LED olduğu için segment pinlerinde uygun seri direnç kullanılması önerilir. Dirençsiz bağlantı LED segmentlere veya Arduino pinlerine zarar verebilir.
Örnek bağlantı şemasında ortak anot bir 7 segment display kullanılmıştır. Bu nedenle ortak pinler 5V’a bağlanır.
Pin bağlantıları şu şekildedir: 1 numaralı bacak E segmenti için Arduino 2’ye, 2 numaralı bacak D segmenti için Arduino 3’e, 3 numaralı bacak 5V’a, 4 numaralı bacak C segmenti için Arduino 4’e, 5 numaralı bacak DP için Arduino 5’e, 6 numaralı bacak B segmenti için Arduino 6’ya, 7 numaralı bacak A segmenti için Arduino 7’ye, 8 numaralı bacak 5V’a, 9 numaralı bacak F segmenti için Arduino 8’e ve 10 numaralı bacak G segmenti için Arduino 9’a bağlanmıştır.
Kodda for döngüsü ile 0’dan 9’a kadar rakamlar üretilir ve her rakam RakamYaz() fonksiyonuna gönderilir.
RakamYaz() fonksiyonunda gelen rakam değeri switch-case yapısı ile kontrol edilir. Her rakam için gerekli segmentler yakılır ve gereksiz segmentler söndürülür.
Orijinal metinde fonksiyon adı açıklamada “RamakYaz” şeklinde yazılmıştı; kodda ve açıklamada doğru kullanım RakamYaz olarak düzenlendi.
int E = 2;
int D = 3;
int C = 4;
int DP = 5;
int B = 6;
int A = 7;
int F = 8;
int G = 9;
void setup() {
pinMode(E, OUTPUT);
pinMode(D, OUTPUT);
pinMode(C, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(B, OUTPUT);
pinMode(A, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
digitalWrite(DP, HIGH); // Ortak anot için nokta kapalı
}
void loop() {
for (int i = 0; i <= 9; i++) {
RakamYaz(i);
delay(500);
}
}
void RakamYaz(int rakam) {
switch (rakam) {
case 0:
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
break;
case 1:
digitalWrite(E, HIGH);
digitalWrite(D, HIGH);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 2:
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, HIGH);
digitalWrite(B, LOW);
digitalWrite(A, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, LOW);
break;
case 3:
digitalWrite(E, HIGH);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, LOW);
break;
case 4:
digitalWrite(E, HIGH);
digitalWrite(D, HIGH);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 5:
digitalWrite(E, HIGH);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(B, HIGH);
digitalWrite(A, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 6:
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(B, HIGH);
digitalWrite(A, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 7:
digitalWrite(E, HIGH);
digitalWrite(D, HIGH);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 8:
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 9:
digitalWrite(E, HIGH);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
}
}
const int E = 2;
const int D = 3;
const int C = 4;
const int DP = 5;
const int B = 6;
const int A = 7;
const int F = 8;
const int G = 9;
const int segmentler[] = {A, B, C, D, E, F, G};
// Ortak anot display için LOW segmenti yakar, HIGH söndürür.
const byte rakamlar[10][7] = {
// A, B, C, D, E, F, G
{LOW, LOW, LOW, LOW, LOW, LOW, HIGH}, // 0
{HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH}, // 1
{LOW, LOW, HIGH, LOW, LOW, HIGH, LOW }, // 2
{LOW, LOW, LOW, LOW, HIGH, HIGH, LOW }, // 3
{HIGH, LOW, LOW, HIGH, HIGH, LOW, LOW }, // 4
{LOW, HIGH, LOW, LOW, HIGH, LOW, LOW }, // 5
{LOW, HIGH, LOW, LOW, LOW, LOW, LOW }, // 6
{LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH}, // 7
{LOW, LOW, LOW, LOW, LOW, LOW, LOW }, // 8
{LOW, LOW, LOW, LOW, HIGH, LOW, LOW } // 9
};
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(segmentler[i], OUTPUT);
}
pinMode(DP, OUTPUT);
digitalWrite(DP, HIGH);
}
void loop() {
for (int rakam = 0; rakam <= 9; rakam++) {
rakamYaz(rakam);
delay(500);
}
}
void rakamYaz(int rakam) {
for (int i = 0; i < 7; i++) {
digitalWrite(segmentler[i], rakamlar[rakam][i]);
}
}
Bu sürümde segment durumları dizi halinde tanımlandı. Böylece her rakam için tekrar eden digitalWrite() satırları daha düzenli hale getirildi.
// Ortak katot 7 segment display kullanıyorsanız,
// LOW ve HIGH değerleri ters çalışır.
// Bu durumda rakamlar dizisindeki LOW değerlerini HIGH,
// HIGH değerlerini LOW olacak şekilde ters çevirmelisiniz.
Bu sayfadaki kodlar ortak anot bağlantı mantığına göre hazırlanmıştır. Ortak katot display kullanıyorsanız segmentleri yakma/söndürme mantığını ters çevirmeniz gerekir.