Comunicação Arduino e Android usando bluetooth
Aproveitando o gancho do último artigo sobre display LCD 20×4, no post de hoje vou mostrar como utilizar o módulo bluetooth HC-05 para realizar uma comunicação Arduino e Android, enviando textos (strings) à partir de um smartphone, mostrando esses dados no display.
Quando enviamos dados do Android para o módulo bluetooth, esses dados são transmitidos para o Arduino via serial. É o mesmo processo utilizado quando interagimos com o Arduino usando o Serial Monitor: o Serial Monitor pode tanto receber como enviar informações.
No projeto desse post, eu tenho um celular com Android e bluetooth, e o programa Bluetooth SPP instalado. Nesse programa, eu vou digitar uma string e enviá-la para o módulo blueooth do Arduino.
O Arduino vai receber essa informação, e ao detectar o caracter de controle “n”, indicando o final da string, vai mostrá-la no display.
Material utilizado
Para esse experimento vamos utilizar o seguinte material:
- Módulo BT HC-05
- 2 resistores para montagem do divisor de tensão
- Display LCD 20×4
- Celular com Android e Bluetooth
- Potenciômetro de 10 K
A ligação do display 20×4, como eu comentei no post Display LCD 20×4, é a mesma dos displays LCD 16×2 que já usamos anteriormente. O que muda é apenas o comando
lcd.begin(20 , 4);
que informa ao Arduino que agora estamos controlando um display com 20 colunas e 4 linhas. Assim, você pode tranquilamente montar esse circuito com um display 16×2, se preferir.
O módulo bluetooth HC-05 que eu utilizei trabalha com nível de sinal de 3.3v (não confundir com a tensão de alimentação, que é de 5 volts), e o Arduino Uno trabalha com nível de sinal de 5v, por isso não podemos ligar diretamente o módulo BT ao Arduino. Foi necessária a montagem de um divisor de tensão usando dois resistores. Eu utilizei dois de 330 ohms, o que me deu um nível de sinal de 2.5v, suficiente para os testes.
Para cálculo do divisor de tensão, use o calculador desse link. Na página, digite 5 para a tensão de entrada, digite os valores dos resistores (R1 e R2) que você possui, e pressione o botão Calcular para verificar a tensão de saída no campo correspondente, lembrando que por segurança esta deve ser, no máximo, de 3.3v.
Circuito Arduino e módulo HC-05
Com os valores dos resistores devidamente calculados, monte o circuito abaixo, lembrando-se de deixar por último a ligação do Vcc do módulo bluetooth, pois só vamos ligá-lo após carregar o programa no Arduino, evitando problemas na comunicação serial, pois tanto o computador como o módulo bluetooth usam esse mesmo caminho para se comunicar com o Arduino:
Com o Vcc do módulo bluetooth desligado, carregue o programa abaixo no Arduino. Por ser comunicação serial, você também pode utilizar este programa para testar a comunicação sem o módulo BT. Basta abrir o serial monitor e escolher a opção Nova Linha na parte inferior da tela para que seja enviado o caracter de controle n ao final da string:
// Programa : LCD 20x4 Arduino com modulo bluetooth HC-05 // Autor : Arduino e Cia // Carrega a biblioteca do LCD #include <LiquidCrystal.h> #include <VirtualWire.h> // Inicializa o LCD LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int incomingByte = 0; char buf[20]; int num = 0; String dados; void setup() { // Define o LCD com 20 colunas e 4 linhas lcd.begin(20, 4); // Mostra informacoes no display lcd.setCursor(3,0); lcd.print("Arduino e Cia"); lcd.setCursor(2,1); lcd.print("Display LCD 20x4"); lcd.setCursor(1,3); lcd.print("arduinoecia.com.br"); Serial.begin(9600); delay(2000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Aguardando..."); } void loop() { while(Serial.available() > 0) { buf[num] = Serial.read(); lcd.clear(); if (buf[num] == '\n') { Serial.println(buf); String dados = buf; dados.trim(); int tamanho_string = dados.length(); lcd.setCursor(0,0); lcd.print(dados); lcd.setCursor(0,2); lcd.print("Caracteres : "); lcd.print(tamanho_string); // apaga o buffer for (int ca =0; ca<20; ca++) { buf[ca]=0; } num=0; break; } num++; } }
Desconecte o cabo usb do seu Arduino e utilize uma fonte externa para alimentação, assim você evita os problemas de conflito de serial citados anteriormente.
Testando a comunicação Arduino e Android
Conecte agora o pino Vcc do módulo bluetooth e no seu smartphone com Android carregue o programa Bluetooth SPP, que pode ser encontrado no Google Play, nesse link.
Na tela inicial do programa, selecione o dispositivo ao qual você quer se conectar. No exemplo abaixo, o módulo tem o nome de HC-05, que já foi pareado anteriormente:
Na próxima tela, escolha Command Line (linha de comando):
O programa agora irá perguntar qual o caracter a ser enviado no final da string. Selecione o segundo item, char:(n):
Na próxima tela, digite na caixa de texto a string que você deseja que seja mostrada no display, e aperte OK:
O display mostrará tanto a string pelo celular, como também a quantidade de caracteres que foram recebidos.
Quer mais exemplos de utilização do Arduino com bluetooth ? É só clicar aqui.
Bom dia, estou realizando um trabalho para a faculdade igual a este. O display que estou usando é o 16×2 e o módulo bluetooth é o HC-06. Realizei os passos para mudar o código para 16×2 e compilei. Instalei o App no meu celular e fiz o pareamento, quando abro o mesmo, não aparece a tela descrita para selecionar o dispositivo, então prossigo e caio na tela direto para digitar a mensagem, mas a mesma não aparece no display. o meu professor falou que não é preciso fazer o divisor de tensão, por isso liguei-o direto, será que é por isso que não consigo exito na execução do programa?
Boa tarde Iago,
Se o seu módulo trabalhar com nível de sinal de 5V, você realmente não precisa, mas se for o módulo que trabalha com 3.3V, eu recomendo o divisor de tensão para não danificar a placa.
Eu tenho vários relatos de pessoas que ligaram direto e queimaram a parte de comunicação serial, espero que não seja o seu caso.
Você escolheu o caracter de final de linha (o charn) ? se não estiver setado, o Arduino não vai identificar que você chegou no final da mensagem.
Abraço !
Qual a função do potenciômetro? regular o brilho do LCD?
Boa tarde Claudio,
Ajuste do contraste. Você pode posteriormente trocar por um resistor.
Abraço !
Amigo não consigo ler no LCD o q eu escrevo no celular, eu usei um programa q grava no Arduino uma forma de programar o hc-06, e por consegui trocar a senha do modulo e alterar para 9600 a velocidade, mas não consigo escrever do celular no LCD, só do console do PC, q consigo enviar algum caractere ou mensagem
Bom dia João,
O celular se conecta ao módulo bluetooth ? Veja se não esqueceu de setar o char:(n)
Abraço !
Sim, se conecta, coloquei o n também, esta tudo certo, porem não passa o q envio do celular para o LCD
Bom dia amigo, gostaria de dizer que inverti os pino no Arduino de RX e TX, agora o q eu envio do terminal do PC para o Arduino aparece no celular, mas o q eu envio do celular não aparece nem no PC e nem no LCD, o q eu envio do PC aparece no LCD e é enviado para a tela do programa do celular, será q o meu modulo esta com defeito?, será q esse modulo HC-06 não serve para isso?
Bom dia João,
O seu módulo pode estar com defeito sim, é uma possibilidade. Você montou o divisor de tensão corretamente ?
Abraço.
amigo, vc sabe como faço pra o modulo hc 05 enviar string pro celular com um lcd exibindo a mesma string?
Boa tarde Jordan,
Esse programa do post faz exatamente isso.
Abraço!
Olá amigos, Estou tentando modificar minha programação que hoje conecta a um celular via HC-06 e uma programação android App Inventor. Após conexão com o celular, ele envia um comando para o HC-06 e o mesmo responde com outro comando, ou seja o HC-06 recebe e envia para o celular dados. Estou incluindo agora o HC-05 que conecta com o HC-06, envia dados tudo ok, mas quando o HC-06 responde com Serial.println("xx") o HC-05 não lê via Serial.read(). Gostaria que o HC-05 escreve-se e lê-se a serial. Por favor ajude-me.
Olá Amigos, também tenho a mesma necessidade do SamPerfume. Mas no meu caso, eu estou fazendo no código ao invés de usar o AppInventor. Poderiam mostrar um exemplo de como fazer sem ser pelo AppInventor? Obrigado.
Olá Amigos. Também estou tendo o mesmo problema relatado pelo Joao Paulo. Aliás, mais sete alunos da minha classe tem o mesmo problema. Só transmite do pc para o Arduino. O divisor de tensão foi revisado por dois professores e está ok.
Boa noite José,
Pode me explicar o que está acontecendo ? Você só transmite do PC para o Arduino via serial ?
Abraço!
Olá pessoal, tudo certo?
Estou com dúvidas para criar uma comunicação entre o arduino e o celular.
Preciso criar um tipo de comunicação de leitura e escrita, exemplo:
prog var1 5000 // se enviar este codigo via serial, ele fará com que a "var1" receba 5000
load var1 // lê o valor da "var1"
no caso, não consigo fazer um código para que, quando eu digite "prog" ele entre em modo de editar a variável, o mesmo com o "load" para ler a variável salva.
a parte de leitura não é tão importante, é mais a escrita da variável.
Se puderem ajudar ficaria muito grato!
olá ! tem como aplicar esse código em um cubo de leds ? eu vi um cara que fez algo assim, mas só que no cubo de leds… se poder me envie um e-mail para [email protected]
boa noite,
gostaria de pegar um texto de um spinner e envia-lo via bluetooth para o arduino.
poderiam me ajudar no codigo do android studio?
Obrigado.
estou criando um app pelo android studio, e queria informar o delay do arduino através do app por uma String, poderia ajudar?
teria como informar o delay do arduino por um app através de uma String?
Oi Jean,
É possível sim, você quer enviar por exemplo 100ms e alterar o tempo de delay de um programa, é isso?
Abraço!
Adilson