1
resposta

[Dúvida] o arduino estava funcionando normalmente porem parou.

Mesmo usando o meu codigo ou o codigo disponibilizado para dowload no final do curso, o arduino passa as rodadas sem parar e termina o jogo. nao sei qual pode ser o problema. ele estava funcionando normalmente mas sem que eu tivesse alterado o codigo aconteceu isso.

#define LED_VERDE 2 #define LED_AMARELO 3 #define LED_VERMELHO 4 #define LED_AZUL 5 #define INDEFINIDO -1

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

#define UM_SEGUNDO 1000 #define MEIO_SEGUNDO 500

#define TAMANHO_SEQUENCIA 4

enum Estados{ PRONTO_PARA_PROX_RODADA, USUARIO_RESPONDENDO, JOGO_FINALIZADO_SUCESSO, JOGO_FINALIZADO_FALHA, };

int sequenciaLuzes[TAMANHO_SEQUENCIA];

int rodada = 0;

int leds_respondidos = 0;

void setup() { Serial.begin(9600); iniciaPortas(); iniciaJogo(); }

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

int sorteiaCor(){ return random(LED_VERDE, LED_AZUL +1);//2-5(6) }

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

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

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_SUCESSO: Serial.println("jogo finalizado sucesso"); jogoFinalizadoSucesso(); break; case JOGO_FINALIZADO_FALHA: Serial.println("jogo finalizado falha"); jogoFinalizadoFalha(); break; } delay(MEIO_SEGUNDO); }

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

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

if(resposta == INDEFINIDO){ return; }

if(resposta == sequenciaLuzes[leds_respondidos]){ leds_respondidos++; }else{ Serial.println("resposta errada"); rodada = TAMANHO_SEQUENCIA +2; } }

int estadoAtual() { if(rodada <= TAMANHO_SEQUENCIA){ if(leds_respondidos == rodada){ return PRONTO_PARA_PROX_RODADA; }else{ return USUARIO_RESPONDENDO; } }else if(rodada == TAMANHO_SEQUENCIA +1){ return JOGO_FINALIZADO_SUCESSO; }else{ return JOGO_FINALIZADO_FALHA; } }

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

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

void jogoFinalizadoSucesso(){ piscaLed(LED_VERDE); piscaLed(LED_AMARELO); piscaLed(LED_VERMELHO); piscaLed(LED_AZUL); delay(MEIO_SEGUNDO); }

void jogoFinalizadoFalha(){ digitalWrite(LED_VERDE,HIGH); digitalWrite(LED_AMARELO,HIGH); digitalWrite(LED_VERMELHO,HIGH); digitalWrite(LED_AZUL,HIGH); delay(UM_SEGUNDO); digitalWrite(LED_VERDE,LOW); digitalWrite(LED_AMARELO,LOW); digitalWrite(LED_VERMELHO,LOW); digitalWrite(LED_AZUL,LOW); delay(MEIO_SEGUNDO); }

int piscaLed(int portaLed){ digitalWrite(portaLed,HIGH); delay(UM_SEGUNDO); digitalWrite(portaLed,LOW); delay(MEIO_SEGUNDO); return portaLed; }

1 resposta

Olá, Rafael

Uma coisa que você pode tentar é adicionar mais declarações de impressão (Serial.println) em seu código para tentar identificar onde o problema pode estar ocorrendo. Por exemplo, você pode adicionar uma declaração de impressão no início e no final de cada função para ver se todas as funções estão sendo chamadas como esperado.

Outro ponto que você pode verificar é a função estadoAtual(). Esta função é responsável por determinar o estado atual do jogo. Verifique se todos os estados estão sendo retornados corretamente. Por exemplo, se rodada é maior que TAMANHO_SEQUENCIA, o estado deveria ser JOGO_FINALIZADO_SUCESSO ou JOGO_FINALIZADO_FALHA, mas se isso não estiver acontecendo, o jogo pode continuar rodando sem parar.

Além disso, verifique se a função preparaNovaRodada() está sendo chamada corretamente. Esta função é responsável por preparar uma nova rodada do jogo, mas se ela não estiver funcionando corretamente, o jogo pode terminar sem parar.

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