Klasik Kara Şimşek efektini heyecanlı bir refleks oyununa dönüştürmeye hazır mısınız? Bu yazımızda, Arduino Uno, birkaç LED ve bir buton kullanarak hem temel elektronik bileşenlerin mantığını kavrayacağımız hem de çok eğleneceğimiz "Yakala Beni" projesini adım adım kodlayacağız. Özellikle atölyelerimizde genç maker'ların en sevdiği uygulamalardan biri olan bu oyunu evde de kolayca inşa edebilirsiniz!

Gerekli malzemeler

  • Gerekli Malzemeler
  • Bu projeyi hayata geçirmek için aşağıdaki malzemelere ihtiyacınız olacak:
  • Arduino Uno R3 (veya uyumlu bir kart)
  • Breadboard
  • 5 adet LED (Ortadaki LED'i farklı bir renk seçmeniz oyunu kolaylaştırır. Örneğin: 4 Kırmızı, 1 Yeşil/Mavi)
  • 5 adet 220Ω veya 330Ω Direnç
  • 1 adet Tactile Buton
  • 1 adet Buzzer
  • Erkek-Erkek Jumper Kablolar

Adım adım yapım

1. 1. Bölüm

Nasıl Oynanır? Oyunu başlatmak için Arduino'ya enerji verin.

2. 2. Bölüm

Işık, LED'ler üzerinde sağa ve sola doğru kaymaya başlar (bkz. Görsel: 'KARA ŞİMŞEK EFEKTİ').

3. 3. Bölüm

Dikkatli olun! Işık tam ortadaki büyük yeşil LED'e (bkz. Görsel: 'HEDEF! YAKALA!') geldiği anda butona basın.

4. 4. Bölüm

Başarılı Atış: Doğru zamanda basarsanız, Arduino başarılı bir melodi çalar (bkz. Görsel: '✓ BAŞARILI!') ve bir sonraki turda ışığın kayma hızı artar (bkz. Görsel: 'HIZ: SEVİYE 3').

5. 5. Bölüm

Başarısız Atış: Yanlış zamanda basarsanız, başarısız bir melodi çalar (bkz. Görsel: '✗ TEKRAR DENE!'), hız başlangıç seviyesine düşer ve oyun yeniden başlar.

6. 6. Bölüm

Butona basılı tuttuğunuz sürece ışık kaymaya devam etmez, parmağınızı çektiğinizde oyun devam eder.

Proje kodu

Kodu Arduino IDE'ye aktarın. Pin numaralarını kendi devrenize göre kontrol ettikten sonra karta yükleyin.

Arduino / C++
/*
  Arduino "Yakala Beni" Işık Takip / Refleks Oyunu
  Blog Yazısı ve Görsel Tamamlayıcı Kod
*/

const int leds[] = {3, 4, 5, 6, 7}; // LED'lerin bağlı olduğu pinler
const int numLeds = 5;              // Toplam LED sayısı
const int targetLedIndex = 2;       // Hedef LED'in dizideki indeksi (Diziler 0'dan başlar, 5 numaralı pin 3. elemandır)

const int buttonPin = 2;            // Butonun bağlı olduğu pin
const int buzzerPin = 8;            // Buzzer'ın bağlı olduğu pin

int currentLed = 0;                 // Şu an yanan LED'in indeksi
int direction = 1;                  // 1: Sağa, -1: Sola kayma yönü
unsigned long lastUpdate = 0;       // Işığın son güncelleme zamanı
int currentSpeed = 300;             // Başlangıç hızı (milisaniye)

void setup() {
  // LED pinlerini çıkış olarak ayarla
  for (int i = 0; i < numLeds; i++) {
    pinMode(leds[i], OUTPUT);
  }
  
  // Butonu dahili PULLUP direnci ile giriş olarak ayarla (Basıldığında LOW okur)
  pinMode(buttonPin, INPUT_PULLUP);
  // Buzzer pinini çıkış olarak ayarla
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  // --- Buton Kontrolü ---
  // Butona basıldığını (LOW) kontrol et
  if (digitalRead(buttonPin) == LOW) {
    if (currentLed == targetLedIndex) {
      // --- Başarılı Atış ---
      digitalWrite(leds[currentLed], HIGH); // Hedef LED'i yanık bırak
      playWinSound();                      // Kazanma melodisi
      
      // Hızı artır (Bekleme süresini düşür)
      currentSpeed = currentSpeed - 40; 
      if (currentSpeed < 40) currentSpeed = 40; // Maksimum hız sınırı (40ms)
      delay(1000);                         // 1 saniye bekle
    } else {
      // --- Başarısız Atış ---
      digitalWrite(leds[currentLed], HIGH); // Yanlış yanan LED'i yanık bırak
      playFailSound();                     // Kaybetme melodisi
      
      // Hızı başlangıç seviyesine sıfırla
      currentSpeed = 300; 
      delay(1000);                         // 1 saniye bekle
    }
    
    // Parmağınızı butondan çekene kadar bekle (Buton LOW olduğu sürece boş döner)
    while (digitalRead(buttonPin) == LOW);
  }

  // --- Işık Kaydırma İşlemi ---
  // delay() yerine millis() kullanarak butona basmayı gecikmesiz algılar
  if (millis() - lastUpdate > currentSpeed) {
    lastUpdate = millis(); // Zamanı güncelle

    // Mevcut yanan LED'i söndür
    digitalWrite(leds[currentLed], LOW);

    // Bir sonraki LED'e geç
    currentLed += direction;
    
    // Kenarlara çarpınca yön değiştir
    if (currentLed >= numLeds - 1) {
      currentLed = numLeds - 1; // Maksimum indeksi aşma
      direction = -1;           // Sola dön
    } else if (currentLed <= 0) {
      currentLed = 0;           // Minimum indeksin altına düşme
      direction = 1;            // Sağa dön
    }

    // Yeni LED'i yak
    digitalWrite(leds[currentLed], HIGH);
  }
}

// --- Ses Efektleri ---

// Kazanma melodisi
void playWinSound() {
  tone(buzzerPin, 1000, 150); // 1000Hz, 150ms
  delay(150);
  tone(buzzerPin, 1500, 150); // 1500Hz, 150ms
  delay(150);
  tone(buzzerPin, 2000, 300); // 2000Hz, 300ms
}

// Kaybetme melodisi
void playFailSound() {
  tone(buzzerPin, 300, 400);  // 300Hz, 400ms
  delay(400);
  tone(buzzerPin, 150, 600);  // 150Hz, 600ms
}
4görüntülenme
0beğeni
0yorum
Atölyeye katıl →
Topluluk

Yorumlar

0

İlk yorumu siz yazın.

Yorum yap