Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

nao retorna INDETERMINADO

#define LED_VERMELHO 4
#define LED_VERDE 2
#define LED_AMARELO 3
#define LED_AZUL 5

#define BOTAO_VERMELHO 10
#define BOTAO_AZUL 11
#define BOTAO_VERDE 8
#define BOTAO_AMARELO 9

#define INDETERMINADO -1

#define UM_SEGUNDO 1000
#define MEIO_SEGUNDO 500

#define TAMANHO_SEQUENCIA 4

int sequenciaLuzes[TAMANHO_SEQUENCIA];

int rodada= 0;

int leds_respondidos=0;

enum Estados{
  PRONTO_PARA_PROX_RODADA,
  USUARIO_RESPONDENDO,
  JOGO_FINALIZADO_COM_SUCESSO,
  JOGO_FINALIZADO_COM_FALHA
};

void setup() {

  iniciaPorta();
  Serial.begin(9600);
  iniciaJogo();

}

void iniciaPorta(){
  pinMode(LED_VERDE,OUTPUT);
  pinMode(LED_AMARELO,OUTPUT);
  pinMode(LED_VERMELHO,OUTPUT);  
  pinMode(LED_AZUL,OUTPUT);

  pinMode(BOTAO_VERMELHO, INPUT_PULLUP);
  pinMode(BOTAO_VERDE, INPUT_PULLUP);
  pinMode(BOTAO_AZUL, INPUT_PULLUP);
  pinMode(BOTAO_AMARELO, INPUT_PULLUP);
}

void iniciaJogo(){

  int jogo= analogRead(0);
  randomSeed(jogo);
  for(int i= 0; i< TAMANHO_SEQUENCIA; i++){
    sequenciaLuzes[i] = sorteiaCor();
  }

}

int sorteiaCor(){
  return random(LED_VERDE,LED_AZUL+1);
}
void loop() { 
  switch(estadoAtual()){
    case PRONTO_PARA_PROX_RODADA
       :Serial.println("pronto para proxima rodada");
       preparaNovaRodada();

       break;
    case USUARIO_RESPONDENDO
       :Serial.println("usuario respondendo");
       processaRespostaUsuario();
       break;
    case JOGO_FINALIZADO_COM_SUCESSO
       :Serial.println("jogo finalizado com sucesso");
       break;
    case JOGO_FINALIZADO_COM_FALHA
       :Serial.println("jogo finalizado com falha");
       break;
  }

  delay(500);

}

void processaRespostaUsuario(){
  int resposta= checaResposta();

  if(resposta == INDETERMINADO){
    return;
  }
  if(resposta == sequenciaLuzes[leds_respondidos]){
    leds_respondidos++;
  }else{
    Serial.println("resposta errada");
  }


}

void preparaNovaRodada(){
  rodada++;
  leds_respondidos= 0;
  if(rodada <= TAMANHO_SEQUENCIA){
    tocaLedsDaRodada();
  }

}
int estadoAtual(){
  if(rodada <= TAMANHO_SEQUENCIA){
    if(leds_respondidos == rodada){
      return PRONTO_PARA_PROX_RODADA;
    }else{
      return USUARIO_RESPONDENDO;
    }
  } 
  else{
    return JOGO_FINALIZADO_COM_SUCESSO;
  }

  return JOGO_FINALIZADO_COM_FALHA;

}

void tocaLedsDaRodada(){

  for(int i=0; i < rodada; i++){
    piscaLed(sequenciaLuzes[i]);
  }

}


int checaResposta(){
  if(digitalRead(BOTAO_VERMELHO) == LOW){
    return piscaLed(LED_VERMELHO);
  }
  if(digitalRead(BOTAO_AMARELO) == LOW){
    return piscaLed(LED_AMARELO);
  }
  if(digitalRead(BOTAO_AZUL) == LOW){
    return piscaLed(LED_AZUL);
  }
  if(digitalRead(BOTAO_VERDE) == LOW){
    return piscaLed(LED_VERDE);
  }

  return INDETERMINADO;

}

void piscaSequencia1(){
   piscaLed(LED_VERDE);
   piscaLed(LED_AMARELO);
  piscaLed(LED_VERMELHO);
  piscaLed(LED_AZUL);
  delay(500);
}
void piscaSequencia2(){
  digitalWrite(LED_VERDE,HIGH);
  digitalWrite(LED_AMARELO,HIGH);
  digitalWrite(LED_VERMELHO,HIGH);
  digitalWrite(LED_AZUL,HIGH);
  delay(1000);
  digitalWrite(LED_VERDE,LOW);
  digitalWrite(LED_AMARELO,LOW);
  digitalWrite(LED_VERMELHO,LOW);
  digitalWrite(LED_AZUL,LOW);
  delay(1000);
}

int piscaLed(int portaLed){
  digitalWrite(portaLed,HIGH);
  delay(1000);
  digitalWrite(portaLed,LOW);
  delay(1000);

  return portaLed;
}

O código não está retornando indeterminado. Em vez disso ele só retorna a porta 4(led vermelho) e escreve resposta errada. Além de não deixar o usuário responder ele n roda as outras sequencias. Alguem pode me mostrar o erro?

1 resposta
solução!

Olá Isabel,

A função checaResposta() só deverá retornar indeterminado se as leituras de BOTAO_VERMELHO, BOTAO_AMARELO, BOTAO_VERDE e BOTAO_AZUL indicarem HIGH.

Se ele sempre retorna piscaLed(LED_VERMELHO), significa que sempre que a função checaResposta() é chamada, o sinal nos 4 pinos está sempre em LOW. Como o IF que verifica a porta 4, digitalRead(BOTAO_VERMELHO), é o primeiro a ser avaliado, a função nem chega a verificar os demais IF's.

Se o sinal não muda de LOW para HIGH quando você pressiona os botões, talvez seja necessário verificar a ligação física dos botões.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software