26 junho 2014

Enviando texto do Android para o Arduino usando bluetooth

Aproveitando o gancho do último artigo sobre display LCD 20x4, no post de hoje vou mostrar como utilizar o módulo bluetooth HC-05 para enviar textos (strings) para o Arduino à partir de um celular com Android, e mostrar 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 :



Para esse experimento vamos utilizar o seguinte material :

A ligação do display 20x4, como eu comentei no post Display LCD 20x4, é a mesma dos displays LCD 16x2 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 16x2, 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.

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 :

Circuito Arduino LCD 20x4 e módulo blueooth



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 :

 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 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.

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 :

Bluetooth SPP - Tela inicial

Na próxima tela, escolha Command Line (linha de comando) :

enviando texto arduino bluetooth

O programa agora irá perguntar qual o caracter a ser enviado no final da string. Selecione o segundo item, char:(\n) :

Bluetooth SPP - Last char

Na próxima tela, digite na caixa de texto a string que você deseja que seja mostrada no display, e aperte OK :

enviando string texto Arduino

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.

16 comentários:

  1. Bom dia, estou realizando um trabalho para a faculdade igual a este. O display que estou usando é o 16x2 e o módulo bluetooth é o HC-06. Realizei os passos para mudar o código para 16x2 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?

    ResponderExcluir
    Respostas
    1. 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 char\n) ? se não estiver setado, o Arduino não vai identificar que você chegou no final da mensagem.

      Abraço !

      Excluir
  2. Qual a função do potenciômetro? regular o brilho do LCD?

    ResponderExcluir
    Respostas
    1. Boa tarde Claudio,

      Ajuste do contraste. Você pode posteriormente trocar por um resistor.

      Abraço !

      Excluir
  3. 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

    ResponderExcluir
    Respostas
    1. Bom dia João,

      O celular se conecta ao módulo bluetooth ? Veja se não esqueceu de setar o char:(\n)

      Abraço !

      Excluir
    2. Sim, se conecta, coloquei o \n também, esta tudo certo, porem não passa o q envio do celular para o LCD

      Excluir
    3. 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?

      Excluir
    4. 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.

      Excluir
  4. amigo, vc sabe como faço pra o modulo hc 05 enviar string pro celular com um lcd exibindo a mesma string?

    ResponderExcluir
    Respostas
    1. Boa tarde Jordan,

      Esse programa do post faz exatamente isso.

      Abraço!

      Excluir
  5. 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.

    ResponderExcluir
  6. 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.

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

    ResponderExcluir
    Respostas
    1. Boa noite José,

      Pode me explicar o que está acontecendo ? Você só transmite do PC para o Arduino via serial ?

      Abraço!

      Excluir
  8. 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!

    ResponderExcluir