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
- 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.
- Ligue o TX do módulo no pino 10 do Uno, que será o RX da serial por software.
- 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.
- Deixe a serial do USB livre para o Monitor Serial e a gravação.
- 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?
Referência: http://blog.filipeflop.com/wireless/tutorial-modulo-bluetooth-com-arduino.html