Arduino – Interface Através do Monitor Serial

Quando estamos aprendendo a programar, um dos primeiros exercícios que fazemos é a criação de uma calculadora simples que é operada através de linha de comando. Devido à natureza física do Arduino, a realização deste tipo de projeto não é tão comum, mas também é possível através do monitor serial.

Nesta postagem vamos mostrar como criar uma interface de comunicação com o usuário através do monitor serial do Arduino para que seja possível enviar comandos à placa através de um computador. Os princípios que mostraremos aqui podem ser utilizados não apenas para controlar seu Arduino através do computador, mas podem ser adaptados também para controla-lo através de outras placas e outros softwares que utilizem comunicação serial.

O usuário deverá informar qual operação deseja realizar em nossa calculadora e depois inserir dois números que serão os operandos desta operação. As operações disponíveis serão: adição, subtração, multiplicação e divisão.

Componentes necessários

Para seguir este tutorial, você precisará dos seguintes itens:

Esta prática também deve funcionar com qualquer outra placa da família Arduino (ou compatível).

Variáveis

Começaremos nosso código criando seis variáveis globais. A primeira delas será um inteiro (int) que receberá qual o tipo de operação foi selecionada pelo usuário. Vamos inicia-la com valor 0:

Em seguida, criaremos duas Strings que receberão os operandos da operação:

Este tipo foi escolhido porque os dados digitados no monitor serial são recebidos por padrão como bytes e precisaremos verificar se o usuário digitou apenas números ou se existe alguma letra ou caractere especial na entrada.

Teremos também três variáveis de controle do tipo booleana que vão auxiliar na navegação pelos diálogos do monitor serial. Estas variáveis lógicas permitem apenas dois possíveis valores: 1 (true) e 0 (false). O Arduino permite que este tipo de variável seja declarada tanto como bool quanto boolean, sendo bool o padrão recomendado pela documentação de referência do Arduino.

A nossa primeira variável booleana vai informar para o programa se o menu inicial deve ou não ser exibido ao usuário. Por isso, vamos inicia-la como “verdadeiro” (true):

Nossa segunda variável booleana indicará se o sistema está ou não ocupado. Ela será verdadeira apenas quando nosso Arduino estiver esperando por uma entrada do usuário e vai impedir que o menu seja escrito repetidas vezes dentro do loop do programa. Como precisamos que o menu seja mostrado pelo menos uma vez ao ligar a placa, vamos inicia-la como falsa (false):

A última variável vai indicar ao programa se ele está esperando pelo primeiro ou pelo segundo operando de nossa calculadora. Ela se tornará verdadeira apenas após o usuário inserir o primeiro operando no monitor serial. Logo, ela será inicializada como falsa:

Após a criação das variáveis, precisaremos de uma função que as retorne aos seus valores iniciais ao final de cada operação:

Esta função também será chamada caso seja detectada alguma entrada inválida por parte do usuário.

Menu Inicial

Nossa interface de comunicação com o usuário nada mais será do que uma sucessão de chamadas ao método Serial.println().

Menu

Imagem 1 – Menu no Monitor Serial

Dentro do setup() teremos apenas a inicialização da comunicação serial com uma taxa de transferência em bits por segundo (baud rate) de 9600:

E o loop() terá apenas uma chamada à função printMenu(), que criaremos logo em seguida.

Na função printMenu() precisamos garantir que o menu seja escrito uma única vez no monitor serial. Para isso, vamos verificar os valores de duas variáveis booleanas que criamos anteriormente: menu e busy.

Caso o valor de menu seja true e busy seja false, vamos escrever o menu no monitor serial e imediatamente mudar o valor de busy para true, indicando que o programa está agora esperando uma resposta do usuário. Esta resposta será lida por outra função que chamaremos de lerOpcao().

Alternativamente, o menu pode ser escrito com um único Serial.println() caso queira economizar linhas de código:

Caso uma opção válida seja digitada, a função lerOpcao() vai mudar os valores de menu e busy para false e o programa prosseguirá para a função recebeOperandos(), que pedirá que o usuário insira os operandos para a realização da operação escolhida.

Tratamento de Entrada

Dentro da função lerOpcao(), vamos usar o método Serial.available() como condição para fazer leitura dos dados. Quando chamado, esse método retorna a quantidade de bytes disponíveis para leitura no buffer serial. Sendo assim, só vamos iniciar a leitura se a quantidade de bytes disponíveis for maior que zero:

Quando o usuário digita qualquer coisa no monitor serial e pressiona a tecla ENTER para enviar, ele também está intencionalmente enviando uma quebra de linha (caractere ‘\n’) para o Arduino e ler esse caractere pode causar erros na execução do programa, pois ele ficará armazenado no buffer serial. Para evitar problemas, vamos botar todos os dados dentro de uma String e dizer que a leitura deve ser encerrada ao alcançar o caractere ‘\n’:

Essa leitura dos dados é feita dentro da função verificaOpcao(), que também vai fazer uma análise dos dados recebidos. Ela retornará 0 (o valor inicial da variável opcao) caso o usuário digite algo que não seja um número ou que possua mais de 1 caractere (tendo em vista que o menu só possui 4 opções).

Ao final da operação, precisamos converter a String para int, pois este é o tipo da variável opcao à qual o retorno da função será atribuída. Isso é feito com o método toInt() da classe String.

Recebendo os Operandos

Com o tipo de operação selecionado, a função printMenu() entrará na função recebeOperandos(), dando continuidade à nossa interface de comunicação com o usuário. Será pedido que o usuário digite o primeiro operando e logo em seguida, o segundo.

Interface Calculadora

Imagem 2 – Digitando os Operandos

Para que o programa saiba em que passo desse processo ele se encontra, vamos criar uma condição com a variável gotOperando1 que criamos no início do projeto. Caso seu valor seja false, o programa vai pedir o primeiro operando e mudar o valor de busy para true para que a instrução seja mostrada apenas uma vez no monitor serial.

Após a leitura dos dados, precisamos verificar duas coisas: se a mensagem lida possui pelo menos 1 caractere (tamanho maior que 0) e se o que foi recebido foi um número. Esta última acontecerá dentro da função verificaNumero() que percorrerá a String para garantir que todos os caracteres que a compõe são dígitos numéricos ou um ponto decimal:

Depois de receber o primeiro operando, o mesmo processo é repetido para o segundo, mas dentro de uma estrutura else.

Se tudo ocorrer de acordo com o esperado, é chamada a função realizaOperacao() para imprimir o resultado da operação no monitor serial. Assim como o menu, ela é apenas uma sucessão de chamadas a Serial.print().

Ao final, nossa interface completa ficará da seguinte maneira:

Resultado Calculadora

Imagem 3 – Resultado

Código Completo

Gostou? Deixe seu comentário logo abaixo, não deixe de conferir outras postagens do nosso blog. Confira também a nossa loja virtual e encontre todos os componentes utilizados no projeto no post.

Gabriel Martins de Freitas

Graduando em Sistemas e Mídias Digitais. Tenho experiência com Arduino e ESP8266. Atualmente compartilhando meu conhecimento no blog da Smart Kits.

Post navigation

Deixe um Comentário

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Módulo Bluetooth AT-09 com Arduino

Usando Múltiplos Sensores de Distância Laser VL53L0X

Boas práticas com placas de desenvolvimento