Comunicação Bluetooth entre Arduino e Android

Depois de quase um século, estamos aqui voltando a falar sobre comunicação Bluetooth. Agora, entre Arduino e Android. A realização desse post foi fortemente influenciada pelos comentários no post sobre programação Bluetooth entre dois dispositivos Android. Prontos? Vamos!

Para mostrar como se faz a conexão e comunicação entre um aparelho Android e um Arduino, vamos desenvolver um contador. Algo bem simples. O app Android terá apenas uma tela, nesta tela um TextView para exibir o valor do contador e outro para exibir o status da conexão. O valor do contador exibido será calculado pelo Arduino e transmitido ao Android, que é apenas responsável por exibir o número (assim demonstramos transmissões Arduino -> Android). Se o usuário clicar na tela, o Android envia um comando para que o contador seja reiniciado (assim demonstramos transmissões Android -> Arduino). Que acham? Bem simples e faz sentido, não?

Módulo Bluetooth

A maioria dos Arduinos não possui um módulo Bluetooth embutido (com exceção de alguns como ArduinoBT). Logo, é necessário um módulo de comunicação Bluetooth externo. Alguns exemplos são os módulos HC-05, HC-06, HC-07 e HC-08. Não vamos explorar muito as diferenças entre esses módulos. Mas algumas informações são úteis. Uma das principais diferenças entre o HC-05 e o HC-06 é que o HC-05 pode atuar como master ou slave, enquanto o HC-06 atua apenas como slave. Isso implica que o HC-06 não é capaz de iniciar uma conexão com outro dispositivo, ele apenas pode aceitar ou negar quando outro dispositivo tenta iniciar uma conexão. Mas após a conexão ser estabelecida, a comunicação de dados ocorre em duas vias, tanto do módulo HC-06 para o outro aparelho quanto do aparelho para o HC-06. Neste tutorial, vamos usar o módulo HC-06 para realizar a comunicação.

O módulo HC-06 possui quatro pinos: VCC e GND para alimentação do módulo. O pino VCC pode ser conectado diretamente à saída de 5V do Arduino, já que suporta tensões entre 3.3V e 6V. Os outros dois, TXD e RXD são os pinos de escrita e leitura do módulo. Estes serão utilizados para comunicação serial entre o HC-06 e o Arduino.

 

DSCN4196
HC-06 Visão frontal
DSCN4198
HC-06 Visão Traseira

Você deve estar se perguntando como o módulo Bluetooth se integra ao Arduino e como os dados vão sair do Arduino e chegar no Android e vice-versa. É o que veremos.

 

Arduino

A integração entre o Arduino e o HC-06 é bem simples. Todas as informações que o Arduino precisar transmitir ao Android deverão passar antes pelo módulo Bluetooth HC-06 e vice versa. A comunicação entre Arduino e HC-06 ocorre via serial. Então, tecnicamente, bastaria conectar os pinos seriais (RX, TX) do Arduino aos pinos seriais (TXD, RXD) do HC-06 e usar as funções da biblioteca Serial para ler e escrever caracteres. Os caracteres que chegassem à porta serial RX do Arduino correspondem aos dados que o Android está enviando. Os caracteres escritos através da porta serial TX do Arduino seriam enviados ao Android pelo módulo Bluetooth. Mas encontrei problemas ao tentar utilizar os pinos RX, TX padrões do Arduino. Apesar de obter sucesso realizando a conexão, as informações simplesmente não fluíam entre os lados da conexão.

Para resolver esse problema, usei a biblioteca SoftwareSerial. O que essa biblioteca faz é simular as portas seriais RX, TX utilizando os pinos digitais. Isso é maravilhoso! Então, em vez de conectar (RXD,TXD) do módulo HC-06 a (TX,RX) do Arduino, podemos escolher dois pinos digitais para simular as porta seriais e fazer a mesma conexão. Aqui, escolhi de forma arbitrária os pinos 8 e 9 para RX e TX, respectivamente. Um detalhe que pode vir a ser bem importante: o módulo HC-06 trabalha com níveis lógicos de tensão de 3.3V. Isso significa que os pinos RXD do HC-06 só estão preparados para trabalhar em torno de 3.3V, enquanto o Arduino estará oferecendo 5V na saída do pino 9 (que estamos usando como TX). Para diminuir a chance de danificar o módulo Bluetooth, é bem recomendado que você diminua a tensão de 5V para 3.3V. Façamos isso com um divisor de tensão, que tal? Dessa maneira, a saída de 5V do pino digital do Arduino chega ao pino RXD do módulo Bluetooth como 3.3V e não corremos risco de fritar o senhor HC-06. Mostramos esse divisor de tensão no esquemático lá embaixo, relaxa.

Feitas essas conexões, o resto é alimentar o módulo Bluetooth com 5V e pronto. Veja o esquemático, é tranquilo. Leia o código e os comentários, é favorável.

Esquemático só para ficar bonito. Note o resistor de 330Ω conectado ao LED. Perceba também o divisor de tensão (feito com resistores de 1KΩ) conectado ao pino RXD do módulo HC-06.

arduino+hc06
Usei Arduino Pro Micro, mas a ideia é a mesma para outros Arduinos, sério. Só lembre de acertar o modelo na hora de programar.

 

Android

Permissões

Precisamos obter permissão para utilizar o dispositivo Bluetooth do Android. Fazemos isso adicionando essas linhas ao Manifest.xml, dentro da tag <manifest>. Faça isso.

Design

Já comentamos como seria nossa interface gráfica no começo do post, lembra? Uma tela, um TextView para o contador, um TextView para mensagem de status da conexão. Abaixo estão o arquivo XML que usei e um print de como deve ficar a tela do app. Modifique o visual como preferir. Sei lá, coloque no plano de fundo uma selfie sua.

Aproveite, procure o arquivo styles.xml, que provavelmente estará no caminho app/src/main/res/values/styles.xml e deixe-o assim:

Isso serve para remover aquela barra superior com o nome do aplicativo. Faz com que o design fique mais limpo, mais bonito.

 

Screenshot_20160409-224157
Algo similar a isso deverá aparecer na tela principal. Quando o Arduino começar a transmitir dados, o valor do contador aparecerá no lugar de “DRAGÃO”.

Programação

Classe ConnectionThread

Se você leu Programação Bluetooth no Android, sabe que criamos uma classe, subclasse de Thread, para gerenciar a conexão Bluetooth. Faremos o mesmo aqui. Não precisamos reescrever essa classe, pois já fizemos isso. É claro, mesmo que já tenhamos a classe ConnectionThread, isso não nos impede de fazer alguns aprimoramentos. Então, o código abaixo é uma versão levemente aprimorada da ConnectionThread que fizemos no primeiro post sobre Bluetooth.

As alterações feitas são (1) adição da variável booleana isConnected, que indica exatamente o que o nome diz: a thread Bluetooth está conectada ou não? e (2) para garantir que as mensagens transmitidas do Arduino para o Android não cheguem quebradas, leremos byte a byte o que for recebido no Android e armazenaremos em um buffer. Quando, enfim, recebermos um caractere ‘\n’, uma quebra de linha, então assumimos que a mensagem completa foi recebida e trabalhamos com ela. Você pode ver essa alteração no loop while localizado entre as linhas 159 e 186 da classe ConnectionThread.

Ótimo. Adicione essa classe ao projeto e siga em frente.

Activity Principal

Já que nosso único objetivo é conectar o Android a um módulo Bluetooth que provavelmente já conhecemos o endereço, não haverá aquela complicação toda de realizar busca por dispositivos, etc. Já sabemos o endereço do nosso módulo HC-06. Você já sabe? É bom saber, pois vamos precisar dele.

Então, de forma sucinta, o que faremos na Activity principal é ativar o hardware Bluetooth, iniciar uma conexão com um dispositivo pré-definido e atualizar os TextView relativos ao contador e ao status da conexão.

Veja abaixo o código que utilizei para a Activity Principal. Eu poderia explicá-lo novamente, mas como adicionei comentários em praticamente todos os trechos do código, acredito que será tranquilo acompanhá-lo e entendê-lo. Você consegue! Que a força esteja com você.

Pronto, depois de modificar o código de sua Activity principal e deixá-lo aproximadamente como mencionado acima, você está pronto para testar o app. Acredito fortemente nisso. Se faltar algo, me avisem, obrigado!

Notas Breves

Provavelmente, na primeira conexão entre o seu dispositivo Android e o módulo Bluetooth, você deverá entrar com uma senha para realizar o pareamento. Para o meu dispositivo, um módulo HC-06, a senha correta era 1234. Caso essa não funcione, tente 0000. Se essa não funcionar, então não sei. É uma boa ideia pesquisar na Internet sobre o assunto, pois seu módulo Bluetooth é estranho.

David Borges

Um dia... Boom! Dragão sem Chama.

42 thoughts to “Comunicação Bluetooth entre Arduino e Android”

  1. Excelente. Obrigado por continuar a ajudar não só a mim como aos demais.

    Queria sua opinião em um certo caso. (Se não for pedir muito rsrs.) Os dados enviado ao Android é recebido na Activity principal (A). Certo. Na aplicação que estou desenvolvendo, ao ser detectado uma presença no sensor, é enviado uma string para o Android. Possuo uma outra Tela, uma segunda Activity (B), e preciso receber esse dado ATUALIZADO nessa Activity B. Essa Activity B é uma simulação de um estacionamento. Onde tenho o layout e os carros. Os carros ficam invisíveis. Ao receber o dado enviado do Arduino, na detecção do sensor, O carro aparece, indicando que a vaga está ocupada. Porém, preciso fazer esse sincronismo nessa Activity B. Detectou presença? O carro aparece. Não detectou presença? O carro desaparece.

    Bom, é bem isso a aplicação que estou fazendo. No momento. eu consigo enviar o dado da Activity A para a B. Mas se o dado alterar de valor, na Activity B ele permanece com o valor antigo, isso porque o dado não foi atualizado.

    Queria saber de você a melhor forma de fazer isso. Pensei em colocar o handler na Activity secundária. Resolveria a situação?

    Novamente, muito obrigado pela ajuda que está me dando. Peço desculpa por comentar tanto seus post trazendo problemas haha.

    1. Saudações de novo, Jayme, hahahah,

      Sim. Acredito fortemente que colocar o handler na Activity B resolverá o problema. Afinal, você só precisa dos dados que vêm pelo Bluetooth nessa Activity B, correto?

      Agora, se você inicia a conexão na Activity A e espera os dados na Activity B, isso pode se tornar mais complicado para desenvolver e ainda não fiz testes para saber se a classe ConnectionThread funciona direitinho nessa situação.

      Acredito que você deveria testar fazer da seguinte maneira: se você precisa dos dados Bluetooth apenas na Activity B, leve todas as operações Bluetooth para essa Activity. Se você sair dela, feche a conexão direitinho, quando você voltar para ela, reconecte. Tente fazer algo nesse estilo, para diminuir a complexidade do app.

      E não se preocupe em perguntar. Você está certo! A gente também aprende muito quando tem que pensar em como resolver os problemas. Sucesso desenvolvendo seu app! Qualquer coisa, estamos aqui.

  2. Olá amigo, excelente trabalho. Ainda sou novo no Android e Arduino, segui o passo a passo de seu código, mas aparece uma correção q ñ sei onde consertar:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
    }

    O programa pede para criar campo ou class “menu” em Jonas.Viana.R

    Agradeço sua ajuda se pd dizer o q devo fazer ou onde devo, ñ consigo fazer com o programa compile.
    Grato por qq ajuda.

    1. Olá, Jonas,

      Isso parece muito um erro de referência dentro do Android Studio. Suponho que você esteja usando Android Studio. Mas vamos ver algumas possibilidades.

      Você consegue encontrar o arquivo R.java no seu projeto? Se não, tente Build -> Clean Project. Isso vai reconstruir o projeto e o arquivo R também.

      Se o arquivo R.java já existe, você vê problemas em outras partes do código relacionadas ao arquivo R?

      Na pior das hipóteses, você ainda pode iniciar um novo projeto e copiar/colar os arquivos de código que você já fez. É possível quando o projeto é pequeno. Muitos problemas que tive com este R.java só foram resolvidos assim.

      1. Olá amigo. Encontro o arquivo R.java e complemento com a classe e campo menu sugerido pelo programa(Netbeans), corrige o erro aparente, mas sempre q compilo, o msm erro aparece e o código q alterei no R.java volta como era antes, apagando o q escrevi.

        Arquivo R.java antes do complemento pedido pelo programa::
        /* AUTO-GENERATED FILE. DO NOT MODIFY.
        *
        * This class was automatically generated by the
        * aapt tool from the resource data it found. It
        * should not be modified by hand.
        */

        package Jonas.AlvesVV;

        public final class R {

        static int menu_main;
        public static final class attr {
        }
        public static final class drawable {
        public static final int ic_launcher=0x7f020000;
        }
        public static final class id {
        public static final int counterMessage=0x7f050000;
        public static final int statusMessage=0x7f050001;
        }
        public static final class layout {
        public static final int main=0x7f030000;
        }
        public static final class string {
        public static final int app_name=0x7f040000;
        }
        }

        Arquivo R.Java dps q complemento e a “sugestão” desaparece::
        package Jonas.AlvesVV;

        public final class R {

        public static final class attr {
        }
        public static final class drawable {
        public static final int ic_launcher=0x7f020000;
        }
        public static final class id {
        public static final int counterMessage=0x7f050000;
        public static final int statusMessage=0x7f050001;
        }
        public static final class layout {
        public static final int main=0x7f030000;
        }
        public static final class string {
        public static final int app_name=0x7f040000;
        }

        static class menu {

        static int menu_main;

        public menu() {
        }
        }

        }

        Tentei alterar o arquivo e salvar, da certo, mas ao compilar volta td como era antes.
        Grato por sua atenção.

  3. Olá amigo, novamente aqui. Consegui resolver o problema criando uma nova pasta com um novo arquivo xml dentro, o qual o programa pedia p implementar(menu/menu_main.xml). Agora o programa funciona perfeitamente. Peço sua ajuda quanto a algum conteúdo especifico sobre comunicação Bluetooth, a questão do array e seus dados, essa parte ñ compreendi muito bem a lógica. Quero alterar o programa para q envie um numero de serie a cada clique do botão(Ex: 12 45 78 89). Mas essa parte de comunicação ainda estou perdido. Pd ser um site, artigo ou coisa assim. Grato por qq ajuda.

    1. Saudações, Jonas,

      Que bom que você conseguiu resolver o problema! Problemas com o R são, eu devo admitir, muito irritantes.

      Sobre o array, o método de envio de dados via Bluetooth aceita apenas dados formatados como vetores de bytes (tipo byte[]). Então quando você precisa enviar uma String, é necessário converter essa String para byte[] antes.

      Veja as linhas 134 a 136 do último código do post, referente ao método restartCounter(). Esse é o método executado quando você clica na tela. Ele é executado porque colocamos o atributo android:onClick=”restartCounter” na descrição de atributos da tela no arquivo main_activity.xml, na seção Design. Se criarmos um botão e adicionarmos o atributo android:onClick, indicando qual método deve ser executado, pronto, você tem o botão que executa uma determinada função. Veja a linha 135 de MainActivity.java:

      connect.write(“restart\n”.getBytes());

      Se você substituir a palavra “restart” por “12 45 78 79” vai estar transmitindo essas informações sempre que clicar na tela (ou futuramente no botão que você vai criar).

      1. Muito obrigado pela atenção amigo, ajuda demais, porém me expressei errado.

        Estou tentando fazer com que o Android exiba um numero sequencial(12 45 78), que serve como um ID p/ cada mercadoria, mandado pelo Arduino, quando alguém aciona o botão de entrada do arduino.

        No caso tento alterar os comando a partir da linha 159 [[[ while(running) ]]] da ConnectionThread e das linhas 94 a 128 [[[ Handler handler ]]] da MainActivity, para receber esse numero sequencial e exibir.

        Minha dificuldade está em alterar esses comandos p receber/exibir esse numero sequencial(12 45 78).

        Novamente, muito obrigado.

        1. Entendo. Vamos pensar um pouco. O sistema é o seguinte: você clica em um botão conectado ao Arduino, o Arduino interpreta o clique e envia uma String “12 45 78” usando a função serial.print(), assim como nas linhas 58 e 59 do código do Arduino que utilizamos no post.

          A classe ConnectionThread não precisa ser alterada. Ela lida com o recebimento de dados e a transmissão deles de forma transparente só pra você usá-la no seu projeto. A não ser que você queira incrementar as capacidades dela, melhor deixá-la quietinha.

          Pronto, usando o código do Android da forma que ele está, você já receberá a String no app e o método handleMessage() da MainActivity será chamado quando a String for recebida. A linha 124 é responsável por exibir essa String no elemento TextView que denominamos counterMessage. Até aí tudo bem? Imagino que o que você quer fazer já está exemplificado aqui. Você só precisaria criar e posicionar um elemento TextView (que é basicamente um elemento de exibição de texto) dentro da sua interface gráfica, criar um objeto referente a ele dentro da sua Activity e usar o método setText() para atualizar o valor sempre que a String recebida for referente ao código sequencial que você mencionou. Da mesma forma que fizemos aqui para counterMessage.

          Era essa sua dúvida? Espero ter esclarecido.

  4. Boa noite, estou querendo desenvolver um app android para apenas receber informações do arduino, essa programação é feita no software do arduino?

    1. Jessica,

      A programação deve ser feita nos dois dispositivos, tanto no Android quanto no Arduino. Afinal tanto o aplicativo quanto o firmware (o programa que está executando no Arduino) precisam estar conectados e operar de forma sincronizada para que as informações sejam enviadas e processadas corretamente. Nesse post descrevemos todos os passos para realizar a conexão e como enviar informações do Arduino para o Android.

  5. Olá Amigo.
    Excelente tutorial.
    Tentei testar o aplicativo e no meu caso esta dando um erro na linha 188 no método copyOfRange, como não reconhecido pela API.
    Vc sabe como eu posso resolver esse erro?

    Abraços!!!.

    1. Olá, Rafael,

      Acho bem improvável que esteja usando uma API abaixo da 9, mas verifique isso. Porque o método copyOfRange foi introduzido na API do Android nível 9, então é necessário ter no mínimo essa API instalada antes de usar o método Arrays.copyOfRange(). Se não for nada relacionado a isso e o erro persistir, poderia me mandar a mensagem de erro exata? Espero que dê certo.

  6. Beleza David!!!
    Era exatamente, isso que vc comentou, usei uma outra API e o eclipse parou de identificar o erro, porém, agora ao executar o aplicativo em um tablet, o mesmo executa, conecta com o módulo bluetooth e em seguida fecha sozinho.
    Eu percebi que no Arduino quando programo para enviar pela serial de modo contínuo caracteres ou números sem o “/n” o aplicativo conecta e não fecha,mas os dados não são mostrados no TextView e quando eu programo no Arduino para enviar dados com o “/n”, ele apenas conecta e fecha logo em seguida.

    1. Rafael,

      Que bom que funcionou! Esse seria um erro bem bizarro. Mas eu tenho uma suspeita, o símbolo de quebra de linha (que estamos usando como término de mensagem) é “\n”, com a barra invertida. No seu comentário, você menciona que no código está “/n”.

      Espero que seja isso. Caso não seja, estamos aqui.

      1. Então David, realmente no código esta correto o “\n”.
        Eu estive olhando o código no eclipse e percebi que no arquivo AndroidManifest não há qualquer declaração da classe ConnectionThread(), apenas da Activity MainActivity, no caso, seria necessário a declaração da classe ConnectionThread() no AndroidManifest, mesmo ela não sendo uma Activity?
        Se sim, como eu a declararia?

        Abraços!!!

        1. Rafael,

          Não é necessário declarar as classes, exceto Activities, no AndroidManifest. Você pode testar o código usando o debugger do Android Studio e me mostrar qual a mensagem de erro dada pelo debugger quando o aplicativo trava? Seria muito útil. Além disso, os códigos que você tá usando de ConnectionThread, MainBluetoothActivity e o código do Arduino que fazem o sistema travar seriam úteis. Se você puder compartilhá-los comigo, use o site https://codeshare.io/. É possível criar um arquivo de código e compartilhar usando a URL que eles criaram.

  7. Sei que não é sobre o tópico, mas envolve Android Studio.

    Como consigo colocar um Gráfico no android?

    Agradeço desde já.

    1. Gabriel,

      Nunca fiz um aplicativo que necessitasse de gráficos, mas imagino que a melhor maneira de adicionar gráficos seja recorrer a pacotes especializados para essa função. Numa pesquisa rápida encontrei dois pacotes bem promissores. Não tive tempo de testá-los, mas você pode ver o que consegue com eles. Têm demonstrações e exemplos nos sites de cada pacote:

      https://github.com/PhilJay/MPAndroidChart
      http://www.android-graphview.org/

      É uma ideia para um post no futuro. Obrigado.

  8. Ótimo post amigo. Queria somente tirar uma dúvida, se possível.

    Eu fiz o aplicativo do jeito que está aí e funcionou. Porém, para o contador zerar preciso tocar um número aleatório de vezes na tela. As vezes com um toque já funciona, as vezes com 2, 3 ou 4.

    Não sei se deu pra entender direito, mas não era pra zerar a cada toque na tela? É como se a comunicação estivesse lenta e ele não capturasse a mensagem de restart.

    Grato.

    1. Olá, Leandro,

      Perdão pela demora absurda. Infelizmente não sei por que esse problema está ocorrendo na sua montagem.

      Já tive alguns problemas assim e foram problemas na interface gráfica, em que um elemento X da tela estava sobreposto a outro elemento Y; e o toque que supostamente era no elemento Y às vezes acabava sendo redirecionado ao callback do elemento X, erradamente. Também é possível que seja alguma falha de comunicação entre os dispositivos. Uma ideia, se não atrapalhar seu projeto, é adicionar redundância, ou seja, a cada toque na tela, transmitir 3 ou 4 vezes o sinal para o Arduino reiniciar a contagem. Assim, a probabilidade do Arduino não receber a mensagem é menor.

      Espero que dê certo

  9. Olá

    Amigo uma duvida… fiz uma classe com thread em loop que fica monitorando a conexao bluetooth (bluetooth.isConnect())… e enviando uma mensagem para a MainActivy através do handler porem a resposta fica oscilando entre true e false mesmo o led do bluetooth do arduino estando ligado e comunicando normalmente…

    Alguma ideia do que pode ser?

    Desde ja agradeço pelo tutorial serviu de grande ajuda para mim

    1. Saudações, Mateus,

      Não faço ideia de que problema pode estar ocorrendo. Mas tenho uma ideia pra você testar, se ainda estiver no projeto, desculpa pela demora.

      Não sei exatamente a maneira que você implementou a thread. Mas você pode tentar fazer com que ela verifique a conexão Bluetooth um certo número de vezes por segundo. Por exemplo, 4 vezes por segundo, a intervalos de 250 milissegundos. No entanto, você só atualiza a Activity principal após um segundo, ou seja, após os 4 testes. Isso vai fazer com que a oscilação dos valores true e false diminua. Verifique como a oscilação varia conforme você muda o número de testes por segundo e escolha os melhores valores. Você poderia também atualizar só a cada dois segundos. Depende da sua aplicação.

  10. Estou com sofrendo com bugs safados no meu projeto rsrs.
    Vou tentar explicar como é o meu projeto e falar como é esse bug, pra ver se vocês conseguem visualizar o projeto e tentar identificar o que pode tá causando esse maldito bug kk.
    O objetivo do meu projeto é controlar um ventilador pelo celular via bluetooth e pelo botão físico (chave seletora de velocidade) já existente no ventilador. No ventilador, existe uma chave seletora que controla a velocidade do mesmo. É uma chave que possui 1 comum(que vem da rede elétrica) e 3 saídas para o ventilador. A velocidade é de acordo com cada saída. No caso é um ventilador de 3 velocidades obviamente. O que eu fiz foi seguinte: substituí a chave seletora por 3 relés. o comum da rede que vai pra chave seletora, eu desconectei da chave seletora e conectei no comum de cada relé e os fios das saídas da chave seletora que vão para o ventilador eu desconectei da chave seletora e conectei nos NA de cada relé. E no comum da chave seletora, eu conectei o GND, e as saídas da chave seletora, eu conectei em 3 portas digitais do meu Arduíno Nano. Ou seja, a chave seletora virou um periférico de entrada de dados. obs: Sabemos que são dois fios que vem da rede elétrica pro ventilador, um fio vai direto para o motor do ventilador e ou outro vai pra chave seletora e as saídas da chave seletora que vão pra o ventilador. As modificações que eu fiz foi no fio que vai para a chave seletora, o outro fio que vai direto para o motor do ventilador eu não modifiquei nada.
    Usando o módulo bluetooth , eu conectei meu celular, usando um app. Assim posso realizar o controle do ventilador (regulagem de velocidade e ligar/desligar) tanto pelo celular, quanto pela própria chave seletora do mesmo.
    O projeto funciona basicamente assim: Quando enviar o comando do celular ou da chave seletora pra escolher determinada velocidade ou ligar/desligar o ventilador, o arduíno vai energizar o relé responsável pela tal velocidade ou ligar/desligar o ventilador, dependendo do comando enviado do celular ou da chave seletora. Ou seja, o arduíno vai controlar os relés que são responsáveis pela regulagem de velocidade e por ligar/desligar o ventilador. Ex: se eu enviar o comando do celular ou da chave seletora pro ventilador girar na velocidade 3, o arduíno vai energizar o relé responsável por essa velocidade, conectando o fio responsável por essa velocidade a rede elétrica. E quando enviar o comando pra desligar o ventilador, o arduíno vai desenergizar todos os relés e consequentemente desligará o ventilador.
    Realizei os testes do meu projeto sem carga, e funcionou perfeitamente. Mas com carga (ventilador), fica dando “bug” no meu projeto.
    Esse bug é o seguinte: Quando mando algum comando do celular pra determinada velocidade, os 3 relés só piscam (eles ligam e desligam). Aí tenho que dar o comando 5 ou 6 vezes, pro relé da velocidade desejada, ligar. Volto a repetir, esse bug só acontece quando o ventilador tá conectado aos relés. Sem o ventilador, os relés funcionam perfeitamente. Obs: os parâmetros (tensão e corrente) da minha carga(ventilador) estão dentro dos limites de parâmetros dos relés e esse erro só acontece quando envio os comandos pelo celular. Na chave seletora, funciona perfeitamente.

    1. Olá Relclenson!

      Seu projeto foi entendido. Mas o motivo do bug, isso definitivamente não sei te dizer. Pelo que vi, quando você não conecta o ventilador ao sistema, o envio de comandos pelo celular funciona bem. Mas se você adicionar o ventilador ao sistema, o envio de comandos pelo celular fica intermitente, precisa enviar o comando várias vezes.

      Outro leitor já comentou que teve esse problema de intermitência. Um forma de contornar o problema é usar redundância: a cada clique na tela do Android, enviar o comando ao Arduino múltiplas vezes, visando a diminuir a probabilidade de o Arduino não receber a mensagem. Sugiro que você tente aplicar essa ideia ao seu projeto e veja se dá certo.

      Espero que funcione!

  11. Postando aqui só pra agradecer o excelente tutorial, David! Me ajudou mto em um projeto, usei o HC-05 e deixei a base do programa q postou, funcionou perfeitamente a comunicação entre o arduino e o android.

    Abraços!

  12. Só mais uma pergunta, estou testando esse código com um módulo HC-06, porém não estou obtendo êxito. Eu tenho que configurar algo no celular ou ajustar no código para que essa aplicação funcione?

    1. Sim, você precisa usar o endereço MAC do seu dispositivo HC-06 na linha 59 do código da Activity Principal. Além disso, pra que a conexão Bluetooth seja iniciada, você precisa parear o seu aparelho Android com o HC-06, como você normalmente faz pra parear dois dispositivos Bluetooth.

  13. Podes me ajudar? Quando eu abro o aplicativo, ele conecta e logo fecha sozinho. Estou enviando dados continuamente com um HC-06. Obrigado e parabéns pelo trabalho!

  14. Buenas, estou com um problema que não sei resolver, provavelmente porque não sei quase nada de java, só programo em C, mas enfim, gostaria de saber se podes me ajudar.

    O pic envia vários dados ao celular, sendo separados por letras para que eu saiba o que é cada coisa. Um exemplo de como ele envia: “E0012I4T003F”
    E é para energia, I para índice, T para tempo e o F para sinalizar que terminou.

    eu preciso separar isso no aplicativo, mas não tenho ideia como. em C fiz com alguns If’s, sem problemas. Mas quando tento comparar a variável data no main (não modifiquei os nomes do teu código) utilizando “if(data==’E’)” recebo uma mensagem de erro dizendo que não posso utilizar == com variáveis do tipo byte. Não sei o que fazer. Obrigado desde ja!

    1. Eduardo,

      Quando você usa if(data==’E’), está comparando um array de bytes com um char. Essa comparação pode até fazer sentido se você usar um índice i, por exemplo, if(data[i]==’E’).

      Mas enfim, minha sugestão, usando Java no Android, é utilizar a variável do código que nomeei como dataString para extrair os valores que você quer. Você poderia definir um separador padrão, por exemplo um espaço, para separar os valores relevantes. Em vez de enviar para o app “E0012I4T003F”, você enviaria “0012 4 003″, em que o primeiro elemento é energia, depois do espaço é índice e depois no outro espaço é tempo. Então você usaria o método split() para separar a String usando ” ” como delimitador e depois assinalaria um valor inteiro a cada variável baseado na posição, por exemplo:

      String[] valores = dataString.split(” “);
      int energia = Integer.parseInt(valores[0]);
      int indice = Integer.parseInt(valores[1]);
      int tempo = Integer.parseInt(valores[2]);

      Espero que ajude :)

Leave a Reply

Your email address will not be published. Required fields are marked *