Eletrônica Por Equipe DevBras

Capa do artigo: Bluetooth HC-05 no Arduino: troque nome e senha e sobreviva à queda da conexão

Bluetooth HC-05 no Arduino: troque nome e senha e sobreviva à queda da conexão

Configure nome, PIN e velocidade do HC-05 por comandos AT, proteja o pino RX, trate desconexão sem travar o loop e saiba o que um PIN de quatro dígitos não protege.

Você abre a lista de Bluetooth do celular para parear com a bomba da horta e aparece "HC-05". Seu vizinho, do outro lado do muro, vê o mesmo nome, e o PIN é o de fábrica, que qualquer tutorial publica. Na mesa funcionava; no quintal, a conexão cai quando a bomba liga, e o programa fica esperando para sempre. A resposta curta: troque nome e PIN do módulo por comandos AT, trate a conexão como algo que cai a qualquer momento, com um estado seguro quando o celular some, e não use esse canal para nada que precise de segurança de verdade.

Este guia parte do ponto em que a comunicação serial básica já funciona, assunto do guia Bluetooth HC-05 no Arduino. O exemplo é uma bomba de irrigação comandada pelo celular, com um Uno e um HC-05 em plaquinha de seis pinos.

Por que o padrão de fábrica é um problema

O HC-05 é Bluetooth clássico, perfil de porta serial. Ele fica visível com um nome genérico e aceita pareamento com um PIN numérico, geralmente 1234 ou 0000 de fábrica. Isso significa duas coisas: qualquer pessoa no alcance sabe que existe um módulo de hobby ali, e qualquer pessoa que conheça o PIN padrão pode parear e mandar comandos.

Trocar o PIN resolve o curioso que tenta o padrão. Não transforma o módulo em fechadura. O pareamento com PIN curto, usado nesses módulos, não foi feito para resistir a um atacante determinado. Use o HC-05 para comandos cujo pior caso é incômodo, como ligar uma bomba que também desliga sozinha, e não para abrir porta, desarmar alarme ou trafegar senha.

Como ligar sem forçar o módulo

  1. Alimente a plaquinha pelo pino VCC conforme a serigrafia; a maioria das plaquinhas de seis pinos tem regulador e aceita 5 V. Ligue GND no GND do Arduino.
  2. Ligue o TX do módulo no pino 10 do Uno, que será o RX da serial por software.
  3. Ligue o pino 11 do Uno ao RX do módulo através de um divisor de tensão, por exemplo 1 kΩ em série e 2 kΩ para o GND. O RX do HC-05 trabalha com lógica de 3,3 V, e o Uno manda 5 V.
  4. Deixe a serial do USB livre para o Monitor Serial e a gravação.
  5. Se houver relé ou motor no projeto, use fonte capaz e GND comum. Queda de tensão quando a carga liga derruba o rádio e parece defeito de código.

Como trocar nome, PIN e velocidade com comandos AT

Para entrar no modo de comandos, mantenha pressionado o botão da plaquinha (ou leve o pino EN/KEY ao nível alto, conforme a sua versão) enquanto liga a alimentação. O LED passa a piscar devagar, a cada dois segundos aproximadamente. Nesse modo, o HC-05 normalmente fala a 38400 bauds. Use este sketch de passagem:

#include <SoftwareSerial.h>

SoftwareSerial bt(10, 11); // RX, TX do lado do Arduino

void setup() {
  Serial.begin(9600);
  bt.begin(38400);
  Serial.println("Modo AT: digite os comandos");
}

void loop() {
  if (bt.available()) Serial.write(bt.read());
  if (Serial.available()) bt.write(Serial.read());
}

No Monitor Serial, configure o fim de linha para enviar NL e CR e mande os comandos um por um, esperando o OK de cada:

AT
AT+NAME=Horta-Bomba
AT+PSWD=4827
AT+UART=9600,0,0
AT+NAME?
AT+PSWD?

O formato varia entre versões de firmware. Em algumas, o PIN precisa ir entre aspas, como AT+PSWD="4827"; se um comando devolver erro, tente essa forma e confira com a consulta terminada em interrogação. O HC-06, primo do HC-05, usa outro conjunto de comandos e outra velocidade padrão no modo AT, então não copie esta lista para ele. Depois, desligue e ligue o módulo sem o botão, apague o pareamento antigo no celular e pareie de novo com o PIN novo.

Escolha um nome que não descreva o que o módulo controla nem onde fica. "Horta-Bomba" está aqui só para o exemplo ficar legível.

Como tratar a conexão que cai

O celular sai do alcance, a tela bloqueia e o aplicativo fecha, a bateria acaba. Se a bomba ligou com "BOMBA ON" e o "BOMBA OFF" nunca chega, a horta vira lago. A regra é a mesma de qualquer controle remoto: sem contato recente, volte ao estado seguro. O aplicativo manda PING a cada segundo; se o Arduino passar três segundos sem um comando válido, desliga a bomba.

#include <SoftwareSerial.h>
#include <string.h>

SoftwareSerial bt(10, 11);

const uint8_t PINO_BOMBA = 7;
const unsigned long LIMITE_SEM_CONTATO_MS = 3000;

char linha[24];
uint8_t tamanho = 0;
bool descartando = false;
bool bombaLigada = false;
unsigned long ultimoContato = 0;

void ajustarBomba(bool ligar) {
  bombaLigada = ligar;
  digitalWrite(PINO_BOMBA, ligar ? HIGH : LOW);
}

void tratarComando(const char *cmd) {
  if (strcmp(cmd, "PING") == 0) {
    bt.println("PONG");
  } else if (strcmp(cmd, "BOMBA ON") == 0) {
    ajustarBomba(true);
    bt.println("OK ON");
  } else if (strcmp(cmd, "BOMBA OFF") == 0) {
    ajustarBomba(false);
    bt.println("OK OFF");
  } else {
    bt.println("ERRO");
    return;
  }
  ultimoContato = millis();
}

void setup() {
  pinMode(PINO_BOMBA, OUTPUT);
  ajustarBomba(false);
  bt.begin(9600);
}

void loop() {
  while (bt.available()) {
    char c = bt.read();
    if (c == '\r') continue;
    if (c == '\n') {
      if (!descartando && tamanho > 0) {
        linha[tamanho] = '\0';
        tratarComando(linha);
      }
      tamanho = 0;
      descartando = false;
    } else if (descartando) {
      continue;
    } else if (tamanho < sizeof(linha) - 1) {
      linha[tamanho++] = c;
    } else {
      descartando = true;
    }
  }

  if (bombaLigada && millis() - ultimoContato > LIMITE_SEM_CONTATO_MS) {
    ajustarBomba(false);
  }
}

Repare no que esse código não faz: ele não usa readString() nem espera bloqueando por uma linha inteira, então o loop continua checando o tempo mesmo sem dado chegando. Linhas maiores que o buffer são descartadas até o próximo fim de linha, em vez de estourar a memória. Comando desconhecido recebe "ERRO" e não renova o contato. Mesmo assim, para uma bomba, vale um tempo máximo ligado independente do celular, como no guia sobre o que o relé não resolve sozinho.

Erros comuns

  • Manter nome e PIN de fábrica: qualquer um no alcance identifica o módulo e pode parear com o PIN publicado em todo tutorial.
  • Ligar o TX de 5 V do Uno direto no RX do módulo: o pino trabalha acima do que foi projetado e pode falhar com o tempo.
  • Esperar a linha inteira de forma bloqueante: se a conexão cai no meio, o loop trava e a carga fica no último estado.
  • Não ter estado seguro sem contato: a bomba fica ligada quando o celular sai do alcance.
  • Esquecer de configurar o fim de linha no modo AT: o módulo não responde e parece queimado.
  • Tratar o PIN como autenticação forte: usar o módulo para fechadura ou alarme expõe a casa a quem souber atacar o pareamento.

Checklist

  • Nome e PIN foram trocados e conferidos com as consultas AT.
  • O pareamento antigo foi removido do celular.
  • O RX do módulo recebe sinal por divisor de tensão.
  • A leitura da serial não bloqueia o loop e limita o tamanho da linha.
  • Sem comando válido por alguns segundos, a carga vai ao estado seguro.
  • A alimentação aguenta o pico da carga sem derrubar o rádio.
  • Nenhuma função de segurança da casa depende só desse canal.

Pegue o celular agora e procure dispositivos Bluetooth perto do seu projeto: ele aparece com o nome de fábrica? E se você desligar o Bluetooth do celular com a carga ligada, quanto tempo ela leva para desligar?

Avalie este artigo

Referência: http://blog.filipeflop.com/wireless/tutorial-modulo-bluetooth-com-arduino.html