Ayuda! Juego Simon Dice (Arduino Mega)

Hola, finalmente me conseguí el Arduino Mega y estoy trabajando en un juego llamado simon dice
que trata de unas secuencia de luces y bueno imagino que ya habran visto bastantes en internet…

en problema es que, ya tengo ensamblado y todo parece bien, pero parece que tengo la programacion mal, porque no hace lo que se supone que deba hacer, me podrian ayudar porfavor?

Les dejo el codigo que estoy usando

#include <Tone.h>
Tone speakerpin;
int starttune[] = {NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4};
int duration2[] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500};
int note[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};
int duration[] = {100, 100, 100, 300, 100, 300};
boolean button[] = {2, 3, 4}; //The four button input pins
boolean ledpin[] = {8, 9, 10};  // LED pins
int turn = 0;  // turn counter
int buttonstate = 0;  // button state checker
int randomArray[100]; //Intentionally long to store up to 100 inputs (doubtful anyone will get this far)
int inputArray[100]; 


void setup()
{
  Serial.begin(9600);
  speakerpin.begin(13); // speaker is on pin 13

  for(int x=0; x<4; x++)  // LED pins are outputs
  {
    pinMode(ledpin[x], OUTPUT);
  }
 
  for(int x=0; x<4; x++)
  {
    pinMode(button[x], INPUT);  // button pins are inputs
    digitalWrite(button[x], HIGH);  // enable internal pullup; buttons start in high position; logic reversed
  }

  randomSeed(analogRead(0)); //Added to generate "more randomness" with the randomArray for the output function
  for (int thisNote = 0; thisNote < 13; thisNote ++) {
     // play the next note:
     speakerpin.play(starttune[thisNote]);
     // hold the note:
     if (thisNote==0 || thisNote==2 || thisNote==4 || thisNote== 6)
     {
       digitalWrite(ledpin[8], HIGH);
     }
     if (thisNote==1 || thisNote==3 || thisNote==5 || thisNote== 7 || thisNote==9 || thisNote==11)
     {
       digitalWrite(ledpin[9], HIGH);
     }
     if (thisNote==8 || thisNote==12)
     {
       digitalWrite(ledpin[10], HIGH);
     } 
     delay(duration2[thisNote]);
     // stop for the next note:
     speakerpin.stop();
     digitalWrite(ledpin[8], LOW);
     digitalWrite(ledpin[9], LOW);
     digitalWrite(ledpin[10], LOW);
     delay(25);
    }
}
void loop()
{
  for (int y=0; y<=99; y++)
  {
    //function for generating the array to be matched by the player
    digitalWrite(ledpin[8], HIGH);
    digitalWrite(ledpin[9], HIGH);
    digitalWrite(ledpin[10], HIGH);
 
    for (int thisNote = 0; thisNote < 6; thisNote ++) {
     // play the next note:
     speakerpin.play(note[thisNote]);
     // hold the note:
     delay(duration[thisNote]);
     // stop for the next note:
     speakerpin.stop();
     delay(25);
    }
   
    digitalWrite(ledpin[8], LOW);
    digitalWrite(ledpin[9], LOW);
    digitalWrite(ledpin[10], LOW);
    delay(1000);
 
    for (int y=turn; y <= turn; y++)
    { //Limited by the turn variable
      Serial.println(""); //Some serial output to follow along
      Serial.print("Turn: ");
      Serial.print(y);
      Serial.println("");
      randomArray[y] = random(1, 5); //Assigning a random number (1-4) to the randomArray[y], y being the turn count
      for (int x=0; x <= turn; x++)
      {
        Serial.print(randomArray[x]);
     
        for(int y=0; y<4; y++)
        {
     
          if (randomArray[x] == 1 && ledpin[y] == 8)
          {  //if statements to display the stored values in the array
            digitalWrite(ledpin[y], HIGH);
            speakerpin.play(NOTE_G3, 100);
            delay(400);
            digitalWrite(ledpin[y], LOW);
            delay(100);
          }

          if (randomArray[x] == 2 && ledpin[y] == 9)
          {
            digitalWrite(ledpin[y], HIGH);
            speakerpin.play(NOTE_A3, 100);
            delay(400);
            digitalWrite(ledpin[y], LOW);
            delay(100);
          }
 
          if (randomArray[x] == 3 && ledpin[y] == 10)
          {
            digitalWrite(ledpin[y], HIGH);
            speakerpin.play(NOTE_B3, 100);
            delay(400);
            digitalWrite(ledpin[y], LOW);
            delay(100);
          }
        }
      }
    }
    input();
  }
}



void input() { //Function for allowing user input and checking input against the generated array

  for (int x=0; x <= turn;)
  { //Statement controlled by turn count

    for(int y=0; y<4; y++)
    {
     
      buttonstate = digitalRead(button[y]);
   
      if (buttonstate == LOW && button[y] == 2)
      { //Checking for button push
        digitalWrite(ledpin[8], HIGH);
        speakerpin.play(NOTE_G3, 100);
        delay(200);
        digitalWrite(ledpin[8], LOW);
        inputArray[x] = 1;
        delay(250);
        Serial.print(" ");
        Serial.print(1);
        if (inputArray[x] != randomArray[x]) { //Checks value input by user and checks it against
          fail();                              //the value in the same spot on the generated array
        }                                      //The fail function is called if it does not match
        x++;
      }
       if (buttonstate == LOW && button[y] == 3)
      {
        digitalWrite(ledpin[9], HIGH);
        speakerpin.play(NOTE_A3, 100);
        delay(200);
        digitalWrite(ledpin[9], LOW);
        inputArray[x] = 2;
        delay(250);
        Serial.print(" ");
        Serial.print(2);
        if (inputArray[x] != randomArray[x]) {
          fail();
        }
        x++;
      }

      if (buttonstate == LOW && button[y] == 4)
      {
        digitalWrite(ledpin[10], HIGH);
        speakerpin.play(NOTE_B3, 100);
        delay(200);
        digitalWrite(ledpin[10], LOW);
        inputArray[x] = 3;
        delay(250);
        Serial.print(" ");
        Serial.print(3);
        if (inputArray[x] != randomArray[x]) {
          fail();
        }
        x++;
      }
    }
  }
  delay(500);
  turn++; //Increments the turn count, also the last action before starting the output function over again
}

void fail() { //Function used if the player fails to match the sequence

  for (int y=0; y<=2; y++)
  { //Flashes lights for failure
   
    digitalWrite(ledpin[8], HIGH);
    digitalWrite(ledpin[9], HIGH);
    digitalWrite(ledpin[10], HIGH);
    speakerpin.play(NOTE_G3, 300);
    delay(200);
    digitalWrite(ledpin[8], LOW);
    digitalWrite(ledpin[9], LOW);
    digitalWrite(ledpin[10], LOW);
    speakerpin.play(NOTE_C3, 300);
    delay(200);
  }
  delay(500);
  turn = -1; //Resets turn value so the game starts over without need for a reset button
}

Tu eres el experto en el juego porque no PUNTUALIZAS que es lo que no hace bien?

  1. no hace esto
  2. ni esto

bla bla bla

Explica bien tu problema!!

Observaciones:

aunque la imagen sea obvia, yo veo cuatro sectores para pulsar y en tus fotos y código de juego veo 3.
Se que nada tiene que ver con tu pregunta porque podrias hacer una variante de 3 tranquilamente, pero comenzamos con no respetar el juego en su origen y es por que tiene 4 sectores.
Ahora que lo veo, entiendo de que hablas.

Bueno juego solucionado.
Problema en la librería.
Faltaba un switch como te dije al comienzo.
Pruebalo pero suma el boton y el led que faltan

Seguramente no repite o no memoriza la secuencia, amigo… cuanto cuesta explicarse bien!!!

Bueno ya veo lo que pasa, un monton de cosas mal.
Pero tengo problemas con algo básico y es que la librería Tone no se si es la apropiada. Me genera problemas con el monitor serie, asi que debe estar usando el mismo Timer.
Bueno estoy algo decepcionado. Llevo una hora y media con tu código y ahora encuentro esto

Arduino Simon Says

ahora lo pondré en marcha para ver que error cometiste.

SimonDice.rar (10.9 KB)

Cierto, se fue explicar el problema y si en efecto es eso, no se activa la secuencia, pareciera estar atrapado en un demo
y bueno, en realidad no tengo mucho tiempo para poder ir a una electronica (me queda muy lejos de casa) asi que tengo que trabajar con esos 3 leds y botones
y ya habia tratado con el codigo de la pagina que me pusiste ahi y nada
el problema es que todos los codigos que encuentro estan hechos para 4 leds y como aun soy nuevo con la programacion, no se que debo borrar o cambiar para que funcione con 3 leds
me ayudarias con eso porfa?

la verdad no entiendo como no puedes ir a comprar un led, y interruptor y hacerlo como corresponde pero bueno
aca lo resolví o eso creo.
Pruebalo y me dices.

ERROR: hay un error en el random

randomArray[y] = random(1, 4);

corrige el 5 x 4, asi la generación al azar esta limitada

SimonDice3buttons.ino (7.22 KB)

muchisimas gracias, pero tengo otra duda, al activarse la secuencia, las luces no deberian estar apagadas y encenderse la que corresponde a la secuencia?
y dar tiempo para apretar el boton?

ajunto un video.

IMG_3660.MOV (2.92 MB)

Yo arme el circuito como lo vi en tu codigo y me funciona bien.

Mira a ver si coincide con el tuyo?
En mi esquema, las luces se prenden cuando hace la secuencia.
Luego se apagan y comienza la secuencia paso a paso.
Todo lo hace muy lento pero bien.

listo al final pude resolverlo, solo cambie los botones y cable de posicion
por ahi lei que podia ser que los botones estaban mal orientados
y gracias a tu codigo todo funciona bien, una ultima consulta…
ya que este proyecto(es para fisica) va orientado para niños,
seria posible ponerle un sonido como de mario bros?

adjunto foto de los cambios hecho junto al codigo que me diste(cambiado lo del ramdomarray) y del resultado final para que otros lo usen.

IMG_3661.MOV (3.74 MB)

IMG_3662.JPG

SimonDice3buttons.ino (7.22 KB)

aca lo tenes, adapta la melodía al código y listo

gracias por el link!
intentaré colocar la melodia de mario en el calabozo para cuando el usuario pierda la ronda!

Y para la próxima haz como yo, (no sabía nada del juego) claro que al ver la foto lo reconocí, pero usa GOOGLE y si estas abrumado entonces trae las dudas pero uno debe aprender a buscar las soluciones en internet, ya que estan casi siempre.
En inglés seguro, castellano menos posible, pero hay que intentar.
A veces lo dificil es encontrar la palabra o palabras que digan lo que uno quiere en inglés. Mas allá de que sepas inglés como en mi caso, muchas veces debo investigar primero como buscar un tema. Cuando encuentro cómo, listo... toneladas de información siempre.

muchas gracias, en verdad escribir mi duda aqui fue mi ultimo recurso, probe con todo lo que encontre y en realidad se ingles
buscar en google no fue el problema.

y de hecho necesito tu ayuda de nuevo, como dije mas arriba soy un poco nuevo en esto y no tengo idea de en donde introducir el codigo de la cancion de la parte del calabozo:|

Jaja.. bueno dejame ver.

Bien... lo veo y te paso el código corregido.

dale, muchisimas gracias!

bueno para mi no me parece que funcione bien pero escuchalo vos.

SimonDiceMarioBros.ino (9.85 KB)

Me podrias pasar el diagrama de conexion y el codigo completo