C/C++ XOX oyununda devre çalışmıyor

FatihBugra43

Hectopat
Katılım
25 Şubat 2020
Mesajlar
10
1. sınıf eem öğrencisiyim hoca proje ödevi verdi. Xox oyunu yapmayı planlıyorum genel olarak çoğu şeyim hazır fakat simülasyonda devreyi çalıştıramıyorum ve birkaç sorum var.
  • LED'leri Green ve red olacak şekilde seçtim, akımı +dan - ye olacak şekilde ayarlarsan yeşil -den + ya olacak şekilde ayarlarsan kırmızı yanıyor.
    Bunu kodlama ile halledebilir miyim? Olmuyorsa RGB LED'leri transistör vesaire kullanarak 2 ayrı pin değil de tek bir pin olarak kullanabilir miyim basit bir yöntemi var mı?
  • Bir de neden çalışmadağını anlayamadım koddamı sıkıntı var yoksa devrenin kendisinde mi?

    Kodlar ektedir.

Kod:
#include <Keypad.h>

const byte ROWS = 4; // Dört satır.
const byte COLS = 3; // Üç sütun.

char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','='}
};

byte rowPins[ROWS] = {9, 8, 7, 6}; // Keypad satır pinleri.
byte colPins[COLS] = {5, 4, 3}; // Keypad sütun pinleri.

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

int ledPins[9] = {2, 10, 11, 12, 13, A5, A4, A3, A2}; // LED pinleri.
int potPin = A4; // Potansiyometre pini.
int brightness = 255; // LED parlaklığı (0-255)
bool systemOn = false; // Sistem durumu.
int playerTurn = 1; // Oyuncu sırası (1 veya 2)
int board[9] = {0}; // Oyun tahtası durumu (0: boş, 1: oyuncu 1, 2: oyuncu 2)

void setup() {
 for (int i = 0; i < 9; i++) {
 pinMode(ledPins[i], OUTPUT);
 }
 pinMode(potPin, INPUT);
}

void loop() {
 char key = keypad.getKey();

 if (key) {
 if (key == '*') {
 systemOn = !systemOn;
 if (!systemOn) {
 resetGame();
 }
 } else if (systemOn) {
 if (key == '=') {
 resetGame();
 } else {
 handleKeyPress(key);
 }
 }
 }

 if (systemOn) {
 brightness = map(analogRead(potPin), 0, 1023, 0, 255);
 for (int i = 0; i < 9; i++) {
 analogWrite(ledPins[i], board[i] == 0 ? 0 : brightness);
 }
 }
}

void handleKeyPress(char key) {
 int index = key - '1';
 if (index >= 0 && index < 9 && board[index] == 0) {
 board[index] = playerTurn;
 if (checkWin(playerTurn)) {
 blinkWinner(playerTurn);
 resetGame();
 } else {
 playerTurn = 3 - playerTurn; // Oyuncu sırasını değiştir.
 }
 }
}

void resetGame() {
 for (int i = 0; i < 9; i++) {
 board[i] = 0;
 digitalWrite(ledPins[i], LOW);
 }
 playerTurn = 1;
}

bool checkWin(int player) {
 int winPatterns[8][3] = {
 {0, 1, 2}, // Yatay.
 {3, 4, 5}, // Yatay.
 {6, 7, 8}, // Yatay.
 {0, 3, 6}, // Dikey.
 {1, 4, 7}, // Dikey.
 {2, 5, 8}, // Dikey.
 {0, 4, 8}, // Çapraz.
 {2, 4, 6} // Çapraz.
 };

 for (int i = 0; i < 8; i++) {
 if (board[winPatterns[i][0]] == player &&
 board[winPatterns[i][1]] == player &&
 board[winPatterns[i][2]] == player) {
 return true;
 }
 }
 return false;
}

void blinkWinner(int player) {
 for (int i = 0; i < 3; i++) {
 for (int j = 0; j < 9; j++) {
 if (board[j] == player) {
 digitalWrite(ledPins[j], HIGH);
 }
 }
 delay(500);
 for (int j = 0; j < 9; j++) {
 if (board[j] == player) {
 digitalWrite(ledPins[j], LOW);
 }
 }
 delay(500);
 }
}
 
LED'lerinizin doğru çalışmasını sağlamak için bazı donanım ve yazılım ayarlamaları yapmanız gerekecek. Öncelikle, LED'lerin yeşil veya kırmızı yanması için nasıl bağlandıklarını anlamamız önemli. Yeşil ve kırmızı LED'lerin, akım yönüne göre renk değiştirdiklerini söylediniz. Bu durumda, LED'leri iki yönlü olarak kontrol edebilmek için bir H-köprüsü kullanabilir veya iki ayrı pinle kontrol edebilirsiniz.

LED'leri iki ayrı pinle kontrol etmek en basit yöntemdir. Aşağıda, iki pinle LED kontrolü ve devre ile ilgili ipuçları bulunmaktadır:

Donanım Ayarları​

  1. LED Bağlantısı:
    • Her bir LED için iki adet pin kullanarak, bir pini anotta, diğer pini katotta bağlayarak kontrol edebilirsiniz.
    • Örneğin:
      • Yeşil LED: Anot pinine +5V, katot pinine direnç üzerinden Arduino pini.
      • Kırmızı LED: Anot pinine Arduino pini, katot pinine direnç üzerinden GND.
  2. Transistör Kullanımı:
    • Eğer LED'leri daha karmaşık bir devreyle kontrol etmek istiyorsanız, transistörler ve H-köprüsü kullanarak da yapabilirsiniz. Ancak bu, basitlik açısından gereksiz olabilir.

Yazılım Ayarları​

Kodunuzu LED'lerin doğru şekilde yanmasını sağlamak için düzenleyeceğiz. İşte iki pinle kontrol edilen LED'lerin nasıl çalışacağını gösteren örnek bir kod:


#include <Keypad.h>

const byte ROWS = 4; // Dört satır.
const byte COLS = 3; // Üç sütun.

char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','='}
};

byte rowPins[ROWS] = {9, 8, 7, 6}; // Keypad satır pinleri.
byte colPins[COLS] = {5, 4, 3}; // Keypad sütun pinleri.

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

int ledGreenPins[9] = {2, 10, 11, 12, 13, A5, A4, A3, A2}; // Yeşil LED pinleri.
int ledRedPins[9] = {A1, A0, 1, 0, 19, 18, 17, 16, 15}; // Kırmızı LED pinleri.
int potPin = A4; // Potansiyometre pini.
int brightness = 255; // LED parlaklığı (0-255)
bool systemOn = false; // Sistem durumu.
int playerTurn = 1; // Oyuncu sırası (1 veya 2)
int board[9] = {0}; // Oyun tahtası durumu (0: boş, 1: oyuncu 1, 2: oyuncu 2)

void setup() {
for (int i = 0; i < 9; i++) {
pinMode(ledGreenPins, OUTPUT);
pinMode(ledRedPins, OUTPUT);
}
pinMode(potPin, INPUT);
}

void loop() {
char key = keypad.getKey();

if (key) {
if (key == '*') {
systemOn = !systemOn;
if (!systemOn) {
resetGame();
}
} else if (systemOn) {
if (key == '=') {
resetGame();
} else {
handleKeyPress(key);
}
}
}

if (systemOn) {
brightness = map(analogRead(potPin), 0, 1023, 0, 255);
for (int i = 0; i < 9; i++) {
if (board == 0) {
analogWrite(ledGreenPins, 0);
analogWrite(ledRedPins, 0);
} else if (board == 1) {
analogWrite(ledGreenPins, brightness);
analogWrite(ledRedPins, 0);
} else if (board == 2) {
analogWrite(ledGreenPins, 0);
analogWrite(ledRedPins, brightness);
}
}
}
}

void handleKeyPress(char key) {
int index = key - '1';
if (index >= 0 && index < 9 && board[index] == 0) {
board[index] = playerTurn;
if (checkWin(playerTurn)) {
blinkWinner(playerTurn);
resetGame();
} else {
playerTurn = 3 - playerTurn; // Oyuncu sırasını değiştir.
}
}
}

void resetGame() {
for (int i = 0; i < 9; i++) {
board = 0;
digitalWrite(ledGreenPins, LOW);
digitalWrite(ledRedPins, LOW);
}
playerTurn = 1;
}

bool checkWin(int player) {
int winPatterns[8][3] = {
{0, 1, 2}, // Yatay.
{3, 4, 5}, // Yatay.
{6, 7, 8}, // Yatay.
{0, 3, 6}, // Dikey.
{1, 4, 7}, // Dikey.
{2, 5, 8}, // Dikey.
{0, 4, 8}, // Çapraz.
{2, 4, 6} // Çapraz.
};

for (int i = 0; i < 8; i++) {
if (board[winPatterns[0]] == player &&
board[winPatterns[1]] == player &&
board[winPatterns[2]] == player) {
return true;
}
}
return false;
}

void blinkWinner(int player) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j++) {
if (board[j] == player) {
if (player == 1) {
digitalWrite(ledGreenPins[j], HIGH);
} else {
digitalWrite(ledRedPins[j], HIGH);
}
}
}
delay(500);
for (int j = 0; j < 9; j++) {
if (board[j] == player) {
if (player == 1) {
digitalWrite(ledGreenPins[j], LOW);
} else {
digitalWrite(ledRedPins[j], LOW);
}
}
}
delay(500);
}
}







Açıklama:​

  1. LED Pinleri:
    • ledGreenPins ve ledRedPins dizileri ile her LED'in iki pinde tanımlanması sağlanmıştır. Yeşil LED'ler için ledGreenPins ve kırmızı LED'ler için ledRedPins.
  2. Setup Fonksiyonu:
    • Her iki dizi için de pinMode fonksiyonları ile pinler OUTPUT olarak ayarlanmıştır.
  3. Loop Fonksiyonu:
    • Sistem açık olduğunda ve potPin ile ayarlanan parlaklık değeri kullanılarak LED'ler kontrol edilmektedir.
    • Eğer board değeri 1 ise yeşil LED, 2 ise kırmızı LED yanmaktadır.

    [*]handleKeyPress Fonksiyonu:
    • Tuş basıldığında ilgili hücre playerTurn değeri ile güncellenir. Eğer oyuncu kazanmışsa blinkWinner fonksiyonu çağrılır.
    [*]resetGame Fonksiyonu:
    • Oyun tahtası sıfırlanır ve tüm LED'ler kapatılır.
    [*]checkWin Fonksiyonu:
    • Kazanma koşullarını kontrol eder.
    [*]blinkWinner Fonksiyonu:
    • Kazanan oyuncunun LED'leri yanıp söner.

Bu kod ile LED'lerinizi kontrol edebilir ve sorununuzun çözümüne ulaşabilirsiniz. Eğer hala sorun yaşıyorsanız, devre bağlantılarınızı tekrar kontrol etmeniz ve her pinin doğru şekilde bağlandığından emin olmanız önemlidir.
 
LED'lerinizin doğru çalışmasını sağlamak için bazı donanım ve yazılım ayarlamaları yapmanız gerekecek. Öncelikle, LED'lerin yeşil veya kırmızı yanması için nasıl bağlandıklarını anlamamız önemli. Yeşil ve kırmızı LED'lerin, akım yönüne göre renk değiştirdiklerini söylediniz. Bu durumda, LED'leri iki yönlü olarak kontrol edebilmek için bir h-köprüsü kullanabilir veya iki ayrı pinle kontrol edebilirsiniz.

LED'leri iki ayrı pinle kontrol etmek en basit yöntemdir. Aşağıda, iki pinle LED kontrolü ve devre ile ilgili ipuçları bulunmaktadır:

donanım ayarları​

  1. LED bağlantısı:
    • Her bir LED için iki adet pin kullanarak, bir PIN'i anotta, diğer PIN'i katotta bağlayarak kontrol edebilirsiniz.
    • Örneğin:
      • yeşil LED: Anot pinine +5v, katot pinine direnç üzerinden Arduino PIN'i.
      • kırmızı LED: Anot pinine Arduino PIN'i, katot pinine direnç üzerinden gnd.
  2. transistör kullanımı:
    • Eğer LED'leri daha karmaşık bir devreyle kontrol etmek istiyorsanız, transistörler ve h-köprüsü kullanarak da yapabilirsiniz. Ancak bu, basitlik açısından gereksiz olabilir.

yazılım ayarları​

Kodunuzu LED'lerin doğru şekilde yanmasını sağlamak için düzenleyeceğiz. İşte iki pinle kontrol edilen LED'lerin nasıl çalışacağını gösteren örnek bir kod:

#İnclude <Keypad.h>

Const byte rows = 4; // dört satır.
Const byte cols = 3; // üç sütun.

Char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','='}
};

Byte rowpins[ROWS] = {9, 8, 7, 6}; // keypad satır pinleri.
Byte colpins[COLS] = {5, 4, 3}; // keypad sütun pinleri.

Keypad keypad = keypad(makekeymap(keys), rowpins, colpins, rows, cols);

İnt ledgreenpins[9] = {2, 10, 11, 12, 13, A5, A4, A3, A2}; // yeşil LED pinleri.
İnt ledredpins[9] = {A1, a0, 1, 0, 19, 18, 17, 16, 15}; // kırmızı LED pinleri.
İnt potpin = A4; // potansiyometre PIN'i.
İnt brightness = 255; // LED parlaklığı (0-255)
Bool systemon = false; // sistem durumu.
İnt playerturn = 1; // oyuncu sırası (1 veya 2)
İnt board[9] = {0}; // oyun tahtası durumu (0: Boş, 1: Oyuncu 1, 2: Oyuncu 2)

Void setup() {
For (int i = 0; i < 9; i++) {
Pinmode(ledgreenpins, output);
pinmode(ledredpins, output);
}
pinmode(potpin, ınput);
}

Void loop() {

char key = keypad.getKey();

if (key) {
if (key == '*') {
systemon =!systemon;
if (!systemon) {
resetGame();
}
} else if (systemon) {
if (key == '=') {
resetGame();
} else {
handlekeypress(key);
}
}
}

if (systemon) {
brightness = map(analogread(potpin), 0, 1023, 0, 255);
for (int i = 0; i < 9; i++) {
if (board == 0) {
analogwrite(ledgreenpins, 0);
analogwrite(ledredpins, 0);
} else if (board == 1) {
analogwrite(ledgreenpins, brightness);
analogwrite(ledredpins, 0);
} else if (board == 2) {
analogwrite(ledgreenpins, 0);
analogwrite(ledredpins, brightness);
}
}
}
}

Void handlekeypress(char key) {

int index = key - '1';
if (index >= 0 && index < 9 && board[index] == 0) {
board[index] = playerturn;
if (checkwin(playerturn)) {
blinkwinner(playerturn);
resetGame();
} else {
playerturn = 3 - playerturn; // oyuncu sırasını değiştir.
}
}
}

Void resetGame() {

for (int i = 0; i < 9; i++) {
board = 0;
digitalwrite(ledgreenpins, Low);
digitalwrite(ledredpins, Low);
}
playerturn = 1;
}

Bool checkwin(int Player) {

int winpatterns[8][3] = {
{0, 1, 2}, // yatay.
{3, 4, 5}, // yatay.
{6, 7, 8}, // yatay.
{0, 3, 6}, // dikey.
{1, 4, 7}, // dikey.
{2, 5, 8}, // dikey.
{0, 4, 8}, // çapraz.
{2, 4, 6} // çapraz.
};

for (int i = 0; i < 8; i++) {
if (board[winpatterns[0]] == Player &&
board[winpatterns[1]] == Player &&
board[winpatterns[2]] == Player) {
return true;
}
}
return false;
}

Void blinkwinner(int Player) {

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j++) {
if (board[j] == Player) {
if (Player == 1) {
digitalwrite(ledgreenpins[j], hıgh);
} else {
digitalwrite(ledredpins[j], hıgh);
}
}
}
delay(500);
for (int j = 0; j < 9; j++) {
if (board[j] == Player) {
if (Player == 1) {
digitalwrite(ledgreenpins[j], Low);
} else {
digitalwrite(ledredpins[j], Low);
}
}
}
delay(500);
}
}


açıklama:

  1. LED pinleri:

    • ledgreenpins ve ledredpins dizileri ile her LED'in iki pinde tanımlanması sağlanmıştır. Yeşil LED'ler için ledgreenpins ve kırmızı LED'ler için ledredpins.
  2. setup fonksiyonu:

    • her iki dizi için de pinmode fonksiyonları ile pinler output olarak ayarlanmıştır.
  3. loop fonksiyonu:

    • sistem açık olduğunda ve potpin ile ayarlanan parlaklık değeri kullanılarak LED'ler kontrol edilmektedir.
    • eğer board değeri 1 ise yeşil LED, 2 ise kırmızı LED yanmaktadır.

    • handlekeypress fonksiyonu:

      • tuş basıldığında ilgili hücre playerturn değeri ile güncellenir. Eğer oyuncu kazanmışsa blinkwinner fonksiyonu çağrılır.
    • resetgame fonksiyonu:

      • oyun tahtası sıfırlanır ve tüm LED'ler kapatılır.
    • checkwin fonksiyonu:

      • kazanma koşullarını kontrol eder.
    • blinkwinner fonksiyonu:

      • kazanan oyuncunun LED'leri yanıp söner.

bu kod ile LED'lerinizi kontrol edebilir ve sorununuzun çözümüne ulaşabilirsiniz. Eğer hala sorun yaşıyorsanız, devre bağlantılarınızı tekrar kontrol etmeniz ve her pinin doğru şekilde bağlandığından emin olmanız önemlidir.

Ne yazık ki 2 pin kullanamam çünkü arduinom'da ona yetecek kadar pin yok.
H-köprüsünün nasıl yapıldığını açıklayabilir misiniz?
Ve sadece yeşil kırmızı LED kullanmaya gerek yok RGB LED'de olabilir transsistör vesaire kullanarak daha kolaysa.
Cevabınız için teşekkürler yapay zekaya bende sorabiliyorum kendi cevabınız olursa daha memnun olurum.
 

Geri
Yukarı