
Neste tutorial, iremos aprender a fazer o Math Game, jogo de perguntas e respostas com operações matemáticas (multiplicação e divisão), usando o Monitor Serial.
No tutorial “Monitor Serial”, aprendemos quais caminhos devemos seguir para que o monitor “imprima” mensagens. Agora, o usuário irá interagir com o programa inserindo respostas para as operações matemáticas sorteadas, acusando erro ou acerto e a quantidade de cada um a cada rodada.
Antes de iniciarmos a explicação do programa, vamos entender alguns conceitos importantes e inéditos para quem está começando.
Nosso programa só entende e lê números binários (0 e 1), portanto não é possível interpretar letras ou símbolos e é aí que a tabela ASCII entra: ela “traduz” caracteres que não sejam números.
Em determinado ponto do programa você vai se deparar com o número 10, por exemplo. Ele representa a tecla ENTER na tabela.
Caso você tenha curiosidade, clique aqui para saber quais são as representações para outros caracteres.
Na parte inferior do monitor, à direita, temos dois campos: no primeiro à esquerda selecione Newline ou Nova Linha. Newline é igual à 10 e dez represente a tecla ENTER, ou seja, toda vez que o usuário apertar ENTER o comando irá para nova linha.

Abrindo Monitor Serial

Newline
No tutorial “Jogo Genius”, usamos algumas vezes as variáveis. Elas são chamadas dessa forma porque podem variar ao longo da função, ao contrário dos defines, que são constantes e não mudam.
Definimos uma variável chamada resultado para comparar com a resposta do usuário e ela mudará de valor em uma das funções (isso será detalhado conforme a explicação do programa).
É necessária essa tática, pois o programa sorteará umas das operações matemáticas – divisão ou multiplicação -, e comparará apenas a variável resultado com o valor inserido pelo usuário. Caso mudemos o nome dessa variável o programa não prossegue com o jogo, pois não entende a informação.
Esse termo praticamente significa “se houver algum dado disponível entrando pelo serial…” Seu uso é obrigatório na maioria das vezes para iniciarmos condições e funções.
No Genius, usamos uma quantidade generosa de if e else como condições para que o jogo funcionasse. O switch é um tipo de função que exerce o papel daqueles vários if’s e else’s do jogo, mas de forma mais organizada e limpa. É a função para “chavear” as opções de forma aleatória.
É o armazenamento temporário, onde os dados do serial vão antes do programa ler. Isso é feito para não haver confusão no momento do jogo começar.
Funciona como um “intérprete” de teclas para a tabela ASCII. Como já foi explicado no início, o programa não entende letras e outros símbolos, somente números binários. E como precisamos que ele compare o resultado da operação com a informação digitada pelo usuário, precisamos ter o mesmo “idioma”. Conforme o usuário vai digitando os números, ou até letras, espaço, o programa já interpreta os dados pelo padrão ASCII.
Segue a estrutura completa do programa:
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 |
int tecla_lida = 0; int acertos = 0; int erros = 0; int tipo_de_conta; int fator_1; int fator_2; int resultado; int valor_lido; void setup() { //Inicializa a porta serial Serial.begin(9600); while(!Serial) { ; //Aguarda conexão da porta. Necessário apenas para placas com USB nativa (como o Arduino Leonardo) } //Fim do while Serial.println(); Serial.println("*-------------------------------*"); Serial.println("* JOGO DE PERGUNTAS E RESPOSTAS *"); Serial.println("*-------------------------------*"); Serial.println(); Serial.println("Para as respostas digite apenas numeros e finalize com a tecla enter"); Serial.println("Aperte ENTER quando estiver pronto!"); //Espera o teclado mandar o codigo 10, que é a tecla ENTER while(tecla_lida != 10) { if(Serial.available() > 0) { tecla_lida = Serial.read(); //Read the incoming byte: } //Fim do if } //Fim do while randomSeed(analogRead(0)); //Inicializa o gerador de números aleatórios com um valor qualquer } //Fim do setup void loop() { while(Serial.available() > 0) { //Esvazia o buffer Serial.read(); } Serial.println(); Serial.print("Qual o valor de "); tipo_de_conta = random(1, 3); //Maior ou igual a um e menor que 3 switch(tipo_de_conta) { case 1: //Multiplicação fator_1 = random(1, 10); fator_2 = random(1, 10); resultado = fator_1 * fator_2; Serial.print(fator_1); Serial.print(" x "); Serial.print(fator_2); Serial.println("?"); break; //Fim da multiplicação case 2: //Divisão resultado = random(1, 10); fator_2 = random(1, 10); fator_1 = resultado * fator_2; Serial.print(fator_1); Serial.print(" / "); Serial.print(fator_2); Serial.println("?"); break; //Fim da divisão default: Serial.println(); Serial.println("ERRO: caso não previsto!"); Serial.println(); break; //Fim do default } while(Serial.available() == 0) { ; //Aguarde } valor_lido = Serial.parseInt(); Serial.println(valor_lido); if(valor_lido == resultado) { Serial.println("muito bem"); acertos = acertos + 1; } else { Serial.print("o valor correto era "); Serial.println(resultado); erros = erros + 1; } Serial.print("Acertos: "); Serial.println(acertos); Serial.print("Erros: "); Serial.println(erros); Serial.println(); Serial.println("Vamos tentar outra pergunta"); delay(500); //500 mili segundos = 0,5 segundo } //Fim do "loop" |
- Variáveis
- void setup
- void loop
Como em outros tutoriais vamos começar pelo bloco em que definimos as variáveis.
Repare que algumas atribuímos valor = 0 e outras não. Quando usamos as variáveis logo no começo do programa, no setup ou na comparação de uma função, por exemplo, devemos iniciá-las, ou seja, atribuir um valor, no nosso caso o valor 0. As outras serão utilizadas depois por isso não foram inicializadas, devendo ser finalizadas com um “;” apenas.
Alguns dos elementos neste bloco já foram vistos no tutorial Monitor Serial, como o Serial.begin, que significa “inicia a porta serial”. O primeiro while significa “enquanto Serial não for verdade, faça nada”.
Dentro das chaves do primeiro while, temos apenas um “;” indicando “aguarda conexão da porta”, necessário apenas para placas com USB nativa (como o Arduino Leonardo).
Em seguida temos uma série de Serial.println: estamos mostrando no monitor a introdução do jogo para o usuário:

Introdução do jogo
Quando escrevemos while (tecla_lida !=10), dizemos ao programa “esperar o teclado mandar o código 10, que é a tecla ENTER”. Dentro das chaves desse while estamos ordenando que tecla_lida lerá o dado/ informação que entrar.
O randomSeed já é um velho conhecido nosso do tutorial Genius. Ele inicializa o gerador de números aleatórios com um valor qualquer.
Vamos dividir o loop em três partes principais: while, switch e while.
O primeiro while fornece as seguintes informações para o programa: quando houver algum dado (Serial.available), leia (Serial.read), pule uma linha (Serial.println) e imprima “Qual o valor de” (Serial.print(“Qual o valor de “)).
A próxima linha diz que a conta a ser “sorteada” será menor que 3 ou maior ou igual a 1, ou seja, ele escolherá uma das operações matemáticas que descrevreemos na função switch (tipo_de_conta = random(1, 3)).
Agora vamos descrever quais são as duas – ou mais, se quisermos – operações que serão sorteadas.
Como já explicamos no início, a função switch exerce o mesmo papel daquela quantidade grande de if e else. Vamos entender a operação de multiplicação como case 1 e divisão como case 2.
Na multiplicação usaremos dois elementos, fator_1 e fator_2, que variam entre nove elementos (random(1, 10)). Você se lembra da variável resultado? Ela entra nessas operações e será comparada com a informação que o usuário inserir.
No case 2 – divisão – elaboramos a conta de forma inversa (a forma seria resultado = fator_1/ fator_2) para que o resultado seja um número inteiro. Aqui presenciamos aquele evento da variável “variar”: a variável resultado já não possui o mesmo valor da multiplicação – note o break; logo após a operação de multiplicação, que indica essa quebra. Essa manobra é necessária pois não sabemos qual operação o programa vai sortear – multiplicação ou divisão -, e precisamos ter apenas uma variável que será comparada com o que o jogador enviará, no caso a variável resultado.
Temos apenas dois tipos de operação, caso colocássemos na linha tipo_de_conta = random(1,5), receberíamos a mensagem de erro do default (Serial.println(); Serial.println(“ERRO: caso não previsto!”); Serial.println(); break;), pois estamos dizendo para o programa sortear uma operação dentre quatro, mas na realidade temos apenas dois tipos ainda – multiplicação ou divisão. Podemos alterar essa informação, verifique no Desafio.
A função switch se baseará na variável tipo_de_conta.
Agora vamos analisar a última parte do loop.
O while será usado para comparar o resultado do programa com a informação obtida do usuário. Novamente ordenamos que enquanto nenhum dado for inserido (while (Serial.available() == 0)) aguarde (;).
No início descrevemos qual a função do Serial.parseInt: ele será nosso “tradutor” dos números digitados no teclado para a tabela ASCII, para que o programa consiga comparar os dados (valor_lido = Serial.parseInt()). O programa lê e imprime o valor inserido no monitor (Serial.printLn(valor_lido)).
Se ele acerta (if (valor_lido == resultado)), ele imprime “muito bem” e já contabiliza os acertos (acertos = acertos + 1;). Caso ele erre, o programa mostra qual era o resultado correto e conta o número de erros (Serial.print(“o valor correto era “); Serial.println(resultado); erros = erros + 1;).
A última parte é a informação que o programa vai mostrando ao usuário a cada jogada, mostrando quantos acertos e erros ele teve até aquele momento com um tempo de 0,5 segundo (Serial.print(“Acertos: “); Serial.println(acertos); Serial.print(“Erros: “); Serial.println(erros); Serial.println(); Serial.println(“Vamos tentar outra pergunta”); delay(500);).
- Um Arduino UNO.
- Um Cabo USB.

Arduino UNO

Cabo USB
Conecte a placa Arduino com o cabo USB e este, com alguma entrada no computador.
Lembre-se de conectar o Arduino à entrada USB do seu computador. Verifique se a placa e portas estão já estão configuradas na IDE. Em caso de dúvida, clique aqui e reveja como fazer.
Para efetuar o Upload, clique na seta indicada em vermelho.
Agora que você entendeu como funciona a estrutura do jogo, tente fazer algumas modificações como:
- Adicione mais duas operações (subtração e adição) na função switch.
- Modifique também o valor do random na linha tipo_de_conta = random (1, 3) para (1, 5). Exemplo:
1 2 3 4 5 6 7 8 9 10 |
case 3: // adição fator_1 = random(1, 10); fator_2 = random(1, 10); resultado = fator_1 + fator_2; Serial.print(fator_1); Serial.print("+"); Serial.print(fator_2); Serial.println("?"); break; |
- Caso a placa não responda, desligue-a e reconecte-a ou/e mude a porta (entrada USB) e reconfigure.
- Caso o programa apresente algum erro, verifique linha por linha (ponto e vírgula, erros de escrita, número de porta, letras em maiúsculo e minúsculo fazem diferença).
No próximo tutorial, iremos aprender a fazer o Math Game na protoboard usando um display LCD e botões.
Uno SMD – Arduino compatível
Ideal para iniciantes, o Uno é um Arduino compatível bem capaz, barato e com diversos shields e sensores compatíveis disponíveis. Se você está começando a aprender sobre microcontroladores e Arduinos, esta é a placa perfeita! Ela é a nossa placa principal nos nossos tutoriais de Arduino.
Sensor ultrassônico HC-SR04
R$17,90Mensure distâncias com este ótimo sensor ultrassônico. Faça uma régua eletrônica, um theremin digital, ou até mesmo seus robôs evitarem obstáculos no meio do caminho com este simples e excelente sensor de distância!
Display LCD 16X2 caracteres com I2C
R$24,90Nosso display 16×2 vem equipado com uma placa I2C. Isto significa que com apenas duas conexões para alimentação e mais duas para comunicação pode-se fazer o display funcionar!
Muito mais simples que as conexões paralelas dos outros displays.
Protoboard transparente 830 pontos
R$24,90Protoboard transparente com 830 pontos para prototipagem é ideal para trabalhos elétricos e eletrônicos com Arduino e microcontroladores em geral. É fácil tem muito espaço para conectar leds, cabos, resistores entre outros.
Os pólos negativos e positivos estão bem identificados para facilitar seu trabalho com vários componentes.