vehbiakdogan

Senior Sofware Developer

arduino tutorial

Arduino İle Sayı Tahmin Oyunu

Merhaba arkadaşlar bu yazımda arduino ile binary sayı tahmin oyunu yapmayı göstereceğim. Sayı tahmin oyununun temel mantığı 6 tane 6 bitlik binary sayıdan hangisinin en büyük olduğunu dip switch yardımıyla bulmak.

abi öncelikle 6 adet desimal sayı üretiyoruz ( 6 bitlik sayı olacağı için 0,63 aralığında). Daha sonra bu sayıları binary sisteme çevireceğiz ve ledlerde bu sayıları göstereceğiz. Ardından kullanıcının sayıları tahmin etmesi için dip switchin anahtarlarından birini on durumuna getirmesini bekleyeceğiz. Eğer kullanıcı doğru tahmin etmiş ise yeşil led yanlış tahmin etmiş ise kırmızı led yanacak.

Arduino İle Binary Sayı Tahmin Oyunu

Ödev aşağıdaki şekilde isteniyor.

Bu projenizde aşağıda kuralları verilen oyunu gerçekleyecek bir Arduino programı (sketch) yazmanız beklenmektedir.

  • Oyun A1 pinine bağlı geçici anahtara (pushbutton) basılması durumunda başlayacaktır. (Analog pinler de mikrodenetleyiciye dijital giriş sağlamak için kullanılabilir.)
  • Oyun başlayınca mikrodenetleyici tarafından 6 adet 6 bitlik rastgele tam sayı üretilecektir.

Arduino programlarında rastgele sayı üretimi için kullanılabilecek 2 fonksiyon vardır. Bunlardan birincisinin adı randomSeed, ikincisinin adı ise random dır. randomSeed fonksiyonu kendisine parametre olarak aldığı çekirdek değer sayesinde random fonksiyonunun her çağrılışında farklı bir rastgele sayı üretimini mümkün kılmaktadır.

Genellikle randomSeed setup, random ise loop içerisinde yer alır.

randomSeed(analogRead(A0)); deyimi randomSeed fonksiyonunun tipik bir kullanım şeklidir.

random(x,y) ise x (dâhil) ile y (hariç) aralığında rastgele bir tam sayı üretimi için kullanılır.

  • Mikrodenetleyici daha sonra üretilen bu 6 bitlik sayıların her birinin ikili karşılığını bulacak ve bu sayılar 2-7 aralığındaki dijital pinlere bağlı led’lerle temsil Örneğin rastgele sayılardan biri 58 iken (111010) 2, 3, 4 ve 6 numaralı dijital pinlere bağlı led’ler yanıyorken, 5 ve 7 numaralı dijital pinlere bağlı led’ler sönüyor olmalıdır. Her bir sayıyı temsil eden led kombinasyonu 5 saniye süresince aktif olmalıdır. Sonrasında tüm led’ler 1 saniye süresince söndürülmelidir ve aynı işlem 6 sayının her biri için tekrar edilmelidir.
  • Kullanıcı da bu esnada led’lerle temsil edilen sayılardan hangisinin en büyük olduğunu belirlemeye çalışmalıdır.
  • Kullanıcı daha sonra 8-13 aralığındaki dijital pinlere bağlı kalıcı bir anahtar grubunun 6 pozisyonunu kullanarak takip ettiği sayılardan en büyüğünün sıra numarasını ilgili kalıcı anahtar üzerinden mikrodenetleyiciye Örneğin 6 sayıdan en büyüğünün 3. sayı olduğunu düşünüyorsa 10 numaralı kalıcı anahtarı ON konumuna almalıdır. (Oyun başlatılmadan önce tüm kalıcı anahtarların OFF durumunda olduğuna dikkat edilmelidir.)
  • Kullanıcının tahmini doğru ise A2 pinine bağlı yeşil led, doğru değilse A3 pinine bağlı kırmızı led bir saniye süresince yanmalıdır ve sönmelidir.
  • Oyun kullanıcı A1 pinine bağlı geçici anahtara bastığında yeni rastgele sayılarla tekrar başlamalıdır. Oyun başlamadan önce tüm led’ler sönük olmalıdır.

Sayı Tahmin Oyunu Kodlar

int pushButtonPin = A1;
long pushButtonKontrol; 
int butonDurumu; // pushButton durumu 
int rastegeleSayilar[6]; // onluk tabanda üretilenler
int rastGeleSayilarIkilik[6][6]; // 2 lik tabana çevirilenler
bool oyunDurumu = false; // oyun başlama durumu 
int ledPinler[6] = {2,3,4,5,6,7};
int enBuyukIndis;
int anahtarPinler[6] = {8,9,10,11,12,13};
int dogruCevapPin = A2;
int yanlisCevapPin = A3;

void setup() {
  // put your setup code here, to run once:
  pinMode(pushButtonPin,INPUT);
  pinMode(dogruCevapPin,OUTPUT);
  pinMode(yanlisCevapPin,OUTPUT);
  Serial.begin(9600);
  pushButtonKontrol = millis();
  
  // ledleri çıkış, anahtarları giriş olarak ayarla 
  for(int i = 0; i<6;i++) {
    pinMode(ledPinler[i],OUTPUT);
    pinMode(anahtarPinler[i],INPUT_PULLUP);
    digitalWrite(anahtarPinler[i],HIGH);
    }
  
  
}

void loop() {
  // butondan değer okuyoruz. // 1 olduğunda oyun başlıyor.
   if(!oyunDurumu)  {
    // oyun başlamamış ise butona basılmasını bekle.
    if(digitalRead(pushButtonPin) == HIGH && (millis() - pushButtonKontrol)>1000) {
      pushButtonKontrol = millis();
      butonDurumu = digitalRead(pushButtonPin);
      oyunDurumu = true; // butona basıldıysa oyun başlasın.
      Serial.println("Oyun Başlıyor.");
    }else {
      butonDurumu = digitalRead(pushButtonPin);
      Serial.println("Oyun başlaması için butona basılması bekleniyor.");
    }
  }else {
   // oyun başlamış ise yapılacaklar.
   Serial.println("Oyun başladı.");
    rastGeleSayilarOlustur(rastegeleSayilar); // rastgele sayıları oluştur.
    sayilariIkilikTabanaCevir(rastegeleSayilar,rastGeleSayilarIkilik); // sayıları ikilik tabana çevir 

    sayilariVeIkilikDegerleriniYazdir(rastegeleSayilar,rastGeleSayilarIkilik); // test amaçlı sayıları ve ikilik değerleri yazdır. 
    sayilariLedlerleGoster(rastGeleSayilarIkilik,ledPinler); // sayıları sırayla ledlerde gösterdik. 

    int kullaniciSecimi = kullaniciSecimiAl(anahtarPinler); // kullanıcının seçtimini aldık.
    if(kullaniciSecimi == enBuyukIndis ) { // doğru tahmin yapmış ise yeşili yaktık.
      
      Serial.print("Tebrikler oyunu kazandınız.");
      digitalWrite(dogruCevapPin,1);
      digitalWrite(yanlisCevapPin,0);
      delay(1000);
      digitalWrite(dogruCevapPin,0);
      oyunDurumu = false;
      }else {
        // yanlış seçim yapmış ise kırmızıyı yaktık
        
        Serial.println("Malesef Kazanamadınız.");
        digitalWrite(dogruCevapPin,0);
        digitalWrite(yanlisCevapPin,1);
        delay(1000);
        digitalWrite(yanlisCevapPin,0);
        oyunDurumu = false;
        }   
   }
   
  
  
}

// rastgele sayı oluşturuyor ve oluşan sayılardan en büyüğünün indisini tutuyor.
void  rastGeleSayilarOlustur(int rastegeleSayilar[]) {
  int enBuyuk = -1;
  randomSeed(millis());
  Serial.println("Rastgele Sayılar Oluşturuluyor.");
  for(int i = 0;i<6;i++) {
    rastegeleSayilar[i] = random(0,64);
    if(enBuyuk<=rastegeleSayilar[i]) { enBuyukIndis = i; // en byüyük sayının indisini tutalım. 
      enBuyuk = rastegeleSayilar[i];
    }
  }
}

// oluşan sayıları ikilik tabana çeviriyor.
void sayilariIkilikTabanaCevir(int rastegeleSayilar[], int rastGeleSayilarIkilik[6][6]) {
  int cevirilenSayi;
  for(int i = 0; i<6;i++) {
    cevirilenSayi = rastegeleSayilar[i];
    int j = 0;
    while(cevirilenSayi >0) {
      rastGeleSayilarIkilik[i][j] = cevirilenSayi % 2;
      cevirilenSayi /=2;
      j++;
        
     }
    
  }
}

// görme amaçlı sayıları ve ikilik değerlerini seri monitöre yazıyor. 
void sayilariVeIkilikDegerleriniYazdir(int rastegeleSayilar[],int rastGeleSayilarIkilik[6][6]) {

    for(int i = 0;i<6;i++) {
      Serial.print("Onluk Değeri: ");
      Serial.print(rastegeleSayilar[i]);
      Serial.print(" ---- İkilik değeri: ");
      for(int j = 5; j>=0;j--) {
        Serial.print(rastGeleSayilarIkilik[i][j]);
        }
        Serial.println(" ");
      
      }
}

// sayıları ledlerde gösteriyor. 
void sayilariLedlerleGoster(int rastGeleSayilarIkilik[6][6], int ledPinler[]) { 
    for(int i = 0;i<6;i++) {
      
      for(int j = 0; j<6;j++) {
        digitalWrite(ledPinler[j],rastGeleSayilarIkilik[i][j]);
      }
        delay(5000);
        for(int a = 0; a<6;a++) digitalWrite(ledPinler[a],0);

        delay(1000);
        
      
      }
}

/* kullanıcı seçimini gösteriyor. 
* Bizim anahtarımız arızalı olduğu için ek işlemler yaptık. 
 *  kullanıcıdan sadece 1 tane 1 geleceğini garanti ettiğimiz için tek 1 gelinceye kadar sürekli dıp switchi kontrol ettik. 
 */
int  kullaniciSecimiAl(int anahtarPinler[]) {
  int secildiMi = 0;
    int secilenPin;
    while(secildiMi != 1) {
      secildiMi = 0;
      for(int i =0;i<6;i++) {
        if(digitalRead(anahtarPinler[i]) == 1) {
          secildiMi++;
          secilenPin = i;
          }
      }
      delay(1000);
    }
    return secilenPin;
}

Ödevimiz bu kadardı arkadaşlar.

Takıldığınız yerlerde Sitemde bulunan telefon numaramdan ulaşabilirsiniz.

Arduino