Problema con matriz 8x8, posiblemente sea el código

Buenas a todos, estoy realizando un juego de 3 en línea (triki coloquialmente o tic tac toe) es el primer proyecto que realizo en Arduino (poseo un Arduino UNO genérico, nuevo) y la verdad he tenido varios inconvenientes el principal de ellos es que la matriz 8x8 LED con integrado MAX7219 que tengo (y que supuestamente era bicolor pero nunca supe como encender el otro color), apaga los estados anteriores, me explico en el código tengo programado que al presionar uno de los 9 botones se llene una posición con una figura de acuerdo al jugador que tenga el turno, la cosa es que después de por decirlo un tiempo las posiciones ya marcadas se apagan o de por si prender una nueva posición produce que las anteriores se apaguen cuando en ningún momento doy dicha orden, no se si sea un problema de hardware para ser sincero, quiero creer que al ser mi primer código en Arduino quizás haya cometido un error, y muchas veces al presionar un botón hay una posibilidad de que el montaje se glitchee por decirlo de manera coloquial, y sea necesario un reset, adjunto código y un breve descripción del montaje...

Descripción

  1. El montaje posee 9 pulsadores conectados a una barra de pruebas, todos con una resistencia de un 1 k ohmio, los 9 pulsadores conectan al Arduino en los pines (2,3,4,5,6,7,8,9,12), respectivamente.

  2. La matriz 8x8 led (un solo modulo de matriz) ,con integrado MAX7219, esta conectada a la barra de pruebas, con los pines CLK_PIN 13, DATA_PIN 11, CS_PIN 10 , comunicados entre el Arduino y la matriz.

  3. Por temas de electrónica el Arduino esta siendo alimentado por un regulador que provee 5 voltios, ya que en un principio el puerto del pc, provocaba que no se mostraran correctamente algunos programas de testeo que le realice a la matriz.

Código:

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include "LedControl.h" 
#include <SPI.h>

#define	MAX_DEVICES	1


#define	CLK_PIN		13
#define	DATA_PIN	11
#define	CS_PIN		10

LedControl lc=LedControl(11,13,10,1);

int control = 1;
bool pause = true;
bool mess = true;
int ganador = 0;
int senal = 0;
int value = 0;
int x = 0;
int y = 0;
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
int x3 = 0;
int y3 = 0;
const byte buttonPins[] = {2,3,4,5,6,7,8,9,12};
int matrixcheck[] = {0,2,3,4,5,6,7,8,9}; 

byte uno[8]= {				
  B00010000,				
  B00110000,
  B00010000,
  B00010000,
  B00010000,
  B00010000,
  B00010000,
  B00111000
};

byte dos[8]= {				
  B00111000,				
  B01000100,
  B00000100,
  B00000100,
  B00001000,
  B00010000,
  B00100000,
  B01111100
};

void mostrar_1(){			// funcion mostrar_1
  for (int i = 0; i < 8; i++) 		// bucle itera 8 veces por el array 
  {
    lc.setRow(0,i,uno[i]);		// establece fila con valor de array uno en misma posicion
  }
}

void mostrar_2(){			// funcion mostrar_2
  for (int i = 0; i < 8; i++)  		// bucle itera 8 veces por el array
  {
    lc.setRow(0,i,dos[i]);		// establece fila con valor de array dos en misma posicion
  }
}

// Se encarga de revisar que haya un ganador.
int chequeador(){
  for (int i = 0; i < 3; i++) {
    if(matrixcheck[i] == matrixcheck[i+3] && matrixcheck[i] == matrixcheck[i+6]){
      ganador = matrixcheck[i];
    }
  }
  for (int i = 0; i < 7; i=i+3) {
    if(matrixcheck[i] == matrixcheck[i+1] && matrixcheck[i] == matrixcheck[i+2]){
      ganador = matrixcheck[i];
    }
  }
  for (int i = 0; i < 3; i=i+2) {
    if(matrixcheck[i] == matrixcheck[i+4] && matrixcheck[i] == matrixcheck[i+8]){
      ganador = matrixcheck[i];
    }
  }
  if (ganador == 1){
    return 1;
  }
  if (ganador == -1){
    return 2;
  }
  return 0;
}

byte readButtons() {
  senal = 0;
  while (true) {
    for (byte i = 0; i < 9; i++) {
      byte buttonPin = buttonPins[i];
      if (digitalRead(buttonPin) == LOW) {
        delay(100);
         senal = 1; 
      }
      if(senal == 1){
        Serial.println("se presiono");
        matrixcheck[i] = control;
        control = control *-1;
        pause = true;
        return i;
      }
      }
    }
    delay(1);
  }

// De acuerdo al pulsador se encienden las siguientes coordenadas
void prender(int value){
  switch (value) {
  case 0:
    x = 0;
    y = 0;
    x1 = 0;
    y1 = 1;
    x2 = 1;
    y2 = 1;
    x3 = 1;
    y3 = 0;
    break;
  case 1:
    x = 3;
    y = 0;
    x1 = 3;
    y1 = 1;
    x2 = 4;
    y2 = 1;
    x3 = 4;
    y3 = 0;
    break;
  case 2:
    x = 6;
    y = 0;
    x1 = 6;
    y1 = 1;
    x2 = 7;
    y2 = 1;
    x3 = 7;
    y3 = 0;
    break;
  case 3:
    x = 0;
    y = 3;
    x1 = 0;
    y1 = 4;
    x2 = 1;
    y2 = 4;
    x3 = 1;
    y3 = 3;
    break;
  case 4:
    x = 3;
    y = 3;
    x1 = 3;
    y1 = 4;
    x2 = 4;
    y2 = 4;
    x3 = 4;
    y3 = 3;
    break;
  case 5:
    x = 6;
    y = 3;
    x1 = 6;
    y1 = 4;
    x2 = 7;
    y2 = 4;
    x3 = 7;
    y3 = 3;
    break;
  case 6:
    x = 0;
    y = 6;
    x1 = 0;
    y1 = 7;
    x2 = 1;
    y2 = 7;
    x3 = 1;
    y3 = 6;
    break;
  case 7:
    x = 3;
    y = 6;
    x1 = 3;
    y1 = 7;
    x2 = 4;
    y2 = 7;
    x3 = 4;
    y3 = 6;
    break;
  case 8 :
    x = 6;
    y = 6;
    x1 = 6;
    y1 = 7;
    x2 = 7;
    y2 = 7;
    x3 = 7;
    y3 = 6;
    break;
  case -1:
    
    break;
  }
  lc.setLed(0,x,y,true);
  if(control == 1){
    lc.setLed(0,x1,y1,true);
  }
  if(control == -1){
    lc.setLed(0,x2,y2,true);
  }
  lc.setLed(0,x3,y3,true);
  delay(100);
}

void setup() {
  Serial.begin(9600);
  for (byte i = 0; i < 9; i++) {
    pinMode(buttonPins[i], INPUT);
  }
  lc.shutdown(0,false);			// enciende la matriz
  lc.setIntensity(0,4);			// establece brillo
  lc.clearDisplay(0);
}

// De acuerdo al ganador la matriz imprime un número, o sigue en estado de juego...
// the loop function runs over and over again forever
void loop() {
  value = readButtons();
  prender(value);
  if(chequeador()==1){
    lc.clearDisplay(0);
    delay(100);
    mostrar_1();				// llama funcion mostrar_1
    control = true;
    Serial.print("Gana 1");
    delay(5000);
  }
  if(chequeador()==2){
    lc.clearDisplay(0);
    delay(100);
    mostrar_2();
    control = true;
    Serial.print("Gana 2");
    delay(5000);
  }  
  if(pause == true){
    if(control == 1){
    Serial.print("Turno de Jugador 1");
  }
  if(control == -1){
    Serial.print("Turno de Jugador 2");
  }
  pause = false;
  }
}

De antemano me disculpo por el desorden del montaje y si me equivoque en crear el código, es la primera vez que tengo contacto con esta tecnología muchas gracias por su atención y tiempo de antemano.

No uses el pin 12 porque tmb esta comprometido con la comunicación SPI.
image
Como verás es una entrada SPI y mas alla lque no esta en sincronía quien dice que te genere alguna cosa rara.
cambia ese pin 12 por otro disponible, usa un A4 o A5 por ejemplo.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.