#15 Gece Gündüz

Okulda oynadığınız Gece Gündüz oyununu elektronik olarak oynamaya ne dersin? Öğretmen gece dediğinde kafamızı öne eğip masanın üzerindeki kolumuza yasladığımız, gündüz dediğinde başımızı kaldırdığımız bir oyundur gece-gündüz oyunu. Bu oyun dikkatini ve refleksini kullanacağın bir oyun olacak. Bu projede 0,96” 128×64 piksel I2C OLED ekranı kullanacağız. OLED ekranlar yapay ışık kaynağı olarak kullanılabildikleri için ekran üzerindeki karakterleri mercek ve ayna kullanarak büyütebilir ve istediğiniz düzleme yansıtabilirsin. Akıllı gözlükler ve otomobil camlarına bilgilendirme, yol ve trafik bilgisi yansıtabilen sistemler OLED ekranlar kullanılarak yapılabilmektedir.

Işık sensörleri bulundukları ortamın ışık seviyelerini ölçebilen, fotodiyot da denilen sensörlerdir. Işığa maruz kalan sensörün elektrik geçirgenliği değişmektedir. Biz de kodlayarak ışık sensörünü  kontrol edip, ışık miktarının etkilediği elektronik sistemler geliştirebilmekteyiz.

Proje Detayları ve Algoritma

Önce oyuncunun oyuna başlaması için butona basmasını isteyeceğiz. Ardından  PicoBricks’in OLED ekranında  NIGHT ve DAY ifadelerini rastgele olarak 2’şer saniye boyunca gösterilmesini sağlayacağız. Oyuncu, eğer OLED ekranda yazan kelime NIGHT ise 2 saniye içinde LDR sensörünün üzerini eliyle kapatmalı, eğer OLED ekranda GÜNDÜZ kelimesi yazıyorsa LDR sensörünün üzerinden elini kaldırmalı. Oyuncunun her doğru tepkisi 10 puan kazanmasını sağlayacak, yanlış tepkide ise oyun bitecek ve ekranda oyunun bitmesini bildiren yazılı ifade yer alacak, buzzerdan farklı tonda bir ses çalacak ve OLED ekranda puan bilgisi yer alacaktır. Eğer oyuncu toplam 10 doğru tepki verip 100 puan elde ederse “Congratulation” yazısı ile oyuna yeniden başlayabilmek için RESET butonuna basılmasını bildiren ifade OLED ekranda gösterilip buzzerdan farklı tonda notalar çalacaktır..

Bağlantı Şeması

Projenin MicroBlocks ile Kodlanması

Picobricks başladığında  OLED ekranı tanımlayıp başlangıç ekran mesajlarını yazdır.. Ardından score, start, nightorday ve gamerReaction isimli değişkenler oluştur. Oyun butona basıldıktan sonra başlayacağı için wait until bloğundan sonra start değişkeni 1 yapılır.

Oyun başladığında her iki saniyede “change word” yayını yapılacak. Bu haber sayesinde ekranda DAY veya NIGHT ifadesi yazdırılacak. Kelimenin değişmeden ekranda kaldığı 2 saniye süresince oyuncunun tepkisi LDR sensöründen okunan değere göre gamerReaction değişkenine atanacak. LDR değeri 80’den büyükse sensörün üstü açıktır değilse sensör kapatılmıştır. 80 değerini kendi çalışma koşulların için değiştirebilirsin.

Geçen iki saniyenin sonunda ise gamerReaction ile rastgele belirlenen kelime(nightorday) kıyaslanarak Correct ve Wrong yayınları yapılıyor. Bu yayınlar ise oyunda puan kazanma ve oyunun bitmesi için kullanılacak.

İki saniye aralıklarla change word iletisi alındığında ekran temizlenerek 0 ya da 1 değer rastgele nightorday değişkenine atanır. Değer 0 ise ekrana NIGHT 0 değil ise ekrana DAY yazdırılır. Yayın bloğunun 1 defa çalışması için bu komut dizisi en sonda stop this task komutu ile durdurulur.

Oyuncu doğru tepki verdiğinde yayınlanan ”Correct” iletisi için score değişkenini bir seferlik 10 arttıran kodların yer aldığı kod bloğu aşağıdaki gibidir.

Oyuncu yanlış tepki verdiğinde yayınlanan “Wrong” iletisi için diğer tüm kodları durdurup ekrana oyunun bitmesi ile ilgili yazıyı ve score değerini yazdıran kodların yer aldığı kod bloğu aşağıdaki gibidir.

Oyuncu oyunu hatasız bitirdiğinde score değişkeni 100 değerini alacaktır. Bunu yakalayıp oyuncuyu tebrik edip oyunu durduran kodların yer aldığı kod bloğu aşağıdaki gibidir.

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

Proje Önerisi

Projeye LDR sensörün bulunduğun ortama göre gönderdiği değerleri alarak oyun içerisinde sensör değerine göre işlem yapılacak sınırın otomatik belirlenmesi, yani LDR sensör değeri kalibrasyonu kodları ekleyerek projeyi geliştirebilirsin. Oyuna zorluk seviyesi ekleyebilirsin. Potansiyometre ile zorluk seviyesi kolay orta ve zor seçimi yaptırılabilir. Kolay seçiliyken kelimelerin değişme süresi 2 saniye orta seçiliyken 1.5 saniye zor seçiliyken 1 saniye olabilir.

Projenin MicroPython Kodları

from machine import Pin, I2C, Timer, ADC, PWM
from ssd1306 import SSD1306_I2C
from utime import sleep
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)

buzzer = PWM(Pin(20))
buzzer.freq(440)
ldr=ADC(27)
button=Pin(10,Pin.IN,Pin.PULL_DOWN)

oled.text("NIGHT and DAY", 10, 0)
oled.text("<GAME>", 40, 20)
oled.text("Press the Button", 0, 40)
oled.text("to START!", 40, 55)
oled.show()

def changeWord():
    global nightorday
    oled.fill(0)
    oled.show()
    nightorday=round(urandom.uniform(0,1))
    if nightorday==0:
        oled.text("---NIGHT---", 20, 30)
        oled.show()
    else:
        oled.text("---DAY---", 20, 30)
        oled.show()

while button.value()==0:
    print("Press the Button")
    sleep(0.01)
    
oled.fill(0)
oled.show()
start=1
global score
score=0
while start==1:
    global gamerReaction
    global score
    changeWord()
    startTime=utime.ticks_ms()
    
    while utime.ticks_diff(utime.ticks_ms(), startTime)<=2000:
        if ldr.read_u16()>20000:
            gamerReaction=0
        else:
            gamerReaction=1
        sleep(0.01)
    
    buzzer.duty_u16(2000)
    sleep(0.05)
    buzzer.duty_u16(0)
    if gamerReaction==nightorday:
        score += 10
    else:
        oled.fill(0)
        oled.show()
        oled.text("Game Over", 0, 18, 1)
        oled.text("Your score " + str(score), 0,35)
        oled.text("Press RESET",0, 45)
        oled.text("To REPEAT",0,55)
        oled.show()
        buzzer.duty_u16(2000)
        sleep(0.05)
        buzzer.duty_u16(0)
        break;
    if score==100:
        oled.fill(0)
        oled.show()
        oled.text("Congratulation", 10, 10)
        oled.text("Top Score: 100", 5, 35)
        oled.text("Press Reset", 20, 45)
        oled.text("To REPEAT", 25,55)
        oled.show()
        buzzer.duty_u16(2000)
        sleep(0.1)
        buzzer.duty_u16(0)
        sleep(0.1)
        buzzer.duty_u16(2000)
        sleep(0.1)
        buzzer.duty_u16(0)
        break;

Projenin Arduino C Kodları

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

int Gamer_Reaction = 0;
int Night_or_Day = 0;
int Score = 0;
int Sayac=0;

double currentTime = 0;
double lastTime = 0;
double getLastTime(){
      return currentTime = millis()/1000.0 - lastTime;
}

void _delay(float seconds) {
  long endTime = millis() + seconds * 1000;
  while(millis() < endTime) _loop();
}

void _loop() {
}

void loop() {
  _loop();
}

void setup() {

  pinMode(10,INPUT);
  pinMode(27,INPUT);
  pinMode(20,OUTPUT);

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

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

  oled.clearDisplay();
  oled.setTextXY(1,3);              
  oled.putString("NIGHT and DAY");
  oled.setTextXY(2,7);              
  oled.putString("GAME");
  oled.setTextXY(5,2);              
  oled.putString("Press BUTTON!");
  oled.setTextXY(6,4);              
  oled.putString("to START!");
  
  Score = 0;

  while(!(digitalRead(10) == 1))
  {
    _loop();
  }
  _delay(0.2); 
  
  while(1){ 
  if (Sayac==0){
    
  delay(500);
  Change_Word();
  lastTime = millis()/1000.0;
  
  while(!(getLastTime() > 2))
  {
    _loop();
    if(analogRead(27) > 500){
        Gamer_Reaction = 0;
    }else{
        Gamer_Reaction = 1;
    }
  }
  digitalWrite(20,HIGH);
  delay(250);
  digitalWrite(20,LOW);
  
  if(Night_or_Day == Gamer_Reaction){
      Correct();

  }else{
      Wrong();

  } _loop();

  if(Score==100){
  oled.clearDisplay();
  oled.setTextXY(1,1);              
  oled.putString("Congratulation");
  oled.setTextXY(3,1);              
  oled.putString("Your Score: ");  
  oled.setTextXY(3,13);              
  String String_Score=String(Score);
  oled.putString(String_Score);
  oled.setTextXY(5,3);              
  oled.putString("Press Reset"); 
  oled.setTextXY(6,3);              
  oled.putString("To Repeat!");   
  
    for(int i=0;i<3;i++){

    digitalWrite(20,HIGH);
    delay(500);
    digitalWrite(20,LOW);
    delay(500); 
    } Sayac=1;
   }
  }
 }
}

void Correct (){
  Score += 10;
  oled.clearDisplay();
  oled.setTextXY(3,4);              
  oled.putString("10 points");  
}

void Change_Word (){
  oled.clearDisplay();
  Night_or_Day=random(0,2);

  if (Night_or_Day==0){
    oled.setTextXY(3,6);              
    oled.putString("NIGHT");
  }else{
    oled.setTextXY(3,7);              
    oled.putString("DAY");
  }
}

void Wrong (){
  oled.clearDisplay();
  oled.setTextXY(1,3);              
  oled.putString("Game Over");
  oled.setTextXY(3,1);              
  oled.putString("Your Score: ");  
  oled.setTextXY(3,13);              
  String String_Score=String(Score);
  oled.putString(String_Score);
  oled.setTextXY(5,3);              
  oled.putString("Press Reset"); 
  oled.setTextXY(6,3);              
  oled.putString("To Repeat!");   
  digitalWrite(20,HIGH);
  delay(1000);
  digitalWrite(20,LOW);
  Sayac=1; 
}


Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top