Merhaba arkadaşlar.
Aslında bu dersimizin amacı fonksiyon ve dizileri daha iyi kavramaktır. Çünkü bu dersimizde yeni bir komut ya da fonksiyon öğrenmeyeceğiz, sadece Temel Arduino Dersleri kategorisinde öğrendiğimiz Diziler ve Fonksiyonları kullanarak uygulamamızı yapacağız.
Öncelikle hangi rakamda hangi çıkışlar aktif olacak onu belirleyelim.
Bunu bir tablo yardımı ile öğreneceğiz. Ben aşağıdaki gibi bir tablo oluşturdum;
Yukarıdaki tabloda kırmızı ile işaretlenen alan 7 segment display pinleridir, pembe ile işaretlenen alan ise rakamlardır. Yeşil ile işaretlenen alanlar ise soldaki belirtilen hangi rakamda, displayin hangi digitlerinin aktif olacağını belirtir. Rakam sütunundaki rakamı yazmak için, displayde yanacak olan harfler “1” rakamı ile, sönecek olan harfler “0” rakamı ile gösterilmiştir.
Örneğin 0 rakamı satırındaki tüm 1 ve 0 değerlerini bir binary sayı olarak farzedersek bu binary sayı binary 1111110 olacaktır. Bu binary sayının decimal karşılığı ise DEC sütununda belirtildiği üzere 126 sayısıdır.
Sıfırdan itibaren her rakamın decimal karşılığını bir byte dizisine atayalım;
1 |
byte rakamlar[] = {126, 48, 109, 121, 51, 91, 95, 112, 127, 123}; // Rakamlar dizisi |
Yukarıdaki kodda rakamlar dizisinin her elemanı sıfırdan başlayarak 9’a kadar bir rakamı temsil eder.
Şimdi Setup yapısı ayarlarında yukarıdaki tabloda PIN satırında yazılı tüm pinleri çıkış olarak ayarlayalım;
1 2 3 4 5 |
void setup() { for(int i = 2; i<9; i++){ pinMode(i, OUTPUT); // 2 ile 9 arasındaki pinleri çıkış yap } } |
Şimdi gelelim asıl meseleye. Display fonksiyonumuzu yazacağız. Bu fonksiyonumuz 0 ile 9 arasında byte türü parametre alacaktır. Ardından biz foksiyona gönderdiğimiz değeri displaye yazacaktır.
Fonksiyonumuz byte türü parametre alacak ve geriye değer döndürmeyecek. O halde sözdizimi şu şekilde olacaktır;
1 2 3 |
void display(byte gelen){ } |
Ardından bu fonksiyonumuzun içerisine rakamları yazdırmak için bir döngü oluşturacağız. Gelen her bir sayıyı bitlerine ayıracağız ve bitSet() fonksiyonu ile her bir bitin değerini digitalWrite() fonksiyonu ile çıkışa yazacağız.
1 2 3 4 5 6 7 |
void display(byte gelen){ // gelen değeri al for(int i = 2, j = 0; i<9; i++, j++){ // döngüye gir // her bir döngüde i çıkışına, // gelen değerin rakamlar dizisindeki karşılığının j bitini yaz digitalWrite(i,bitRead(rakamlar[gelen],j)); } } |
Şimdi ise loop yapısından fonksiyonumuza, displayde göstereceğimiz rakamı parametre göndererek çağıralım;
1 2 3 |
void loop(){ display(5); // displaye 5 rakamını yaz } |
Dilersek bir döngü ile de, displayimize 0’dan 9’a kadar olan sayılarımızı bir saniye aralıklarla yazdırabiliriz. 0’dan 9’a kadar tüm rakamları 1 saniye aralıklarla displaye yazdıran döngümüz;
1 2 3 4 5 6 |
void loop() { for(byte i = 0; i < 10; i++){ display(i); delay(1000); } } |
Kodlarımızın tamamı şu şekilde olacak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
byte rakamlar[] = {126, 48, 109, 121, 51, 91, 95, 112, 127, 123}; // Rakamlar dizisi void setup() { for (int i = 2; i < 9; i++) { pinMode(i, OUTPUT); // 2 ile 9 arasındaki pinleri çıkış yap } } void loop() { for (int i = 0; i < 10; i++) { display(i); delay(1000); } } void display(byte gelen) { for (int i = 2, j = 0; i < 9; i++, j++) { digitalWrite(i, bitRead(rakamlar[gelen], j)); } } |
Kodlarımızı arduinomuza yükleyip, aşağıdaki devreyi kuralım. Devrede ortak katodlu 7 segment display kullanılmıştır. Devredeki tüm dirençler 330R değerindedir.
Devreyi çalıştırınca 0-9 arası rakamların 1 saniye aralıklarla displaye yazdırdığını görürüz.