#10 PicoBricks ile Renk Projenizi Tanıyın

0
419

Elektronik sistemler üzerinde LED’ler sıklıkla kullanılır. Her butonun her seçeneğin yanında küçük LED’ler bulunabilmektedir. Tek bir LED’i değişik renklerde yanmasını sağlayarak birden fazla LED’in yaptığı işi tek bir LED ile yapılması sağlanabilmektedir. Bu türde çalışan LED’lere RGB LED denir. Adını Red, Green, Blue renk isimlerinin baş harflerinden alır. Bu LED’in diğer avantajı da 3 ana rengin karışımlarında da yanabilmesidir. Mor, turkuaz, turuncu…

Bu projede her programlama dilinde kullanılan rastgelelik durumunu öğreneceksin. Picobricks’in RGB LED, OLED ekran ve buton modülü ile eğlenceli bir oyun hazırlayacağız. 

Proje Detayları ve Algoritma

Projede inşa edeceğimiz oyun kullanıcının renkleri doğru veya yanlış bilmesi üzerine kurgulanacaktır. Picobricks üzerindeki RGB LED’de kırmızı, yeşil, mavi ve beyaz renklerden birisi rastgele olarak yanacak, aynı anda OLED ekranda yine bu dört renkten birisinin adı rastgele olarak yazılacaktır. Kullanıcı cevap hakkını kullanmak için 1,5 saniye içerisinde Picobricks’in butonuna basmalıdır. Oyun 10 kere tekrarlanacak, her tekrarda renkler eşlediğinde kullanıcı butona basarsa ya da eşleşmediğinde kullanıcı butona basmazsa 10 puan alacaktır. Renkler eşleşmediği halde kullanıcı butona basarsa 10 puan kaybedecektir. On tekrar sonunda kullanıcının aldığı puan OLED ekranda gösterilecektir. Kullanıcı dilerse butona basmayarak cevap hakkını kullanmayabilir. 

Bağlantı Şeması

Projenin MicroBlocks ile Kodlanması

Projede OLED ekran kullanacağımız için öncelikle OLED Graphics kütüphanesini programa eklemelisiniz. Daha sonra OLED ekranda ve RGB LED’de rastgele renkler oluşturmak için OLED_color ve RGB_color adında iki adet değişken oluşturmalısınız. Programın daha stabil çalışması için renklerin rastgele belirlenmesi işlemini bir fonksiyon oluşturup bu fonksiyonu çağırarak gerçekleştirebiliriz. Fonksiyonlar bir veya daha fazla işlem satırından oluşan kodların bir kod bloğu şeklinde yapılandırılması ile oluşturulur. Fonksiyonlar oluşturulduktan sonra programın herhangi bir yerinde sadece fonksiyon adı kullanılarak çağrılabilir. Fonksiyon oluşturmak için kod kategorileri bölümünde My Blocks butonuna tıklamalı, sonra Add a command block butonuna tıklamalı ve açılan Enter function name penceresinde oluşturacağınız fonksiyona isim vermelisin. Biz bu projede oluşturacağımız fonksiyona random_color adını verebiliriz. 

Fonksiyon oluşturduktan sonra kod yazma alanına define random_color bloğu gelecektir. Bu bloğun altına fonksiyon kodlarını yazabilirsin. random_color fonksiyonunda ilk olarak daha önce oluşturduğumuz OLED_color ve RGB_color değişkenlerine 1 ile 4 arasında rastgele sayı atıyoruz. Bunun için operators kategorisindeki random bloğunu kullanmalısın. Daha sonra değişkenlere atanan rastgele değerleri if bloğu ile karşılaştırarak RGB LED rengi ve OLED ekran yazılarını düzenlemelisin. 

random_color fonksiyonunu tanımladıktan sonra programımızı when started bloğunun altına yazabiliriz. Bu kod grubunda önce program başladığında çalışması gereken kodları yazmalısın. Başlangıç bloklarından sonra repeat 10 bloğunun içinde önceden oluşturduğun random_color fonksiyonunu çağırmalısın. 10 kere random_color çalıştıktan sonra programı bir süre bekletmeli, ekranı temizlemeli ve RGB LED’i kapatmalısın. Tüm bu işlemleri 10 kere tekrarlamalısın. Buraya kadar olan kodları çalıştırdığınızda RGB LED ve OLED ekranda 1,5 saniye aralıklarla 10 kere rastgele rengin belirdiğini göreceksin.

Bu aşamada OLED ekran ve RGB LED’deki renkler aynı olduğunda kullanıcının butona basması ve puan kazanması için Score ve x adında iki adet değişken daha oluştur. when bloğuna koşul olarak Picobricks’in butonuna basılması bloğunu ekle. Daha sonra iki tane if bloğu ile renk değişkenlerinin eşit olup olmadığını karşılaştır. Renkler eşitse skor değişkenini 10 arttır eşit değilse 10 azalt. Burada x değişkenini kullanma sebebimiz, sadece 1 kere puan artışı yapabilmek. and operatörünü içerisinde ikinci koşul olarak x değişkenini kullanmazsanız butona basıldığı süre boyunca Score değişkeni anlık olarak 10’ar 10’ar artacaktır. 

Butona basıldığında programın yapması gereken işlemleri düzenledikten sonra oyun bittiğinde ekranda kullanıcının skorunun yazılması için gerekli kodları ana programa eklemelisin. Score ve x değişkenlerinin başlangıç değerlerini “0” olarak belirt ve 10 tekrar içinde her tekrarda x değişkeninin değerini “0” olarak atayın. Bu sayede oyun içerisinde butona her basıldığında tek seferlik puan artışı gerçekleşecektir. 

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

 Proje Görseli

Proje Önerisi

Oyunu biraz daha zorlaştırarak eğlenceli hale getirebilirsin. Örneğin renklerin tekrarlanma süresini kısaltarak oyunu hızlandırabilirsin. Ya da kullanıcı yanlış yerde butona bastığında puan kaybetmesi yerine oyunu bitirip tekrar başlatabilirsin. 

 Projenin MicroPython Kodları


from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime
import urandom
import _thread
from ws2812 import NeoPixel

WIDTH  = 128                                            
HEIGHT = 64                                          
sda=machine.Pin(4)
scl=machine.Pin(5)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=1000000)
neo = NeoPixel(6, n=1, brightness=0.3, autowrite=False)

oled = SSD1306_I2C(128, 64, i2c)

button = Pin(10,Pin.IN,Pin.PULL_DOWN)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

oled.fill(0)
oled.show()

neo.fill(BLACK)
neo.show()

global button_pressed
score=0
button_pressed = False

def random_rgb():
    global ledcolor
    ledcolor=int(urandom.uniform(1,4))
    if ledcolor == 1:
        neo.fill(RED)
        neo.show()
    elif ledcolor == 2:
        neo.fill(GREEN)
        neo.show()
    elif ledcolor == 3:
        neo.fill(BLUE)
        neo.show()
    elif ledcolor == 4:
        neo.fill(WHITE)
        neo.show()

def random_text():
    global oledtext
    oledtext=int(urandom.uniform(1,4))
    if oledtext == 1:
        oled.fill(0)
        oled.show()
        oled.text("RED",45,32)
        oled.show()
    elif oledtext == 2:
        oled.fill(0)
        oled.show()
        oled.text("GREEN",45,32)
        oled.show()
    elif oledtext == 3:
        oled.fill(0)
        oled.show()
        oled.text("BLUE",45,32)
        oled.show()
    elif oledtext == 4:
        oled.fill(0)
        oled.show()
        oled.text("WHITE",45,32)
        oled.show()

def button_reader_thread():
    while True:
        global button_pressed
        if button_pressed == False:
            if button.value() == 1:
                button_pressed = True
                global score
                global oledtext
                global ledcolor
                if ledcolor == oledtext:
                    score += 10
                else:
                    score -= 10
        utime.sleep(0.01)

_thread.start_new_thread(button_reader_thread, ())

oled.text("The Game Begins",0,10)
oled.show()
utime.sleep(2)

for i in range(10):
    for j in range (10):
        random_text()
        random_rgb()
    button_pressed=False
    utime.sleep(1.5)
    oled.fill(0)
    oled.show()
    neo.fill(BLACK)
    neo.show()
utime.sleep(1.5)
oled.fill(0)
oled.show()
oled.text("Your total score:",0,20)
oled.text(str(score), 30,40)
oled.show()

Projenin Arduino C Kodları

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN        6 
#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500

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

int OLED_color;
int RGB_color;
int score = 0;
int x = 0;

int button;

void setup() {

  Wire.begin();  
  oled.init();                      
  oled.clearDisplay(); 

#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

  pixels.begin();
  pixels.clear(); 
}

void loop() {
  
  oled.clearDisplay();
  oled.setTextXY(3,1);              
  oled.putString("The game begins");
  pixels.setPixelColor(0, pixels.Color(0, 0, 0));
  pixels.show();
  delay(2000);
  oled.clearDisplay();
  
  for (int i=0;i<10;i++){
    
    random_color();
    pixels.show();
    
    button = digitalRead(10);
    if (button == 1){

      if(OLED_color==RGB_color & x==0){
        score=score+10;
        x=1;
      }
      if(OLED_color!=RGB_color & x==0){
        score=score-10;
        x=1;
      }
    }
    delay(2000);
    oled.clearDisplay();
    pixels.setPixelColor(0, pixels.Color(0, 0, 0));
    pixels.show();
    x=0;
  }

  String string_scrore=String(score);
  oled.clearDisplay();
  oled.setTextXY(2,5);              
  oled.putString("Score: ");
  oled.setTextXY(4,7);              
  oled.putString(string_scrore);
  oled.setTextXY(6,5);              
  oled.putString("points");

  delay(10000);
}

void random_color(){

  OLED_color = random(1,5);
  RGB_color = random(1,5);

    if (OLED_color == 1){
      oled.setTextXY(3,7);              
      oled.putString("red");
  }
    if (OLED_color == 2){
      oled.setTextXY(3,6);              
      oled.putString("green");
  }
    if (OLED_color == 3){
      oled.setTextXY(3,6);              
      oled.putString("blue");
  }
    if (OLED_color == 4){
      oled.setTextXY(3,6);              
      oled.putString("white");
  } 
    if (RGB_color == 1){
      pixels.setPixelColor(0, pixels.Color(255, 0, 0));
  }
    if (RGB_color == 2){
      pixels.setPixelColor(0, pixels.Color(0, 255, 0));
  }
    if (RGB_color == 3){
      pixels.setPixelColor(0, pixels.Color(0, 0, 255));
  }
    if (RGB_color == 4){
      pixels.setPixelColor(0, pixels.Color(255, 255, 255));
  }
}

CEVAP VER

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