Как отремонтировать мои светодиодные матрицы и заставить их все начинаться со следующего числа с правой стороны - PullRequest
0 голосов
/ 16 мая 2019

По сути, я пытаюсь передать массив на массив светодиодов для тетриса (проект для моего класса). Основная проблема с этим состоит в том, что матрица светодиодов, на которой я пытаюсь отобразить, является Snaking из-за соединений на плате, идущих справа налево и затем слева направо.

В настоящее время я работаю с массивом светодиодов 32 x 8 . Поэтому, когда я загораюсь, светодиоды [board [0] [7]] = CRGB :: White загораются в верхнем левом углу доски. Но Leds [board [1] [0]] = CRGB :: White подсвечивает второй свет прямо под ним. Вместо этого я хочу, чтобы это началось с правой стороны, как показано выше. Это делает очень трудным кодирование квадрата 2x2 на эти источники света, так как они всегда оказываются инвертированными на матрицу светодиодов из-за этой змеи.

т.е. {1, 1, 0, 0} будет отображаться как {0, 0, 1, 1} в строке ниже.

Мне просто нужно, чтобы он отображался в строке ниже, чтобы я мог просто идти по массивам.
То есть доска [x - 1] [y];

Извините, если это немного сбивает с толку, но это лучший способ, которым я могу это объяснить. Если требуется больше разъяснений, пожалуйста, дайте мне знать.

Я в основном программировал на Java, и я впервые использую Arduino. Так что я не знаю, есть ли разница между массивами Arduino и Java.

До сих пор я пытался противостоять змеевику матрицы светодиодов, но он всегда сдвигает один ряд светодиодов вправо, когда он должен находиться непосредственно под другими светодиодами. Этот код будет ниже.

int setBoard = 0;
int board[32][8];

//trying to make tetris, so i'm starting with the oPiece.
int oPiece[2][2] = {
  { 1, 1 },
  { 1, 1 }  
};


//This is my setup for the board.  In here I am trying to make every other row 
go from right to left instead of left to right in which it normally does.
void setup() {
  for(int i = 0; i < 32; i++) {
      //This outputs correctly.
      if(i % 2 == 0) {        
        for(int z = 0; z < 8; z++) {
          board[i][z] = setBoard;
          setBoard++;
        }
      }
      //This doesn't output correctly.  Shifts all LEDs on every one of these 
      //rows over to the right by one.  
      if(i % 2 != 0) {
        setBoard+= 8;

        for(int y = 0; y < 8; y++) {
          board[i][y] = setBoard;
          setBoard--;
        }
        setBoard+= 8;
      }

   }
}

//displays the piece onto the 2d array by a certain y offset.
void showPiece() {
  for(int x = 0; x < 2; x++) {
    for(int y = 0; y < 2; y++) {
      if(oPiece[x][y] == 1) {
        leds[board[x][y + 6]] = CHSV(255, 75, 75);
      }        
    }
  }
  FastLED.show();
}

void loop() {
  showPiece();
}

1 Ответ

0 голосов
/ 17 мая 2019

Ваш setup не совсем понимает, как правильно генерировать переменную setBoard.

Если я напечатаю первые три строки board, я получу:

0       1       2       3       4       5       6       7
16      15      14      13      12      11      10      9
16      17      18      19      20      21      22      23

То есть 8 отсутствует, и 16 повторяется.

Изменение кода для нечетных строк:

if(i % 2 != 0)
{
    setBoard += 7;

    for(int y = 0; y < 8; y++) {
        board[i][y] = setBoard;
        setBoard--;
    }
    setBoard += 9;
}

дает правильный вывод:

0       1       2       3       4       5       6       7
15      14      13      12      11      10      9       8
16      17      18      19      20      21      22      23
...