#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?