Ledlerle Binary Hesap Makinesi Yapımı

Merhaba arkadaşlar bugün bir bilgisayar mühendisliği öğrencisi olarak biraz daha alanımıza yönelik bir proje paylaşmak istedim sizlerle. Aslında yaptığımız şey tam bir binary hesap makinesinden ziyade girilen decimal (günlük yaşantımızda kullandığımız onluk sayı tabanı) sayıları ve bunların toplamını binary olarak gösteren basit bir sistem. Arduino serial monitörü açacak (Kodu derleyip upload ettikten sonra IDE’den Tools > Serial Monitor e tıklayarak serial monitörü açabilirsiniz) sayıları klavyeden girecek ve sayıların devrenizde yandığını göreceksiniz. Çalışan uygulama sayfanın en altında video olarak mevcut. Örnek olarak sadece toplama işlemi yapılmıştır aynı mantık ve hatta üzerinde çok ufak oynamalar sayesinde aynı kod ile çıkarma işlemi de yapılabilir.

Bunun için ihtiyacınız olan şeyler:
1 Adet Arduino Uno
1 Adet Breadboard
12 Adet LED (ben projemde 3 farklı renkte kullandım)
12 Adet 220 Ohm Direnç
Çok sayıda Erkek-Erkek Jumper Kablo

Binary Hesap Makinesi Devresi

 

Yukarıda görmüş olduğunuz devreyi kuruyoruz arkadaşlar burada kabloları biraz karışık çizdiğimin farkındayım ancak inanın yapması oldukça kolay sadece insan kağıda aktarırken problem yaşayabiliyor. Aslında yapması karışık göründüğü kadar basit sadece 12 adet ledi 12 farklı digital porta bağlıyorsunuz arkadaşlar. Ben projemde kırmızı ledlerimle birinci girilen sayıyı, sarı ledlerimle ikinci girilen sayıyı, yeşil ledlerimle ise bu sayıların toplamını binary olarak gösterdim. Yanan ledler bildiğiniz gibi biri, sönük ledler ise sıfırı sembolize ediyor. Yani örnek bir işlem yapacak olursak

7          +          4          =          11
Kırmızı Ledler   Sarı Ledler     Yeşil Ledler
0111                 0100                1011

O zaman sağdan sola sırayla kırmızı ledlerimize sıfırdan başlayarak numara verecek olursak Kırmızı3 sönük, Kırmızı2, Kırmızı1 ve Kırmızı0 yanık olacaktır. Burada aslında ikilik sayı sisteminde değerimizi çarpacağımız taban üslerini ledlere kod olarak verdim. 7 = 0.23+1.22+1.21+1.20. Bit genişliği dörtken (yani siz yan yana dört led (veya rakam) ile bir değer sembolize etmeye çalışırken) sayı tabanınızda iki olduğu için 24 farklı olasılık vardır yani 4 bit genişliğinde binary sayı sisteminde maksimum 16 değer gösterilebilir. Daha büyük değerler göstermeye çalıştığınızda overflow olur. İlk değerimize sıfırı atayacağımız için sistemimizde 0-15 aralığındaki değerleri gösterebileceğiz. Ancak şöyle bir sorun var ki biz işlemcilerin hızına yetişemediğimiz ve void loop fonksiyonu sonsuza kadar tekrar eden bir fonksiyon olduğu için klavyeden bir değer almaya kalktığımızda biz işlemcinin hızına yetişemiyoruz ve işlemci kendisi için uzun bir süre geçtiğinden dolayı değer atamasını istediğimiz değişkene kendi otomatik olarak sıfır atıyor. İşte tam olarak bu sebepten biz bu sistemde sıfırı da gösteremeyeceğiz. Çünkü yazdığımız kodun içinde
do{
sayi1 = Serial.parseInt();
}while(sayi1==0);
şeklinde bir komut kullanıyoruz. Bu komut sayesinde bilgisayar sizin hızınıza düşmese bile sonsuz kere aynı işlemi siz sayı girene kadar yapıyor. Böylece siz sayı atayana kadar burayı geçemiyor. Sadece bu do-while döngüsü yüzünden siz değişkeninize sıfır atamak isterseniz atayamıyorsunuz. Bunun dışında sisteminizde 0-16 arasındaki tüm değerleri gösterebilirsiniz. “Peki ya 16 ve daha büyük bir değer yada negatif sayıları göstermek istersek ?” diyorsanız işte o zaman overflow yapmış oluyorsunuz ve ledlerimiz yanıp yanıp sönerek size bu hesaplamanın ledler üzerindeki gösteriminin hatalı olacağını bildiriyor.

Sistemimizin kodlanmasına gelirsek kullanıcıdan alacağımız sayi1 için kırmızı dört ledi, sayi2 için dört sarı ledi ve sonuç için dört yeşil ledi değişkenin değerine göre if döngüsü içinde yakıyorum. Kodlarınızı derleyip upload ettikten sonra Serial Monitörden sayılarınızı girip, sonucu görebilirsiniz.
Lütfen aşağıdaki kodları inceleyin.


Kod:

#define kirmizi3 2
#define kirmizi2 3
#define kirmizi1 4
#define kirmizi0 5
#define sari3 6
#define sari2 7
#define sari1 8
#define sari0 9
#define yesil3 10
#define yesil2 11
#define yesil1 12
#define yesil0 13

void setup()
{
Serial.begin(9600);
pinMode(kirmizi3, OUTPUT);
pinMode(kirmizi2, OUTPUT);
pinMode(kirmizi1, OUTPUT);
pinMode(kirmizi0, OUTPUT);
pinMode(sari3, OUTPUT);
pinMode(sari2, OUTPUT);
pinMode(sari1, OUTPUT);
pinMode(sari0, OUTPUT);
pinMode(yesil3, OUTPUT);
pinMode(yesil2, OUTPUT);
pinMode(yesil1, OUTPUT);
pinMode(yesil0, OUTPUT);
}
void loop()
{
int sayi1,sayi2;
Serial.println("1.Sayiyi Giriniz:");
do{
sayi1 = Serial.parseInt();
}while(sayi1==0);
Serial.println(sayi1);
if (sayi1==1)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
}
if (sayi1==2)
{
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
}
if (sayi1==3)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
}
if (sayi1==4)
{
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,LOW);
}
if (sayi1==5)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,LOW);
}
if (sayi1==6)
{
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,LOW);
}
if (sayi1==7)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,LOW);
}
if (sayi1==8)
{
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1==9)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1==10)
{
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1==11)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1==12)
{
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1==13)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1==14)
{
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1==15)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
}
if (sayi1<1||sayi1>15)
{
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
delay(100);
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
delay(100);
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
delay(100);
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
delay(100);
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
delay(100);
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
delay(100);
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
delay(100);
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
delay(100);
digitalWrite(kirmizi0,HIGH);
digitalWrite(kirmizi1,HIGH);
digitalWrite(kirmizi2,HIGH);
digitalWrite(kirmizi3,HIGH);
}
Serial.println("2.Sayiyi Giriniz:");
do{
sayi2 = Serial.parseInt();
}while(sayi2==0);
Serial.println(sayi2);
if (sayi2==1)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
}
if (sayi2==2)
{
digitalWrite(sari0,LOW);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
}
if (sayi2==3)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
}
if (sayi2==4)
{
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,LOW);
}
if (sayi2==5)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,LOW);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,LOW);
}
if (sayi2==6)
{
digitalWrite(sari0,LOW);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,LOW);
}
if (sayi2==7)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,LOW);
}
if (sayi2==8)
{
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,HIGH);
}
if (sayi2==9)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,HIGH);
}
if (sayi2==10)
{
digitalWrite(sari0,LOW);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,LOW);
digitalWrite(sari3,HIGH);
}
if (sayi2==11)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,LOW);
digitalWrite(sari3,HIGH);
}
if (sayi2==12)
{
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
}
if (sayi2==13)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,LOW);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
}
if (sayi2==14)
{
digitalWrite(sari0,LOW);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
}
if (sayi2==15)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
}
if (sayi2<1||sayi2>15)
{
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
delay(100);
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
delay(100);
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
delay(100);
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
delay(100);
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
delay(100);
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
delay(100);
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
delay(100);
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
delay(100);
digitalWrite(sari0,HIGH);
digitalWrite(sari1,HIGH);
digitalWrite(sari2,HIGH);
digitalWrite(sari3,HIGH);
}
int sonuc = sayi1+sayi2;
Serial.print("Sonuc: ");
Serial.println(sonuc);
if (sonuc==1)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
}
if (sonuc==2)
{
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
}
if (sonuc==3)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
}
if (sonuc==4)
{
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,LOW);
}
if (sonuc==5)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,LOW);
}
if (sonuc==6)
{
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,LOW);
}
if (sonuc==7)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,LOW);
}
if (sonuc==8)
{
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,HIGH);
}
if (sonuc==9)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,HIGH);
}
if (sonuc==10)
{
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,HIGH);
}
if (sonuc==11)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,HIGH);
}
if (sonuc==12)
{
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
}
if (sonuc==13)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
}
if (sonuc==14)
{
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
}
if (sonuc==15)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
}
if (sonuc<1||sonuc>15)
{
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
delay(100);
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
delay(100);
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
delay(100);
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
delay(100);
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
delay(100);
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
delay(100);
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
delay(100);
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
delay(100);
digitalWrite(yesil0,HIGH);
digitalWrite(yesil1,HIGH);
digitalWrite(yesil2,HIGH);
digitalWrite(yesil3,HIGH);
}
delay(5000);
digitalWrite(kirmizi0,LOW);
digitalWrite(kirmizi1,LOW);
digitalWrite(kirmizi2,LOW);
digitalWrite(kirmizi3,LOW);
digitalWrite(sari0,LOW);
digitalWrite(sari1,LOW);
digitalWrite(sari2,LOW);
digitalWrite(sari3,LOW);
digitalWrite(yesil0,LOW);
digitalWrite(yesil1,LOW);
digitalWrite(yesil2,LOW);
digitalWrite(yesil3,LOW);
}

Kodla ve Sevgiyle Kalın…

About Author

Sertan Deniz Saygılı

Sakarya Üniversitesi Bilgisayar Mühendisliği Öğrencisi - Arduino Bağımlısı

Leave a Reply