Herkese merhaba, bu yazımızda Arduino ve 0.96″ I2C Oled ekran kullanarak Retro Ping Pong Oyunu uygulaması yapacağız.

0.96″ I2C OLED Ekran

Arduino ve diğer mikrokontrolcüler ile kullanım kolaylığı ve (128×64 pixel) küçük olması sebebiyle oldukça tercih sebebidir. IoT projeleri, hobi projeleri, akım-gerilim, sıcaklık göstergesi gibi uygulamalarda sıkça karşımıza çıkan bir ekran modülüdür. Modül üzerinde SSD1306 sürücü entegresiyle gelmektedir bu sayese SPI ve I2C ara yüzleri kolaylıkla kullanılabilmektedir.

Özellikleri:

  • Driver Chip : SSD1306
  • Arayüz Tipi :IIC/I2C
  • Çalışma Voltajı: 3.3-5V
  • Çözünürlük : 128×64
  • Display Size : 0.96inch
  • Renk : Sarı, Mavi
  • Görünür Açı : >160°
  • Çalışma Sıcaklığı: -40 ℃ ila 70 ℃
  • Boyut:27.5×28.5mm

Ping Pong Oyun Uygulaması

Ping Pong oyun uygulamamızda raketi yukarı ve aşağı olarak yönlendirebilmek için 2 adet buton kullanmayı tercih ettik. Eğer siz isterseniz kodlarda değişiklikler yaparak bu yönlendirmeyi potansiyometre ile sağlayabilirsiniz. Ayrıca bu uygulamamızda, programa karşı tek kişi olarak oyunu oynadık, yine gerekli değişiklikler yaparak bu oyunu arkadaşlarınızla 2 kişi olarak oynayabilirsiniz. 🙂

Malzemeler

Devre Şeması

ping pong devre semasi

OLED Ekran Bağlantıları

  • VCC – 5V
  • GND – GND
  • SDA – A4
  • SCK – A5

Buton Bağlantıları

  • 1 bacakları – GND
  • Yukarı Yönlendirme için – Dijital 2
  • Aşağı Yönlendirme için – Dijital 3

Ping Pong Oyunu Kodlar

Gerekli kütüphaneleri kurmak için aşağıdaki adımları takip edebilirsiniz. 🙂

Ardunio IDE >  Araçlar > Kütüphaneleri Yönet > (Kurmak istediğiniz Kütüphane)

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define UP_BUTTON 2
#define DOWN_BUTTON 3
const unsigned long PADDLE_RATE = 33;
const unsigned long BALL_RATE = 16;
const uint8_t PADDLE_HEIGHT = 24;
#define SCREEN_WIDTH 128 // OLED display en pixeli
#define SCREEN_HEIGHT 64 // OLED display boy pixeli
#define OLED_RESET 4 // Reset pin
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void drawCourt();
uint8_t ball_x = 64, ball_y = 32;
uint8_t ball_dir_x = 1, ball_dir_y = 1;
unsigned long ball_update;
unsigned long paddle_update;
const uint8_t CPU_X = 12;
uint8_t cpu_y = 16;
const uint8_t PLAYER_X = 115;
uint8_t player_y = 16;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 0x3c ile görüntü alamazsanız ı2c scannerdan adresinize bakınız
display.display();
unsigned long start = millis();
pinMode(UP_BUTTON, INPUT);
pinMode(DOWN_BUTTON, INPUT);
digitalWrite(UP_BUTTON,1);
digitalWrite(DOWN_BUTTON,1);
display.clearDisplay();
drawCourt();
while(millis() – start < 2000);
display.display();
ball_update = millis();
paddle_update = ball_update;
}
void loop() {
bool update = false;
unsigned long time = millis();
static bool up_state = false;
static bool down_state = false;
up_state |= (digitalRead(UP_BUTTON) == LOW);
down_state |= (digitalRead(DOWN_BUTTON) == LOW);
if(time > ball_update) {
uint8_t new_x = ball_x + ball_dir_x;
uint8_t new_y = ball_y + ball_dir_y;
// Check if we hit the vertical walls
if(new_x == 0 || new_x == 127) {
ball_dir_x = -ball_dir_x;
new_x += ball_dir_x + ball_dir_x;
}
// Check if we hit the horizontal walls.
if(new_y == 0 || new_y == 63) {
ball_dir_y = -ball_dir_y;
new_y += ball_dir_y + ball_dir_y;
}
// Check if we hit the CPU paddle
if(new_x == CPU_X && new_y >= cpu_y && new_y <= cpu_y + PADDLE_HEIGHT) {
ball_dir_x = -ball_dir_x;
new_x += ball_dir_x + ball_dir_x;
}
// Check if we hit the player paddle
if(new_x == PLAYER_X
&& new_y >= player_y
&& new_y <= player_y + PADDLE_HEIGHT)
{
ball_dir_x = -ball_dir_x;
new_x += ball_dir_x + ball_dir_x;
}
display.drawPixel(ball_x, ball_y, BLACK);
display.drawPixel(new_x, new_y, WHITE);
ball_x = new_x;
ball_y = new_y;
ball_update += BALL_RATE;
update = true;
}
if(time > paddle_update) {
paddle_update += PADDLE_RATE;
// CPU paddle
display.drawFastVLine(CPU_X, cpu_y, PADDLE_HEIGHT, BLACK);
const uint8_t half_paddle = PADDLE_HEIGHT >> 1;
if(cpu_y + half_paddle > ball_y) {
cpu_y -= 1;
}
if(cpu_y + half_paddle < ball_y) {
cpu_y += 1;
}
if(cpu_y < 1) cpu_y = 1;
if(cpu_y + PADDLE_HEIGHT > 63) cpu_y = 63 – PADDLE_HEIGHT;
display.drawFastVLine(CPU_X, cpu_y, PADDLE_HEIGHT, WHITE);
// Player paddle
display.drawFastVLine(PLAYER_X, player_y, PADDLE_HEIGHT, BLACK);
if(up_state) {
player_y -= 1;
}
if(down_state) {
player_y += 1;
}
up_state = down_state = false;
if(player_y < 1) player_y = 1;
if(player_y + PADDLE_HEIGHT > 63) player_y = 63 – PADDLE_HEIGHT;
display.drawFastVLine(PLAYER_X, player_y, PADDLE_HEIGHT, WHITE);
update = true;
}
if(update)
display.display();
}
void drawCourt() {
display.drawRect(0, 0, 128, 64, WHITE);
}

🚀 Arduino ve OLED ekran ile tetris oyunu ve OLED ekrana yazı yazdırma uygulamalarımızı da incelemenizi tavsiye ederiz. 🙂

2 YORUMLAR

  1. bu hatayı alıyor ne yapmalıyım

    Arduino:1.8.19 (Windows 8.1), Kart:”Arduino Uno”

    sketch_jul07b:50:20: error: stray ‘\342’ in program

    sketch_jul07b:50:21: error: stray ‘\200’ in program

    sketch_jul07b:50:22: error: stray ‘\223’ in program

    sketch_jul07b:122:51: error: stray ‘\342’ in program

    sketch_jul07b:122:52: error: stray ‘\200’ in program

    sketch_jul07b:122:53: error: stray ‘\223’ in program

    sketch_jul07b:135:57: error: stray ‘\342’ in program

    sketch_jul07b:135:58: error: stray ‘\200’ in program

    sketch_jul07b:135:59: error: stray ‘\223’ in program

    sketch_jul07b:21:1: error: ‘Adafruit_SSD1306’ does not name a type; did you mean ‘Adafruit_SSD1305’?

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino: In function ‘void setup()’:

    sketch_jul07b:37:5: error: ‘display’ was not declared in this scope

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino:37:5: note: suggested alternative: ‘delay’

    sketch_jul07b:37:19: error: ‘SSD1306_SWITCHCAPVCC’ was not declared in this scope

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino:37:19: note: suggested alternative: ‘SSD1305_SETCOMPINS’

    sketch_jul07b:50:24: error: expected ‘)’ before ‘start’

    sketch_jul07b:50:36: error: expected ‘;’ before ‘)’ token

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino: In function ‘void loop()’:

    sketch_jul07b:99:9: error: ‘display’ was not declared in this scope

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino:99:9: note: suggested alternative: ‘delay’

    sketch_jul07b:113:9: error: ‘display’ was not declared in this scope

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino:113:9: note: suggested alternative: ‘delay’

    sketch_jul07b:122:55: error: expected ‘;’ before ‘PADDLE_HEIGHT’

    sketch_jul07b:135:61: error: expected ‘;’ before ‘PADDLE_HEIGHT’

    sketch_jul07b:143:9: error: ‘display’ was not declared in this scope

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino:143:9: note: suggested alternative: ‘delay’

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino: In function ‘void drawCourt()’:

    sketch_jul07b:148:5: error: ‘display’ was not declared in this scope

    C:\Users\MULTİVİZYON\Documents\Arduino\sketch_jul07b\sketch_jul07b.ino:148:5: note: suggested alternative: ‘delay’

    exit status 1

    stray ‘\342’ in program

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

CEVAP VER

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