O Arduino é bem versátil e pode ser utilizado para diversas aplicações. Uma bem interessante é a criação de jogos ou mini-games com a plaquinha. Portanto, neste post, vamos criar um jogo utilizando o Arduino e alguns componentes simples. Assista o vídeo abaixo para ver o mini-game finalizado.
Ideia e informações importantes
Primeiro, precisamos definir como será o mini-game e quais componentes iremos utilizar. Minha ideia é fazer um jogo de ritmo, estilo o Guitar Hero (um dos mais famosos desse estilo). E pretendo criar algo simples, que não exija componentes difíceis de encontrar ou um código de mil linhas.
Parte visual
Sendo assim, para a parte visual que dita o ritmo, vou utilizar LEDs. Poderia utilizar um display ou a matriz de LED, mas ambos complicariam o projeto. O interessante de utilizar um display é que eu poderia mostrar o placar do jogo e as frases de interação muito facilmente. A ideia é que tenham 3 fileiras de LEDs com 3 LEDs em cada. E cada fileira representa um ‘ritmo’ que o jogador deve acompanhar. Portanto, os LEDs de cada fileira vão acendendo do começo ao fim indicando o ritmo que a pessoa deve seguir, conforme imagem abaixo:
Dessa forma, quando a fileira chegar na posição 3, a pessoa deve acertar o ritmo. Se ela fizer isso, ela ganha ponto.
Controle
Para controlar o mini-game, vou utilizar um potenciômetro linear. Isso, porque ele é simples de ser encontrado, é fácil de utilizar e cria uma interação com o jogo que pode ser divertida e desafiadora. Eu poderia utilizar também um acelerômetro ou botões para fazer a interação entre a pessoa e o jogo. Como serão três fileiras, dividirei o potenciômetro em três partes e cada uma será correspondente ao acionamento de cada fileira. Por exemplo: se a fileira 1 chegar na posição 3, a pessoa deve mover o potenciômetro para a esquerda.
Sinalização sonora
Por fim, é interessante ter um elemento sonoro para indicar ao jogador que ele errou ou acertou a sequência ou até que o jogo encerrou. A forma mais fácil é utilizar um buzzer ou então um alto-falante.
Com tudo isto em mente, podemos dar início ao nosso projeto.
Circuito
Montagem
Como o objetivo é utilizar 9 LEDs, montar isso em uma protoboard comum pode ser complicado por causa do espaço. Para contornar isso e deixar os componentes bem espaçados, vou usar uma protoboard grande. Fiz uma organização previa dos componentes para ver como tudo vai ficar em questão de espaço. Veja a imagem abaixo:
Coloquei os LEDs de forma que eles ficassem bem separados para ter uma sensação visual mais agradável possível e não dificultar a ligação. Eles já estão organizados em fileiras na imagem. Eu utilizei as mesmas cores da imagem que mostrei no tópico anterior (difícil saber por essa imagem já que é tudo transparente).
O potenciômetro eu posicionei de forma a facilitar o entendimento da dinâmica do mini-game. Minha ideia é que: se ele estiver para a esquerda ele aciona o ‘ritmo’ da fileira 1; se estiver no meio aciona a fileira 2; e se estiver para a direita ele aciona a fileira 3. Ou seja, essa lógica está de acordo com seu posicionamento na plaquinha.
Por fim, a posição do buzzer não importa muito. Desde que ele não esteja tampado e dê pra ouví-lo tranquilamente, está tudo certo. Agora é só planejar o circuito e fazer a ligação.
Ligação
A imagem pode assustar a princípio. Porém, garanto que o circuito é bem simples e está de acordo com o que vimos em outros posts do site. Vamos por partes para facilitar o entendimento:
- LEDs
- Basta interligar o cátodo (negativo) de todos e ligar no GND do Arduino
- O ânodo de cada um deve ser ligado a um resistor (pode ser de outro valor acima de 220Ω)
- A outra ponta do resistor é ligada em um pino digital do Arduino da seguinte forma: os LEDs da primeira fileira são ligados nos pinos 3, 4 e 5. Sendo que o LED da 1ª ordem de acendimento é ligado no pino 3, o da 2ª ordem no pino 4 e o da 3ª ordem no pino 5. A mesma lógica se repete para os LEDs da fileira 2 e 3, com os da 2ª fileira ligados nos pinos 6,7 e 8. E os da 3ª fileira ligados nos pinos 9, 10 e 11
- Essa ordem descrita acima facilitará bastante na hora de programar
- Buzzer
- O positivo do buzzer deve ser ligado no pino digital 2. No meu modelo existe um + indicando o positivo. Se no seu não houver, ligue em qualquer ponta do buzzer.
- A outra ponta do buzzer deve ser ligada no GND do Arduino
- Potenciômetro
- As extremidades devem ser ligadas, uma no GND e outra no 5v do Arduino
- O pino central deve ser ligado no pino analógico A0 do Arduino
- O valor do potenciômetro pode ser qualquer um. A lógica que utilizaremos apenas pegara os intervalos de tensão em cima do pino central.
Veja a imagem abaixo da protoboard depois da montagem:
Explicação da programação
A maneira que fiz o código é consequência do raciocínio que desenvolvi, mas com certeza você pode pensar em outra forma de criar as lógicas do código.
Para simplificar o entendimento do programa e facilitar o desenvolvimento, vou dividir o programa em várias funções diferentes. E vou explicar as partes fundamentais. O restante você deve ser capaz de entender lendo os comentários que deixei ao longo do código.
Obs.: Muitas das variáveis que vou comentar foram criadas no início do código, pois são utilizadas em quase toda parte da programação.
Configurações dos pinos
A primeira coisa a ser feita é declarar os pinos correspondentes aos LEDs, buzzer e potenciômetro.
1 2 3 4 5 6 7 8 | //Declara as variaveis para controlar os LEDs int ledsLaranja[3] = {3,4,5}; //LEDs da fileira 1 int ledsVerde[3] = {6,7,8}; //LEDs da fileira 2 int ledsAzul[3] = {9,10,11}; //LEDs da fileira 3 //Define os pinos para o buzzer e o potenciômetro #define buzzer 2 #define controle A0 |
Criei um vetor para designar os pinos, pois isso facilitará a lógica de acionamento deles. Depois disso, resta definir eles como saída ou entrada no setup. Na parte de definir os LEDs como saída, eu aproveitei para deixar todos desligados (estado inicial do mini-game).
1 2 3 4 5 6 7 8 9 10 11 12 13 | void setup() { int i; for(i=0; i < 3;i++){ //Define os LEDs como saida pinMode(ledsLaranja[i], OUTPUT); pinMode(ledsVerde[i], OUTPUT); pinMode(ledsAzul[i], OUTPUT); digitalWrite(ledsLaranja[i], LOW); digitalWrite(ledsVerde[i], LOW); digitalWrite(ledsAzul[i], LOW); } pinMode(buzzer, OUTPUT); pinMode(controle, INPUT); |
Mensagens de aviso
Decidi utilizar o monitor serial para o jogador saber a hora que o jogo começou e o seu placa no fim do jogo. Por isso os pinos 0 e 1 não foram utilizados.
Em relação a programação, essa parte é bem simples. Bastou inciar a comunicação serial no setup (Serial.begin(9600)) e mandar escrever os comandos ao longo do código.
Acionamento dos LEDs
Criarei uma função chamada void acionarFileiras().
Para fazer o acionamento dos LEDs, vou seguir a lógica da imagem no início do post: o 1º LED da fileira se acende; depois de um tempo ele se apaga e o do meio acende; depois o do meio apaga e o ultimo LED acende; depois o último LED se apaga.
Problema de interferência
Aqui temos um grande problema: enquanto a sequência de acionamento ocorre, o restante do programa deve rodar sem interrupção. Portanto, vou utilizar uma técnica para rodar duas coisas ao mesmo tempo (veja o post). Os procedimentos que descreverei a seguir se aplicam às 3 fileiras, mas mostrarei só o caso da fileira 1.
O primeiro passo é criar uma variável de tempo para criar o delay que não atrapalha nas demais funções. Dei o nome de tempoFileira1 à variável. Além disso, é interessante que o tempo da sequência dos LEDs seja ajustável para que uma hora seja mais rápido e outra seja mais lento. Sendo assim, criei outra variável chamada delayFileira1. Com essas variáveis, criei o seguinte condicional:
if(abs(millis()-tempoFileira1) > delayFileira1){
Isso garante que o que for rodar dentro do if não atrapalhe o restante do código.
Acender e apagar
Para o código saber em qual ordem de acionamento a fileira está, criei uma variável chamada fileira1. Essa variável pode ter 5 estados:
- Se for igual à:
- 0: inicio da sequência. Quer dizer que o programa está mandando aquela sequência ser iniciada
- 1: passo 1 da sequência
- 2: passo 2 da sequência
- 3: passo 3 da sequência (apaga o último LED e da barulho de erro
- 4: sequência parada ou inativa
Essa parte do código não tem muito mistério. A cada passo, os LEDs são acionados e apagados e a variável fileira1 é incrementada 1 passo, para que no próximo delay o próximo passo seja executado. O único passo diferente é o 3, que possui o barulho de erro. Para isso, utilizei a função tone() do Arduino para acionar o buzzer:
1 2 3 4 5 | }else if(fileira1 == 3){ digitalWrite(ledsLaranja[2], LOW); tone(buzzer, 370, 200); //Som para indicar que a pessoa 'perdeu' o LED fileira1 ++; } |
370 é a frequência para o Fa# e 200 é a duração do som (em ms). Usei essa frequência por motivos aleatórios mesmo.
O último detalhe importante dessa função é garantir o delay, igualando a variável tempoFileira1 ao millis() em todo passo que não seja o 3:
if (fileira1 < 3){ //Garante que o ultimo acionamento nao atrapalhe
tempoFileira1 = millis();
}
Leitura do potenciômetro
Criarei uma função chamada void lerPotenciometro().
Detecção da posição
Para detectar a posição do potenciômetro, basta fazer a leitura analógica do pino. E, com base nisso, dividir o valor em três partes. Lembrando, a leitura analógica retorna valores de 0 a 1023 (0 a 5v). Como o valor não é constante e ficar variando mais ou menos 10 unidades, criarei um gap (buraco) entre cada faixa de posição. Defini arbitrariamente as seguintes faixas:
- Valores de:
- 0 – 320: posição 2 (potenciômetro para direita no meu caso)
- 340 – 660: posição 1 (potenciômetro no meio)
- 680 – 1023: posição 0 (potenciômetro para esquerda no meu caso)
Ou seja, basta fazer a leitura e criar um condicional para testar em qual posição o potenciômetro está. Eu usei a própria variável de leitura para ‘setar’ (definir) a posição do potenciômetro:
int pot = analogRead(controle);
if(pot >= 680){
pot = 0; //Posição 0
} …
Detectar acerto ou erro do ritmo
Na função anterior, vimos que a variável fileira1 informa em qual posição da sequência os LEDs da fileira 1 estão. Ou seja, basta utilizar essa variável para detectar se a pessoa acertou o ‘ritmo’: se a sequência de acionamento do LED for a 3ª posição e o potenciômetro estiver na posição 0 (deslocado para a esquerda), então o jogador acertou aquela ‘nota’.
Como a parte que detecta se o jogador errou está na função anterior, não precisamos nos preocupar com isso. Exceto, com o fato de que a variável fileira1 deve ser ‘setada’ para 4 (inativa) para que o jogo não reconheça que a pessoa errou. E, para evitar atrasos, a variavel tempoFileira1 deve ser ‘resetada’ sendo igualada a 0.
1 2 3 4 5 6 7 8 | if(fileira1 == 3 && pot == 0){ //Se o LED da fileira 1 tiver chegado e a posição do potenciômetro for a 0 fileira1 = 4; //Deixa a fileria desativada digitalWrite(ledsLaranja[2], LOW); tempoFileira1 = 0; tone(buzzer, 494, 150); //Som para indicar que a pessoa acertou placar += ((float)1000/delayFileira1)*25; //A pessoa ganha mais ponto quanto mais rapido for o tempo do LED chegar (quanto menor for o delay entre os acionamento, por isso fica 1/delay) } |
Para acionar o buzzer utilizei a função tone() também. Dessa vez com uma frequência de 494 que corresponde ao ‘Si’, e uma duração de 150ms. A escolha foi aleatória. Por fim, criei uma variável placar (no início do programa) e aqui eu somei um valor a ela. Esse valor é inversamente proporcional ao delay de acionamento da sequência dos LEDs. Isso, pois quanto mais rápido é o acionamento e a pessoa acerta, mais pontos ela merece.
Controle do jogo
Criarei uma função chamada void controleJogo().
Essa função é o coração do jogo. Ela é responsável por ditar o ritmo do jogo, dizendo quando as peças devem aparecer ou não. Essa função tem o mesmo problema da função de acionamento dos LEDs, que é: possui delays e deve funcionar sem atrapalhar o restante do código. A abordagem é a mesma: criar uma variável de tempo (tempoJogo) para auxiliar nesse problema. Aqui o delay entre cada funcionamento também é definido por uma variável, chamada delayJogo:
if (abs(millis()-tempoJogo) > delayJogo){
Como o jogo tem um limite máximo de peças, isso tudo foi envolvido em um condicional para testar se a contagem de ‘notas’ ainda não chegou ao limite:
if(contagem != contagemMax){
Aparecimento de notas
O aparecimento das notas é algo que deve ser aleatório. Portanto, vou aproveitar da função random() do Arduino. Primeiro, precisei adicionar o seguinte comando no setup():
randomSeed(analogRead(1));
Esse comando diz que os números aleatórios serão gerados com base no ruído lido pela porta analógica A1 (já que o pino está desconectado e está flutuando). Agora é só fazer o seguinte: gerar um número aleatório de 0 a 2 (entre 0 e 3). Se for 0, aciona a 1ª fileira, se for 1 aciona a 2ª e se for 2 aciona a 3ª. Para acionar a fileira é só mandar a variável fileira1 para 0 (para o caso da fileira1) e gerar um delay aleatório para a sequência de acionamento.
1 2 3 4 | if(aleatorio == 0){ fileira1 = 0; delayFileira1 = random(limiteInf,limiteSup); //Define o delay da fileira como sendo aleatorio } |
Limite inferior e superior são duas variáveis para controlar os valores com base na dificuldade que a pessoa escolhe. No início do código eu defini valores arbitrários para esses limites. Por exemplo, se for a dificuldade médio, o delay varia entre 250 e 500ms.
O outro if dentro dessa parte do código é mais complicado. Mas ele serve basicamente para testar se o número aleatório gerado não foi exatamente o de uma fileira que já está sendo acionada. Se for o caso, ele tenta encontrar a primeira fileira que estiver livre e aciona ela. Se nenhuma estiver livre, o programa não faz nada até o próximo delay.
Fim de jogo
Se a contagem de ‘notas’ estiver chegado no limite, a função verifica se as três fileiras estão no estado final (fileira1, fileira2 e fileira3 são iguais a 4 – que é o estado desativado). Se for o caso, manda uma mensagem no monitor serial mostrando o placar e toca uma musica no buzzer indicando o fim de jogo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | else if(fileira1 == 4 && fileira2 == 4 && fileira3 == 4){ delay(500); Serial.print("Fim de jogo!\nVoce fez: "); Serial.print(placar); Serial.println(" pontos\nResete a plaquinha para comecar outro jogo."); //Toca uma musiquinha pra indicar o fim tone(buzzer, 262, 200); //Do delay(200); tone(buzzer, 294, 200); //Re delay(200); tone(buzzer, 330, 400); //Mi delay(400); tone(buzzer, 349, 400); //Fa delay(400); tone(buzzer, 349, 400); //Fa delay(400); tone(buzzer, 349, 600); //Fa fimDeJogo=true; } |
Código completo
Copie, cole e divirta-se! Se algo não funcionar, veja a explicação do tópico acima, pois o potenciômetro pode estar com as faixas trocadas ou algo assim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | //Declara as variaveis para controlar os LEDs int ledsLaranja[3] = {3,4,5}; int ledsVerde[3] = {6,7,8}; int ledsAzul[3] = {9,10,11}; //Define os pinos para o buzzer e o potenciômetro #define buzzer 2 #define controle A0 //Variaveis para controlar o acionamento dos LEDs unsigned long tempoFileira1 = 0; //Variaveis auxiliares do tempo entre o acionamento de cada LED unsigned long tempoFileira2 = 0; unsigned long tempoFileira3 = 0; int fileira1=4; //Variaveis para saber a posição dos LEDs int fileira2=4; int fileira3=4; int delayFileira1 = 1000; //Variaveis para comandar o tempo de avanço dos LEDs int delayFileira2 = 1000; int delayFileira3 = 1000; //Variaveis para controlar o jogo unsigned long tempoJogo=0; //Variavel auxiliar do tempo entre o aparecimento das peças int delayJogo = 1000; //Delay entre cada aparecimento de peças long aleatorio = 0; //Variavel auxiliar para os numeros aleatorios int contagemMax; //Contagem maxima de peças que o jogo terá int contagem=0; //Contagem de peças que ja passaram int placar=0; //Pontuação bool fimDeJogo = false; //Variavel para saber se o jogo acabou //ESCOLHA A DIFICULDADE AQUI // 0 - Facil // 1 - Medio // 2 - Difícil int dificuldade = 2; int limiteInf = 500; int limiteSup = 1000; void setup() { int i; for(i=0; i < 3;i++){ //Define os LEDs como saida pinMode(ledsLaranja[i], OUTPUT); pinMode(ledsVerde[i], OUTPUT); pinMode(ledsAzul[i], OUTPUT); digitalWrite(ledsLaranja[i], LOW); digitalWrite(ledsVerde[i], LOW); digitalWrite(ledsAzul[i], LOW); } pinMode(buzzer, OUTPUT); pinMode(controle, INPUT); //Comandos de controle do jogo: randomSeed(analogRead(1));//Comando base para ajudar na geração de numeros aleatorios contagemMax = random(25,30); //Define a contagem maxima de notas do jogo if(dificuldade == 0){ limiteInf = 750; limiteSup = 1000; }else if(dificuldade == 1){ limiteInf = 250; limiteSup = 500; }else{ limiteInf = 200; limiteSup = 250; } Serial.begin(9600); Serial.print("Prepare-se, pois o jogo esta prestes a comecar...\nA contagem de pecas e: "); Serial.println(contagemMax); delay(3000); Serial.println("Comecou!"); } void loop() { while (fimDeJogo == false){ controleJogo(); acionarFileiras(); lerPotenciometro(); } } void controleJogo(){ if(contagem != contagemMax){ if (abs(millis()-tempoJogo) > delayJogo){ int aleatorio = random(3); if((aleatorio == 0 && fileira1 != 4) || (aleatorio == 1 && fileira2 != 4) || (aleatorio == 2 && fileira3 != 4)){ //Se a fileira escolhida ja estiver ocupada //Encontra a primeira fileira livre if(fileira1 == 4){ aleatorio = 0; }else if(fileira2 == 4){ aleatorio = 1; }else if(fileira3 == 4){ aleatorio = 2; }else{ aleatorio = 4; //Se não tiver nenhuma livre, define como 4 e nao faz nada } } //Ativa os LEDs (colocando na posiçao 0) da fileira escolhida if(aleatorio == 0){ fileira1 = 0; delayFileira1 = random(limiteInf,limiteSup); //Define o delay da fileira como sendo aleatorio }else if(aleatorio == 1){ fileira2 = 0; delayFileira2 = random(limiteInf,limiteSup); }else if(aleatorio == 2){ fileira3 = 0; delayFileira3 = random(limiteInf,limiteSup); } delayJogo = random(limiteInf,limiteSup); //O delay até o proximo LED varia de 500ms a 1000ms tempoJogo = millis(); if(aleatorio != 4){ contagem++; } } }else if(fileira1 == 4 && fileira2 == 4 && fileira3 == 4){ //Se a contagem chegou ao limite, espera todas as notas irem até o fim delay(500); Serial.print("Fim de jogo!\nVoce fez: "); Serial.print(placar); Serial.println(" pontos\nResete a plaquinha para comecar outro jogo."); //Toca uma musiquinha pra indicar o fim tone(buzzer, 262, 200); //Do delay(200); tone(buzzer, 294, 200); //Re delay(200); tone(buzzer, 330, 400); //Mi delay(400); tone(buzzer, 349, 400); //Fa delay(400); tone(buzzer, 349, 400); //Fa delay(400); tone(buzzer, 349, 600); //Fa fimDeJogo=true; } } void lerPotenciometro(){ //Função que retorna a posição do controle (potenciômetro) //Faixas: //0 - 320 retorna 0 //340 - 660 retorna 1 //680 - 1023 retorna 2 int pot = analogRead(controle); //Lê o potenciômetro if(pot >= 680){ //Se for maior que 680 pot = 0; }else if(pot >= 340 && pot <= 660){ //Se for maior que 340 e menor que 660 pot = 1; }else if(pot <=320){ //Se for menor que 320 pot = 2; } if(fileira1 == 3 && pot == 0){ //Se o LED da fileira 1 tiver chegado e a posição do potenciômetro for a 0 fileira1 = 4; //Deixa a fileria desativada digitalWrite(ledsLaranja[2], LOW); tempoFileira1 = 0; tone(buzzer, 494, 150); //Som para indicar que a pessoa acertou placar += ((float)1000/delayFileira1)*25; //A pessoa ganha mais ponto quanto mais rapido for o tempo do LED chegar (quanto menor for o delay entre os acionamento, por isso fica 1/delay) } if(fileira2 == 3 && pot == 1){ //Se o LED da fileira 1 tiver chegado e a posição do potenciômetro for a 0 fileira2 = 4; //Deixa a fileria desativada digitalWrite(ledsVerde[2], LOW); tempoFileira2 = 0; tone(buzzer, 494, 150); //Som para indicar que a pessoa acertou placar += ((float)1000/delayFileira2)*25; //A pessoa ganha mais ponto quanto mais rapido for o tempo do LED chegar (quanto menor for o delay entre os acionamento, por isso fica 1/delay) } if(fileira3 == 3 && pot == 2){ //Se o LED da fileira 1 tiver chegado e a posição do potenciômetro for a 0 fileira3 = 4; //Deixa a fileria desativada digitalWrite(ledsAzul[2], LOW); tempoFileira3 = 0; tone(buzzer, 494, 150); //Som para indicar que a pessoa acertou placar += ((float)1000/delayFileira3)*25; //A pessoa ganha mais ponto quanto mais rapido for o tempo do LED chegar (quanto menor for o delay entre os acionamento, por isso fica 1/delay) } } void acionarFileiras(){ if(abs(millis()-tempoFileira1) > delayFileira1){ //Primeira fileira if (fileira1 < 3){ //Garante que o ultimo acionamento nao atrapalhe tempoFileira1 = millis(); } if(fileira1 == 0){ digitalWrite(ledsLaranja[0], HIGH); digitalWrite(ledsLaranja[2], LOW); fileira1 ++; }else if(fileira1 == 1){ digitalWrite(ledsLaranja[0], LOW); digitalWrite(ledsLaranja[1], HIGH); fileira1 ++; }else if(fileira1 == 2){ digitalWrite(ledsLaranja[1], LOW); digitalWrite(ledsLaranja[2], HIGH); fileira1 ++; }else if(fileira1 == 3){ digitalWrite(ledsLaranja[2], LOW); tone(buzzer, 370, 200); //Som para indicar que a pessoa 'perdeu' o LED fileira1 ++; } } if(abs(millis()-tempoFileira2) > delayFileira2){ //Segunda fileira if (fileira2 < 3){ //Garante que o ultimo acionamento nao atrapalhe tempoFileira2 = millis(); } if(fileira2 == 0){ digitalWrite(ledsVerde[0], HIGH); digitalWrite(ledsVerde[2], LOW); fileira2 ++; }else if(fileira2 == 1){ digitalWrite(ledsVerde[0], LOW); digitalWrite(ledsVerde[1], HIGH); fileira2 ++; }else if(fileira2 == 2){ digitalWrite(ledsVerde[1], LOW); digitalWrite(ledsVerde[2], HIGH); fileira2 ++; }else if(fileira2 == 3){ digitalWrite(ledsVerde[2], LOW); tone(buzzer, 370, 200); //Som para indicar que a pessoa 'perdeu' o LED fileira2 ++; } } if(abs(millis()-tempoFileira3) > delayFileira3){ //Terceira fileira if (fileira3 < 3){ //Garante que o ultimo acionamento nao atrapalhe tempoFileira3 = millis(); } if(fileira3 == 0){ digitalWrite(ledsAzul[0], HIGH); digitalWrite(ledsAzul[2], LOW); fileira3 ++; }else if(fileira3 == 1){ digitalWrite(ledsAzul[0], LOW); digitalWrite(ledsAzul[1], HIGH); fileira3 ++; }else if(fileira3 == 2){ digitalWrite(ledsAzul[1], LOW); digitalWrite(ledsAzul[2], HIGH); fileira3 ++; }else if(fileira3 == 3){ digitalWrite(ledsAzul[2], LOW); tone(buzzer, 370, 200); //Som para indicar que a pessoa 'perdeu' o LED fileira3 ++; } } } |
Projeto interessante… vou tentar fazer!
Recomendo viu. Apesar de simples é bem divertidozinho.
Muito show. Vou tentar fazer com Sistema de Tempo Real para complicar um pouco rsrs
Deve ficar legal pra caramba. Qualquer coisa você faz um vídeo e manda o link aqui que eu vou querer ver como ficou.