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.

 
1. Introdução

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.

 
2. ASCII

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.

 
3. Newline

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.

 

monitor-serial-abrindo

Abrindo Monitor Serial

 

newline

Newline

 

4. Variáveis

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.

 
5. Serial.available

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.

6. Switch

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.

 
7. Buffer

É 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.

 
8. parse.Int

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.

 
9. Estrutura do programa

Segue a estrutura completa do programa:

  • Variáveis
  • 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.

  • void setup
  • 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:

     

    introducao

    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.

  • void loop
  • 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);).

 
10. Componentes e materiais

  • Um Arduino UNO.
  • Um Cabo USB.

 

placa arduino uno

Arduino UNO

 

cabo usb

Cabo USB

 

11. Montagem

Conecte a placa Arduino com o cabo USB e este, com alguma entrada no computador.

 
12. Upload

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.

 

upload

 

13. Desafio

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:

 
14. Dicas

  • 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.

Produtos
Promoção!
Arduino UnoArduino Uno

Uno SMD – Arduino compatível

R$59,90 R$54,90

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-ultrassonico-distancia

Sensor ultrassônico HC-SR04

R$17,90

Mensure 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

Display LCD 16X2 caracteres com I2C

R$24,90

Nosso 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-830-2Out Of Stock

Protoboard transparente 830 pontos

R$24,90

Protoboard 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.

Deixe uma resposta

Seu endereço de e-mail não será publicado. Campos obrigatórios estão marcados *

limpar formulárioPostar Comentário