#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <TM1637Display.h> // TM1637 kütüphanesini ekle
#define SCREEN_WIDTH 128 // OLED ekranın genişliği
#define SCREEN_HEIGHT 64 // OLED ekranın yüksekliği
#define ENGELLER_SAYISI 8
// I2C adresi (genellikle 0x3C)
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_ADDR);
TM1637Display sevenSegmentDisplay(11, 10); // Dijital pin 2 ve 3 üzerinde TM1637 display için
// Oyun alanı özellikleri
const int paletGenislik = 20;
const int paletYukseklik = 4;
const int topCap = 3;
int topX = SCREEN_WIDTH / 2;
int topY = SCREEN_HEIGHT / 2;
int engeller[ENGELLER_SAYISI][4]; // ENGELLER_SAYISI, toplam engel sayısını temsil eder.
// Topun hızı
int topHizX = 1;
int topHizY = -1;
// Paletin konumu
int paletX;
const int potPin = A0; // Potansiyometrenin bağlı olduğu analog pin (A2)
int potValue = 0; // Potansiyometre değerini tutacak değişken
int paletPozisyon = 0;
const int ekranGenislik = 128; // OLED ekran genişliği
// Skor puanı
int skor = 0;
void setup() {
Serial.begin(9600); // Seri haberleşmeyi başlat
// OLED ekranını başlat
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("SSD1306 ekran başlatılamadı!"));
while (true);
}
// TM1637 yedi segment display'ı başlat
sevenSegmentDisplay.setBrightness(0x0f); // Parlaklık ayarla (0x00 - 0x0f)
// Engellerin konumlarını ayarla
engeller[0][0] = 10; // İlk engelin x koordinatı
engeller[0][1] = 10; // İlk engelin y koordinatı
engeller[0][2] = 20; // İlk engelin genişliği
engeller[0][3] = 10; // İlk engelin yüksekliği
engeller[1][0] = 31; // İkinci engelin x koordinatı
engeller[1][1] = 10; // İkinci engelin y koordinatı
engeller[1][2] = 20; // İkinci engelin genişliği
engeller[1][3] = 10; // İkinci engelin yüksekliği
engeller[2][0] = 52; // İkinci engelin x koordinatı
engeller[2][1] = 10; // İkinci engelin y koordinatı
engeller[2][2] = 20; // İkinci engelin genişliği
engeller[2][3] = 10; // İkinci engelin yüksekliği
engeller[3][0] = 73; // İkinci engelin x koordinatı
engeller[3][1] = 10; // İkinci engelin y koordinatı
engeller[3][2] = 20; // İkinci engelin genişliği
engeller[3][3] = 10; // İkinci engelin yüksekliği
engeller[4][0] = 10; // İkinci engelin x koordinatı
engeller[4][1] = 21; // İkinci engelin y koordinatı
engeller[4][2] = 20; // İkinci engelin genişliği
engeller[4][3] = 10; // İkinci engelin yüksekliği
engeller[5][0] = 31; // İkinci engelin x koordinatı
engeller[5][1] = 21; // İkinci engelin y koordinatı
engeller[5][2] = 20; // İkinci engelin genişliği
engeller[5][3] = 10; // İkinci engelin yüksekliği
engeller[6][0] = 52; // İkinci engelin x koordinatı
engeller[6][1] = 21; // İkinci engelin y koordinatı
engeller[6][2] = 20; // İkinci engelin genişliği
engeller[6][3] = 10; // İkinci engelin yüksekliği
engeller[7][0] = 73; // İkinci engelin x koordinatı
engeller[7][1] = 21; // İkinci engelin y koordinatı
engeller[7][2] = 20; // İkinci engelin genişliği
engeller[7][3] = 10; // İkinci engelin yüksekliği
// Ekranı temizle
display.clearDisplay();
// Paletin başlangıç pozisyonunu ayarla
paletX = (SCREEN_WIDTH - paletGenislik) / 2;
}
void loop() {
// Ekranı temizle
display.clearDisplay();
// Potansiyometre değerini oku
potValue = analogRead(potPin);
// Potansiyometre değerini palet konumuna dönüştür
paletX = map(potValue, 0, 1023, 0, ekranGenislik - paletGenislik);
// Engellerle çarpışmayı kontrol et
checkCollisionWithWalls();
// Topun hareketini güncelle
hareketEtTop();
// Oyun alanını çiz
drawPalet();
drawTop();
drawWalls();
// Skoru TM1637 yedi segment display'a yazdır
sevenSegmentDisplay.showNumberDec(skor, false);
// Ekranı güncelle
display.display();
// Hızlı bir şekilde güncellenmesi için bir gecikme ekle
delay(5);
}
void(* resetFunc) (void) = 0;
void checkCollisionWithWalls() {
// Ekranın alt sınırına ulaşıldığını kontrol et
if (topY + topCap >= SCREEN_HEIGHT) {
// Top ekranın alt sınırına ulaştı, oyunu bitir
// Burada istediğiniz işlemleri gerçekleştirin, örneğin oyunu yeniden başlatmak gibi.
// Bu örnekte, sadece ekrana bir mesaj yazdırıyoruz.
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 20);
display.println("Oyun Bitti!");
display.display();
delay(2000);
// Oyunu yeniden başlatmak için Arduino'yu yeniden başlatıyoruz
resetFunc();
}
// Topun paletle çarpışmasını kontrol et
if (topY + topCap >= SCREEN_HEIGHT - paletYukseklik && topX >= paletX && topX <= paletX + paletGenislik) {
// Top paletle temas etti, yönünü tersine çevir
topHizY *= -1;
}
// Engellerle çarpışmayı kontrol et
for (int i = 0; i < ENGELLER_SAYISI; i++) {
int engelX = engeller[i][0];
int engelY = engeller[i][1];
int engelWidth = engeller[i][2];
int engelHeight = engeller[i][3];
// Topun sınırlarını belirle
int topLeftX = topX - topCap;
int topRightX = topX + topCap;
int topBottomY = topY + topCap;
int topTopY = topY - topCap;
// Engelin sınırlarını belirle
int engelLeftX = engelX;
int engelRightX = engelX + engelWidth;
int engelBottomY = engelY + engelHeight;
int engelTopY = engelY;
// Topun, engelin içine girdiğini kontrol et
if (topRightX >= engelLeftX && topLeftX <= engelRightX && topBottomY >= engelTopY && topTopY <= engelBottomY) {
// Topun, engelle çarpıştığı durumu
// Engeli kaldır
engeller[i][0] = -1;
engeller[i][1] = -1;
engeller[i][2] = 0;
engeller[i][3] = 0;
// Topun yönünü tersine çevir
topHizX *= -1;
topHizY *= -1;
// Skor puanını artır
skor++;
}
}
}
void drawWalls() {
// Sol duvar
display.fillRect(0, 0, 2, SCREEN_HEIGHT, SSD1306_WHITE);
// Sağ duvar
display.fillRect(SCREEN_WIDTH - 2, 0, 2, SCREEN_HEIGHT, SSD1306_WHITE);
// Üst duvar
display.fillRect(0, 0, SCREEN_WIDTH, 2, SSD1306_WHITE);
// Alt duvar
display.fillRect(0, SCREEN_HEIGHT - 2, SCREEN_WIDTH, 2, SSD1306_WHITE);
// Engelleri çiz
for (int i = 0; i < ENGELLER_SAYISI; i++) {
int x = engeller[i][0];
int y = engeller[i][1];
int genislik = engeller[i][2];
int yukseklik = engeller[i][3];
display.fillRect(x, y, genislik, yukseklik, SSD1306_WHITE);
}
}
void drawPalet() {
// Paleti çiz
display.fillRect(paletX, SCREEN_HEIGHT - paletYukseklik - 1, paletGenislik, paletYukseklik, SSD1306_WHITE);
}
void drawTop() {
// Topu çiz
display.drawCircle(topX, topY, topCap, SSD1306_WHITE);
}
void hareketEtTop() {
// Topun yeni pozisyonunu hesapla
topX += topHizX;
topY += topHizY;
// Topun ekran sınırlarına çarpmasını kontrol et
if (topX < 0 || topX > SCREEN_WIDTH - 1) {
topHizX *= -1; // X yönlü hareketi tersine çevir
}
if (topY < 0 || topY > SCREEN_HEIGHT - 1) {
topHizY *= -1; // Y yönlü hareketi tersine çevir
}
}