Usar aplicativos é a melhor forma de interagir com o módulo Bluetooth. Já que podemos criar uma interface que facilita a interação com nosso sistema. Portanto, vamos aprender a criar um aplicativo (Android) da forma mais simples possível para comunicar pelo Bluetooth com o Arduino usando o módulo HC-05/HC-06.

Na parte anterior, expliquei sobre toda a parte da comunicação do módulo com o Arduino. Então, não deixe de ler para saber como enviar e receber comandos pelo Bluetooth.


Criando o aplicativo

Existem duas formas mais conhecidas de se fazer um aplicativo: utilizando o App Inventor ou programando ele do 0 com o Android Studio. A primeira opção é mais vantajosa para quem tem interesse na parte da eletrônica e não na de desenvolvimento de aplicativos. Além disso, utilizar o App Inventor é uma solução mais fácil e rápida. Portanto, vou ensinar como criar a comunicação entre o aplicativo e o Arduino usando o App Inventor.

App Inventor

O App Inventor é uma ferramenta criada pelo MIT que permite a criação de aplicativos para Android facilmente. A criação da interface possui uma série de elementos disponíveis que só precisam ser arrastados para a tela. E a programação é toda feita em linguagem de blocos, então não é necessário conhecer cada comando existente no Android. Sendo assim, quem não tem conhecimento nenhum é capaz de fazer um aplicativo interessante com poucas horas de aprendizado.

Meu intuito não é mostrar como utilizar o App Inventor passo a passo, mas sim quais são os passos para criar uma comunicação Bluetooth em um aplicativo. Entretanto, mesmo sem conhecer a plataforma, você deve conseguir seguir meu passo a passo sem muita dificuldade.

O primeiro passo é acessar o site e fazer loginAgora, vamos ver o que precisamos fazer para criar a comunicação Bluetooth.

Criando a interface

Obs: A língua do site, para mim, está em inglês, então talvez o nome dos elementos sejam diferentes para você.

Para exemplo, vou considerar que o aplicativo que queremos criar é para controlar um LED. Então, para a interface, precisaremos de 3 botões: 1 para conectar ao dispositivo Bluetooth selecionado; 1 para mandar ligar o LED; 1 para mandar desligar o LED. Além disso, precisamos do elemento “ListPicker” que servirá para criar a lista com os dispositivos Bluetooth disponíveis.

Coloque os elementos que listei acima e modifique eles da forma que desejar (texto, cor etc). A imagem abaixo mostra como ficou minha configuração:

botões interface do app inventor

Para colocar o botão “Conectar” e o ListPicker “Escolher conexão” um ao lado do outro utilizei a seguinte técnica:

botões lado a lado no app inventor

Coloquei um arranjo horizontal, defini o alinhamento horizontal como centralizado (“Center: 3”) e defini a largura do arranjo como “Fill parent”. Dessa forma, tudo que for colocado dentro do arranjo ficará alinhado no centro e sua largura preenche a tela toda. Por fim, bastou colocar o botão e o ListPicker dentro do arranjo e um Label sem texto entre eles. O label serve justamente para criar o espaço vazio entre o botão e o ListPicker. Para aumentar esse espaço, é só mudar a largura do Label.

Para alinhar os outros dois botões, foi praticamente a mesma coisa:

alinhamento horizontal no app inventor

Por fim, decidi adicionar uma imagem para melhorar o visual do aplicativo. Adicionei o elemento Image, fiz upload de uma imagem e coloquei ela dentro do elemento Image:

processo para adicionar imagem no app inventor

E o aplicativo ficou da seguinte forma:

Adicionando componentes especiais

Ainda na tela da interface, precisamos adicionar alguns elementos importantes, mas que não aparecem na interface. São eles:

  • Bluetooth Client

Esse elemento garantirá todas as funções para a conexão Bluetooth na hora de programar. Basta arrastar o elemento para a tela do aplicativo.

adicioanndo o bluetooth no app inventor

  • TinyDB

O TinyDB é um elemento que serve para armazenar informações do aplicativo (banco de dados). Utilizaremos ele para gravar o dispositivo Bluetooth previamente conectado. Portanto, ele não é crucial para o aplicativo funcionar.

adicioanndo o tinydb no app inventor

  • Notifier

O Notifier serve para criar avisos na tela para alertar o usuário de alguma coisa. Assim como o TinyDB, ele não é essencial para o funcionamento do aplicativo. Usaremos ele apenas para melhorar a comunicação do aplicativo com o usuário.

adicioanndo o notifier no app inventor

Agora temos tudo pronto para começar a programar.

Programação

Para ir para a programação precisamos clicar em “Blocks” no canto superior direito na tela do App Inventor.

mudar para programação no app inventor

Inicialização

Nesta primeira parte, criaremos uma lógica que pega o dispositivo Bluetooth previamente conectado (se houver) e emite um aviso falando se ele está ou não pareado. O primeiro passo é criar uma variável chamada ‘dispositivo’ que servirá para guardar qual dispositivo deverá ser conectado. Crie uma variável global e inicialize ela com um texto vazio:

criando variável app inventor

O bloquinho lilás é um texto vazio e foi retirado da guia “Text”.

Agora, a lógica que mencionei acima será realizada assim que o aplicativo for iniciado. Portanto, precisamos da função “when Screen1 Initialize” que é encontrada na guia “Screen 1” do lado esquerdo da tela. Dentro desta inicialização faremos algumas coisas.

A primeira delas será pegar qual é o último dispositivo utilizado (pelo aplicativo) e gravar dentro da variável ‘dispositivo’ que criamos antes. Pegue o bloco “set” da variável e, na sua frente, adicione o bloco “call TinyDB GetValue” que fica na guia TinyDB do lado esquerdo da tela.

blocos de código importantes

A imagem acima mostra onde encontrá-lo e mostra também outras guias que usaremos mais adiante. Por fim, na frente da parte escrito “tag”, adicione um bloco de texto escrito “dispositivo”. Por fim, temos:

inicializando o dispotivio

O bloco acima basicamente define a variável ‘dispositivo’ como sendo o valor da tag ‘dispositivo’ dentro do banco de dados do TinyDB. E, se não há valor no banco de dados, define a variável com um valor vazio ” “.

Configurações

Abaixo do bloco anterior, precisamos testar se há algum dispositivo gravado no banco de dados para então testar se ele está pareado. Para fazer isso, adicione um bloco condicional (“if then”). Em seguida, clique no símbolo da engrenagem azul e adicione um “else” dentro do condicional.

A condição a ser testada é o tamanho (quantidade de caracteres) da variável ‘dispositivo’. Se ela for maior que 0 (se teve algum valor pre-gravado no banco de dados), então entramos no if. Senão, nós definimos a variável ‘dispositivo’ com o valor de “Nenhum”.

testando se tem algum dispositivo gravado

Dentro do “if” acima, precisamos criar um outro if para testar se o dispositivo NÃO está pareado. Pois, se não estiver, então exibimos uma mensagem avisando. Portanto, dentro deste novo ‘if’, pegue o bloco da guia Bluetooth “call BluetoothClient IsDevicePaired” e na sua frente adicione o bloco get da variável ‘dispositivo’. Como queremos saber se ele não está pareado, adicione um “not” (dentro da guia “logic”) antes deste bloco.

Sendo assim, se o dispositivo não estiver pareado, criamos um aviso usando o Notifier. Para isso, pegue o bloco “call Notifier ShowAlert” dentro da guia Notifier e adicione o texto com a mensagem desejada. Com isso, temos:

testando conectividade

 

Juntando tudo o que foi criado, o bloco final deverá ficar da seguinte forma:

inicializando a comunicação bluetooth

Portanto, quando a tela inicializa, o programa procura dentro da tag ‘dispositivo’ na base de dados. Se ele encontra algum valor, ele define este valor para a variável ‘dispositivo’, senão ele define um valor vazio para a variável. Feito isso, testamos se a variável ‘dispositivo’ possui algum valor. Se sim, testa se o dispositivo que está gravado nela NÃO está pareado. Se não tiver pareado, emite um aviso. E, se a variável ‘dispositivo’ não possuir valor, define seu valor como “Nenhum”.

Criando lista de dispositivos Bluetooth

Feito a nossa inicialização, precisamos criar a nossa lista de dispositivos Bluetooth disponíveis dentro do elemento ListPicker.

Dentro da guia “ListPicker”, selecione o bloco “when ListPicker Before Picking”. Dentro deste bloco, adicione outro bloco da guia ListPicker chamado “set ListPicker Elements to”. E, na frente deste último bloco, adicione o bloco da guia Bluetooth “BluetoothClient AddressesAndNames”.

criando a lista

O código acima tem o seguinte funcionamento: antes da pessoa selecionar algum elemento da lista, define como elementos da lista todos os endereços e nomes dos dispositivos Bluetooth disponíveis. Ou seja, cria os elementos da lista.

Agora, precisamos definir a parte da seleção do elemento da lista. Quando a pessoa clicar em um elemento, esta seleção será gravada na variável ‘dispositivo’ e no banco de dados. Portanto, pegue o bloco “when ListPicker AfterPicking” da guia ListPicker. Feito isso, pegue o bloco de definir a variável e na frente dele adicione o “ListPicker Selection” dentro da guia “ListPicker”.

E por último, pegue o bloco “TinyDB StoreValue” na guia “TinyDB”. Na sua frente coloque a tag como o texto “dispositivo” e o valor a ser gravado como o valor da variável ‘dispositivo’. O resultado está mostrado abaixo.

definindo a seleção da lista

Então, depois que a pessoa selecionar algum dispositivo da lista, a seleção é gravada na variável ‘dispositivo’. Além disso, dentro da tag ‘dispositivo’ do banco de dados, nós também gravamos o valor atual da variável ‘dispositivo’.

Com isso, nós temos uma lista funcional.

Conectando o Bluetooth

Nos resta, agora, apenas criar a conexão do dispositivo Bluetooth conectado com o smartphone. O primeiro passo é criar uma variável chamada ‘conectado’ e definir seu valor como “false”. Essa variável servirá para nos informar se a conexão com o dispositivo está ou não ativa. Além disso, adicione o bloco de ação para quando o botão “conectar” for clicado. Ele fica localizado na guia do botão que você definiu como sendo o botão “conectar”. A princípio, temos:

criando variável e bloco principal

O próximo passo, dentro do bloco do botão, é testar se o dispositivo selecionado está pareado. Então, colocamos um “if then else” assim como antes e usamos o bloco “call BluetoothClient IsDevicePaired” que utilizamos num tópico mais acima. Na parte do ‘else’, nós emitimos um alerta avisando que o dispositivo não está pareado com o bloco “call Notifier ShowAlert”:

testando se o dispositivo está pareado

Caso o dispositivo esteja pareado, podemos então tentar conectar com ele. Para isso, criamos um “if then else” novamente. A condicional do “if” é o bloco “call BluetoothClient Connect” que ao mesmo tempo que conecta, testa se a conexão deu certo. Se sim, mostramos um alerta falando que o dispositivo foi conectado e definimos a variável ‘conectado’ como ‘true’. Senão, emitimos um alerta falando que deu erro na conexão:

testando a conexão com o dispositivo bluetooth

Juntando isso tudo, temos:

código para conectar com um dispositivo bluetooth

De acordo com o código acima, testamos se o dispositivo selecionado está pareado. Se sim, tenta conectar, senão emite um aviso de erro. Se a conexão deu certo, emite um aviso falando que deu certo e define a variável conectado como ‘true’ (serve para a gente saber se o dispositivo está conectado na hora de enviar dados). Se a conexão deu erro, então avisamos com uma mensagem.

Verificando erros de conexão

Toda vez que o Bluetooth der erro, precisamos definir a variável conectado como ‘false’. Para que, na hora de enviar dados, não apareçam mais erros desnecessários.

Portanto, basta adicionar o bloco “when BluetoothClient BluetoothError” na guia do “BluetoothClient”. Esse bloco é acionado toda vez que der um erro de comunicação com o Bluetooth. Se isso ocorrer, definimos a variável ‘conectado’ como ‘false’:

testando erros do bluetooth

Botões para ligar/desligar o LED

A parte de enviar dados para o Arduino pelo Bluetooth é a mais simples. Basta testar se o dispositivo está conectado e então enviar os dados que queremos.

A primeira etapa é adicionar o bloco de ação para quando clicamos no botão “when ligarLED Click” (ligarLED é o nome que defini para o botão). Feito isso, adicionamos um “if then” dentro deste bloco para testar se o dispositivo bluetooth está conectado. No caso, temos a variável ‘conectado’ que nos informa exatamente isso. Então, basta testar se ela e ‘true’:

testando conexão antes de enviar dados

Os blocos verdes foram retirados da guia “logic”.

A segunda e última etapa é enviar os dados dentro do ‘if’. Portanto, utilize o bloco “call BluetoothClient SendText”. E na frente dele adicione o texto que quer enviar.

enviando dados por Bluetooth

Neste ponto, temos que lembrar uma coisa muito importante: no código que criamos para o Arduino, toda informação recebida pelo Bluetooth no Arduino só é finalizada se ele receber um pulador de linha (“\n”). Portanto, foi por isso que coloquei o texto “LIGAR” e abaixo um pulador de linha. Coloquei os dois separados para organizar melhor o código, mas poderia ter colocado apenas um bloco de texto com “LIGAR\n”.

O código para os dois botões está mostrado abaixo:código dos botões para ligar/desligar led

Temos que lembrar dos dois comandos (“LIGAR” e “DESLIGAR”) para fazer a programação do Arduino.

Código completo

codigo completo app inventor

Nosso aplicativo está pronto, agora resta apenas mudar a programação do Arduino

Recebendo dados

Você pode desejar receber algum dado do Arduino, por exemplo de um sensor. Neste caso, você precisa adicionar outros dois elementos, o “Clock” e um “Label” para exibir os dados. O “Clock” servirá para verificar de tempo em tempo se algum dado está sendo recebido pelo Bluetooth.

elemento clock

Adicionei o “Clock” e chamei o Label de “LabelComDados”.

Primeiro, vá na guia “Clock” na parte de programação e adicione o evento “when Clock Timer”. Esse é o evento que dispara toda vez que o ‘Clock’ é acionado. Dentro deste bloco, adicione um “if then”. A condição do ‘if’ será justamente testar se o dispositivo Bluetooth está conectado (pela variável ‘conectado’), assim como fizemos antes:

testando conexão na hora de receber dados

Agora, resta verificar se existe algum dado para receber e, se houver, exibir no ‘Label’. Portanto, adicione um novo “if then” e, no condicional, adicione o bloco “call BluetoothClient BytesAvailableToReceive”. Esse bloco retorna o números de bytes que podem ser recebidos. Então, adicione um comparador para que o ‘if’ seja acionado caso esse valor seja maior que 0. É bem parecido com o teste que ocorre no Arduino com a comunicação serial.

Se o valor for maior que 0, então basta definir o texto do label com os dados recebidos. Sendo assim, no bloco “set LabelComDados Text to” adicione o bloco “call BluetoothClient ReceiveText”. E, na frente deste último bloco, adicione mais um outro com nome “call BluetoothClient BytesAvailableToReceive”:

recebendo dados via bluetooth

Juntando os blocos, temos:

recebendo informações pelo bluetooth

Desse modo, a cada disparo do timer, nós testamos se o dispositivo está conectado. Se sim, verifica se tem algum dado para leitura. Se houver, define o texto do ‘Label’ como sendo todos os dados, disponíveis para receber, em forma de texto.


Programação no Arduino

Tendo em vista o aplicativo que criamos, resta apenas fazer uma leve modificação no código que criamos na parte 1 deste post. Considerando o mesmo caso do LED com o comando “LIGAR” e “DESLIGAR”, basta apenas acionar ou desacionar o LED caso um desses comandos seja recebido:

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
#define led 3 //LED conectado no pino 3

#include <SoftwareSerial.h>
 
SoftwareSerial bluetooth(10, 11); // RX, TX do Arduino
String command = "";
char b1;
   
void setup()  
{  
  pinMode(led, OUTPUT);
 
  Serial.begin(9600);  
  bluetooth.begin(9600);  
}  
   
void loop()  
{  
  // Lê os dados do bluetooth
  if (bluetooth.available()>0) { // Se existem dados para leitura
   
    b1 = bluetooth.read(); //Variável para armazenar o dado atual
    command += b1; //Variável para armazenar todos os dados
   
    if (b1 == '\n'){ //Se o dado atual for um pulador de linha (\n)
      Serial.print(command); //Printa o comando
     
      command.trim(); //Remove o \n para comparar o texto

      if (command == "LIGAR"){
        digitalWrite(led, HIGH);
      }else if(command == "DESLIGAR"){
        digitalWrite(led, LOW);
      }
     
      command = ""; //Limpa o comando para futuras leituras
    }
  }
}

Removi a parte de enviar dados do Arduino para o Bluetooth. E a outra parte modificada, além da definição dos pinos, foi a parte abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (b1 == '\n'){ //Se o dado atual for um pulador de linha (\n)
    Serial.print(command); //Printa o comando

    command.trim(); //Remove o \n para comparar o texto

    if (command == "LIGAR"){
        digitalWrite(led, HIGH);
    }else if(command == "DESLIGAR"){
        digitalWrite(led, LOW);
    }

    command = ""; //Limpa o comando para futuras leituras
}

Exibindo dados de um sensor

Para exibir os dados de um sensor por exemplo, basta enviá-los pelo Bluetooth utilizando o seguinte comando:

bluetooth.write(“Dados do sensor”);

E, com o código que mostrei no aplicativo, esses dados serão exibidos em um ‘Label’.

 

Com a parte 1 e parte 2 deste post, você já deve ser capaz de criar seu próprio aplicativo e comunicar com o Arduino por Bluetooth para comandar seus dispositivos a distância de maneira elegante.

Módulo Bluetooth – Comunicando c/ Arduino – Parte 1