#7 Tepkini PicoBricks ile Göster!

0
529

Şimdi de dikkat ve refleks geliştiren bir oyun hazırlayacağız. Hızlı hareket etmek ve dikkatin uzun süre sağlanabilmesi çocukların önemli gelişimsel özelliklerindendir. Okul öncesi ve ilkokul dönemindeki çocukların dikkat sürelerini ve reflekslerini artırıcı etkinlikler yapması çocukların hoşlarına gittiği gibi ebeveynlerinin ve öğretmenlerinin de istediği bir durumdur. Hazırlayacağımız elektronik sistemi dikkat artırıcı ve refleks geliştirici bir oyun olacak. Projeyi bitirdikten sonra siz de arkadaşlarınla yarışabilirsin 🙂

Bu projede her programlama dilinde kullanılan rastgelelik durumunu öğreneceksin. Picobricks ile OLED ekran, Buton-LED ve Buzzer modülünü kullanarak elektronik bir sistem geliştireceğiz.

Proje Detayları ve Algoritma

Picobricks açılır açılmaz bir zamanlayıcı çalışmaya başlar. Bu zamanlayıcı ile saniyenin binde 1’ini ölçebiliriz. Saniyenin binde birine milisaniye denir. Zamanlayıcılar günlük yaşamda birçok elektronik sistemde kullanılırlar. Zaman ayarlı aydınlatmalar, fırınlar, ütüler, mutfak robotları…

Projemiz çalışmaya başladığında OLED ekranda karşılama mesajı görüntüleyeceğiz. Ardından kullanıcıya oyuna başlaması için yapması gerekeni ekrana yazdıracağız. Oyuna başlayabilmek için butona basılacak butona basıldıktan sonra 3’ten geriye doğru ekranda sayılarak oyuncunun hazırlanmasını isteyeceğiz. Geri sayımın bitiminden sonra 2-10 saniye arasında rastgele bir süre içinde kırmızı LED yanacak. Kırmızı LED yandıktan sonra hemen zamanlayıcıyı sıfırlayacağız. Tekrar butona basılır basılmaz zamanlayıcıyı ölçeceğiz. Elde ettiğimiz bu değer milisaniye cinsinden olacak. Oyuncunun tepki süresi olarak bu değeri ekranda göstereceğiz.

Bağlantı Şeması

Projenin MicroBlocks ile Kodlanması

OLED Ekran kütüphanesi ekledikten sonra Picobricks başlar başlamaz ekranda yönerge ifadelerine yer verelim.


Kullanıcı Picobricks’in butonuna bastığında 3,2,1 diye geri sayması için Control kategorisinden for i in 10 döngüsünü alıyor 10 sayısını 3 olarak ayarlıyoruz. Bu döngü, 1 den 3 e kadar i değişkenini her turda bir artırarak 3 defa içindeki kodu çalıştıracaktır.Her geçen saniye ekranı temizleyip 3…,2…,1… yazdırmak için OLED ekran bloklarını ve bekleme bloğunu görseldeki gibi for bloğunun içine yerleştirmelisin.

Data kategorisinden bloğunu write bloğundaki hello alanına yerleştir, micro yazısını sil, blocks alanına ise çıkarma operatörünü yerleştir. Çıkarma işlemi olarak 4 – yap. 

for döngüsünün hemen altına ekranı temizleyip oyunun başladığını bildiren bloğu ekliyoruz. Rastgele bekleme süresini ayarlamak için bekleme bloğuna random 1 to 10 bloğunu yerleştir. İlk alanına 1000 yaz, ikinci alanına ise 5000 yaz. Bu komut 1 saniye ile 5 saniye aralığında rastgele bir zaman üretecektir.  Hemen ardından kırmızı LED’i açacak kodu ekle. Input kategorisinden reset timer bloğu ile zamanlayıcıyı sıfırlıyoruz. Control kategorisindeki wait until bloğuna PicoBricks button bloğunu ekleyerek butona basılana kadar beklenilmesini sağlıyoruz.


Butona basıldığında timer değerini ölçmek için score değişkeni oluştur. wait until bloğunun altına score değişkenine timer değer bloğunu yerleştir. Ardından kırmızı LED’i söndürüp 200 ms lik beep yap. Son olarak ekranı temizleyin. Oyuna yeniden başlamak için Picoboard üzerindeki reset düğmesine basılmasını ifade edip tepki süresini ekrana yazıdırıyoruz. Keyifli oyunlar.

Projenin MicroBlocks kodlarına erişmek için tıkla.

Projenin Görselleri

Oyuna yeniden başlayabilmek için Picobricks’in resetlenmesi gerekiyor. Sen de oyuna yeniden başlamak için butona yeniden basılmasını isteyecek şekilde projeni geliştirebilirsin. Ayrıca oyun sonunda en yüksek score ve son scorer’un da ekrana yazdırılmasını sağlayabilirsin.

Proje Önerisi

Oyuna yeniden başlayabilmek için Picobricks’in resetlenmesi gerekiyor. Sen de oyuna yeniden başlamak için butona yeniden basılmasını isteyecek şekilde projeni geliştirebilirsin. Ayrıca oyun sonunda en yüksek score ve son scorer’un da ekrana yazdırılmasını sağlayabilirsin.

Projenin MicroPython Kodları

from machine import Pin, I2C, Timer
from ssd1306 import SSD1306_I2C
import utime
import urandom

WIDTH  = 128                                            
HEIGHT = 64

sda=machine.Pin(4)
scl=machine.Pin(5)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=1000000)
oled = SSD1306_I2C(128, 64, i2c)
button = Pin(10,Pin.IN,Pin.PULL_DOWN)
led = Pin(7,Pin.OUT)

pressed = False

oled.fill(0)
oled.show()
oled.text("Press the button",0,10)
oled.text("TO START!",25,35)
oled.show()

def button_handler(pin):
    global pressed
    if not pressed:
        timer_reaction= utime.ticks_diff(utime.ticks_ms(), timer_start)
        oled.fill(0)
        oled.show()
        oled.text("Your Time",15,30)
        oled.text(str(timer_reaction), 20, 40)
        oled.show()

led.value(0)
utime.sleep(urandom.uniform(1,5))
led.value(1)
timer_start=utime.ticks_ms()

button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)

Projenin Arduino C Kodları

#include <Wire.h>
#include "ACROBOTIC_SSD1306.h"

int buzzer = 20;
int button = 10;
int led = 7;
int La = 440;

int old_time = 0;
int now_time = 0;
int score = 0;
String string_score ;

void setup()
{
  Wire.begin();	
  oled.init();                      
  oled.clearDisplay();              

  pinMode(led,OUTPUT);
  pinMode(buzzer,OUTPUT);
  pinMode(button,INPUT);
Serial.begin(9600);
}

void loop()
{
  oled.setTextXY(3,0);              
  oled.putString("Press the button");
  oled.setTextXY(5,4);              
  oled.putString("TO START");
  
  if (digitalRead(button) == 1){

    for (int i=3;i>0;i--){

      String string_i = String(i);
      oled.clearDisplay(); 
      oled.setTextXY(4,8);  
      oled.putString(string_i);
      delay(1000);
      
    }
      
    oled.clearDisplay();
    oled.setTextXY(4,6);
    oled.putString("GO!!!");

    int random_wait = random(1000, 5000);
    delay(random_wait);

    digitalWrite(led, HIGH);
    old_time=millis();

    while(!(digitalRead(button) == 1)){

      now_time=millis();
      
      score = now_time-old_time;
      string_score = String(score);

    }
      digitalWrite(led, HIGH);
      tone(buzzer, La); 
      delay (200);
      noTone(buzzer);

      oled.clearDisplay();
      oled.setTextXY(1,4);
      oled.putString("Press the");
      oled.setTextXY(2,3);
      oled.putString("RESET BUTON");
      oled.setTextXY(3,3);
      oled.putString("to Repeat!");

      oled.setTextXY(6,3);
      oled.putString("Score: ");
      oled.setTextXY(6,9);
      oled.putString(string_score);
      oled.setTextXY(6,13);
      oled.putString(" ms");
      Serial.println(score);
      delay(10000);
      oled.clearDisplay();
  }
}

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz