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 "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
}
Yorumlar
İlk yorumu siz yazın.