O Módulo Bluetooth HC-05 / HC-06
📶 Comunicação Série Sem Fios
Os módulos HC-05 e HC-06 adicionam conectividade Bluetooth clássica (versão 2.0) ao Arduino. Do ponto de vista do código, funcionam exatamente como a comunicação série — os dados viajam pelo ar até ao telemóvel em vez de pelo cabo USB. Perfeito para controlo remoto e recolha de dados sem fios.
Alcance
~10 metros em espaço aberto. Paredes reduzem o alcance.
Velocidade
9600 baud por defeito. Configurável via comandos AT (HC-05).
Alimentação
VCC: 3.6V–6V. Pino TX do módulo a 3.3V — usar divisor de tensão no RX do módulo.
PIN Padrão
HC-05: 1234
HC-06: 1234 ou 0000
HC-05 vs HC-06
HC-06 (mais simples)
Apenas funciona como escravo (slave).
4 pinos: VCC, GND, TX, RX.
Não tem botão de modo AT.
Mais fácil de usar para iniciantes.
Recomendado para este projeto.
HC-05 (mais completo)
Funciona como mestre ou escravo.
6 pinos (inclui EN e STATE).
Tem botão para entrar em modo AT.
Permite configurar nome, PIN e baud rate.
Mais versátil para projetos avançados.
Ligação ao Arduino UNO
🔌 Ligações — HC-06 (ou HC-05)
| Módulo BT | → | Arduino / Circuito | Notas |
|---|---|---|---|
| VCC | → | 5V | Alimentação |
| GND | → | GND | Terra |
| TX (módulo) | → | Pino 10 (Arduino RX) | 3.3V → OK para Arduino |
| RX (módulo) | → | Divisor de tensão → Pino 11 (Arduino TX) | ⚠️ Precisa de divisor! |
⚡ Divisor de Tensão para o RX do Módulo
Converte os 5V do Arduino para ~3.3V com duas resistências em série:
Fórmula: Vout = 5V × (2kΩ / (1kΩ + 2kΩ)) = 3.33V ✓
SoftwareSerial — Comunicar com o Módulo
Como usamos os pinos 10 e 11 (em vez dos pinos 0/1 do hardware série), precisamos da biblioteca SoftwareSerial que emula comunicação série em qualquer pino digital.
#include <SoftwareSerial.h>
// SoftwareSerial(RX_arduino, TX_arduino)
// RX = pino 10 (recebe do TX do módulo BT)
// TX = pino 11 (envia para o RX do módulo BT, via divisor)
SoftwareSerial bluetooth(10, 11);
void setup() {
Serial.begin(9600); // Monitor Série (USB)
bluetooth.begin(9600); // Módulo BT (tem de ser igual ao baud do módulo)
Serial.println("Bluetooth pronto!");
}
void loop() {
// Reencaminha dados do BT para o Monitor Série
if (bluetooth.available()) {
char c = bluetooth.read();
Serial.print("Recebido: ");
Serial.println(c);
}
// Reencaminha dados do Monitor Série para o BT
if (Serial.available()) {
bluetooth.write(Serial.read());
}
}
Exercício 1 — Teste de Eco
O Arduino recebe texto pelo Bluetooth e devolve-o de volta — confirma que a comunicação funciona.
Carregar o código abaixo
Antes de ligar o módulo BT, desliga os pinos 10 e 11 temporariamente (o módulo interfere com o upload).
Emparelhar o telemóvel
No Android: Definições → Bluetooth → Procurar dispositivos → liga a HC-06 (ou HC-05). PIN: 1234.
Testar com app
Usa a app Serial Bluetooth Terminal (Google Play) para enviar texto e ver o eco de resposta.
#include <SoftwareSerial.h>
SoftwareSerial bt(10, 11); // RX, TX
void setup() {
Serial.begin(9600);
bt.begin(9600);
Serial.println("Aguardar ligacao Bluetooth...");
}
void loop() {
if (bt.available()) {
String mensagem = bt.readStringUntil('\n');
mensagem.trim();
Serial.print("Recebido via BT: ");
Serial.println(mensagem);
// Enviar eco de volta
bt.print("Arduino recebeu: ");
bt.println(mensagem);
}
}
Exercício 2 — Controlar LEDs via Bluetooth
Envia caracteres pelo telemóvel para ligar/desligar LEDs coloridos. Protocolo simples: um caractere = uma ação.
🔌 Componentes adicionais
| Arduino | → | Componente |
|---|---|---|
| Pino 4 | → | Resistência 220Ω → LED Vermelho |
| Pino 5 | → | Resistência 220Ω → LED Verde |
| Pino 6 | → | Resistência 220Ω → LED Amarelo |
| GND | → | Cátodo dos 3 LEDs |
#include <SoftwareSerial.h>
SoftwareSerial bt(10, 11);
const int LED_R = 4;
const int LED_G = 5;
const int LED_Y = 6;
void setup() {
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_Y, OUTPUT);
Serial.begin(9600);
bt.begin(9600);
bt.println("Arduino pronto! Comandos: R G Y X");
}
void desligaTodos() {
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, LOW);
digitalWrite(LED_Y, LOW);
}
void loop() {
if (bt.available()) {
char cmd = bt.read();
switch (cmd) {
case 'R': case 'r':
desligaTodos();
digitalWrite(LED_R, HIGH);
bt.println("LED Vermelho ON");
break;
case 'G': case 'g':
desligaTodos();
digitalWrite(LED_G, HIGH);
bt.println("LED Verde ON");
break;
case 'Y': case 'y':
desligaTodos();
digitalWrite(LED_Y, HIGH);
bt.println("LED Amarelo ON");
break;
case 'X': case 'x':
desligaTodos();
bt.println("Todos OFF");
break;
default:
bt.print("Comando desconhecido: ");
bt.println(cmd);
}
Serial.print("Comando BT: "); Serial.println(cmd);
}
}
Exercício 3 — Enviar Dados de Sensor para o Telemóvel
O Arduino lê temperatura e luminosidade e envia os valores para o telemóvel de 2 em 2 segundos, ou quando solicitado com o comando "?"
#include <SoftwareSerial.h>
SoftwareSerial bt(10, 11);
const int LM35 = A0;
const int LDR = A1;
unsigned long ultimaLeitura = 0;
const long INTERVALO = 2000; // Enviar a cada 2s
void setup() {
Serial.begin(9600);
bt.begin(9600);
bt.println("=== Estacao BT ===");
bt.println("Env. automatico a 2s");
bt.println("Envia '?' para leitura imediata");
}
float lerTemp() {
int v = analogRead(LM35);
return (v * 5000.0 / 1023.0) / 10.0;
}
int lerLuz() {
return map(analogRead(LDR), 0, 1023, 0, 100);
}
void enviarDados() {
float temp = lerTemp();
int luz = lerLuz();
// Formato CSV para fácil parsing na app
bt.print("TEMP:"); bt.print(temp, 1);
bt.print(",LUZ:"); bt.print(luz);
bt.print(",TS:"); bt.println(millis() / 1000);
Serial.print("Enviado — T:"); Serial.print(temp);
Serial.print(" L:"); Serial.println(luz);
}
void loop() {
// Envio periódico
if (millis() - ultimaLeitura >= INTERVALO) {
ultimaLeitura = millis();
enviarDados();
}
// Resposta a pedido
if (bt.available()) {
char c = bt.read();
if (c == '?') {
bt.println("--- Leitura Imediata ---");
enviarDados();
}
}
}
Exercício 4 — Estação Completa + LCD + Bluetooth
Combinação total: mostra dados no LCD e envia-os ao telemóvel simultaneamente. Aceita comandos BT para ligar/desligar o LCD e alertas.
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
SoftwareSerial bt(10, 11);
LiquidCrystal lcd(12, 8, 5, 4, 3, 2); // Ajusta pinos se necessário
const int LM35 = A0;
const int LDR = A1;
const int LED_R = 6;
const int LED_G = 7;
bool lcdLigado = true;
unsigned long ultimo = 0;
float lerTemp() {
return (analogRead(LM35) * 5000.0 / 1023.0) / 10.0;
}
int lerLuz() {
return map(analogRead(LDR), 0, 1023, 0, 100);
}
void atualizarLCD(float t, int l) {
if (!lcdLigado) return;
lcd.setCursor(0, 0);
lcd.print("T:"); lcd.print(t, 1); lcd.print((char)223); lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Luz:"); lcd.print(l); lcd.print("% ");
}
void verificarAlertas(float t, int l) {
bool quente = t > 28.0;
bool escuro = l < 20;
digitalWrite(LED_R, quente ? HIGH : LOW);
digitalWrite(LED_G, escuro ? HIGH : LOW);
if (quente) { bt.println("⚠️ ALERTA: Temperatura alta!"); }
if (escuro) { bt.println("⚠️ ALERTA: Pouca luminosidade!"); }
}
void setup() {
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
lcd.begin(16, 2);
lcd.print(" Kit B - LED PT");
Serial.begin(9600);
bt.begin(9600);
delay(2000);
lcd.clear();
bt.println("=== Estacao LCD+BT ===");
bt.println("Comandos: L=LCD on/off, ?=leitura");
}
void loop() {
// Processar comandos BT
if (bt.available()) {
char c = bt.read();
if (c == 'L' || c == 'l') {
lcdLigado = !lcdLigado;
if (!lcdLigado) lcd.clear();
bt.print("LCD: "); bt.println(lcdLigado ? "ON" : "OFF");
}
if (c == '?') {
float t = lerTemp(); int l = lerLuz();
bt.print("T:"); bt.print(t,1);
bt.print(" L:"); bt.println(l);
}
}
// Atualização periódica (cada 1s)
if (millis() - ultimo >= 1000) {
ultimo = millis();
float t = lerTemp(); int l = lerLuz();
atualizarLCD(t, l);
verificarAlertas(t, l);
// Envio BT periódico (formato CSV)
bt.print("DATA,"); bt.print(t,1);
bt.print(","); bt.println(l);
}
}
📱 Apps Android Recomendadas
Serial Bluetooth Terminal
App de terminal série via BT. Perfeita para testes rápidos — envia e recebe texto livremente. Tem botões configuráveis.
Google Play · GrátisArduino Bluetooth Controller
Interface gráfica com botões, joystick e painel de controlo pré-configurado para Arduino.
Google Play · GrátisBlueSPP
App SPP (Serial Port Profile) simples e leve. Boa para monitorização de dados em tempo real.
Google Play · Grátis🛠️ Criar a Tua Própria App — MIT App Inventor
O MIT App Inventor (appinventor.mit.edu) permite criar apps Android visuais com blocos — sem código! É ideal para fazer uma interface personalizada para o teu projeto Arduino.
Aceder ao MIT App Inventor
Vai a appinventor.mit.edu e inicia sessão com uma conta Google. Clica em "Create Apps!".
Criar novo projeto
Clica em "Start new project" e dá um nome. Será aberto o Designer (interface visual).
Adicionar componente Bluetooth
No painel Palette → Connectivity → arrasta BluetoothClient para o ecrã. Este componente não é visível — aparece na secção "Non-visible components".
Desenhar a interface
Adiciona Botões (Button), ListPicker para selecionar dispositivos BT, e Labels para mostrar dados recebidos.
Programar com blocos
Clica em "Blocks" no topo direito. Liga os eventos dos botões aos blocos de Bluetooth (BluetoothClient.SendText).
Testar e exportar
Usa a app MIT AI2 Companion (Google Play) para testar em tempo real. Para publicar: Build → App (save .apk to my computer).
// Quando o utilizador clica em "Ligar"
quando ListPicker.AfterPicking:
BluetoothClient.Connect(ListPicker.Selection)
// Quando clica em botão LED Vermelho
quando BotaoR.Click:
se BluetoothClient.IsConnected:
BluetoothClient.SendText("R")
// Receber dados do Arduino (usar Clock/Timer)
quando Clock.Timer:
se BluetoothClient.BytesAvailableToReceive > 0:
dados = BluetoothClient.ReceiveText(99)
LabelDados.Text = dados
// Ao pressionar "Desligar"
quando BotaoDesligar.Click:
BluetoothClient.Disconnect()
🔧 Problemas Comuns e Soluções
Não consigo emparelhar o módulo
Garante que o LED do módulo está a piscar rapidamente (disponível para emparelhar). Se piscar lentamente, já está ligado a outro dispositivo — desliga o Bluetooth do outro dispositivo ou reinicia o módulo.
O upload falha quando o módulo está ligado
Os pinos TX/RX do Arduino (0 e 1) são partilhados com o USB. Se estiveres a usar os pinos 0/1 para o BT, desliga os fios durante o upload. Com SoftwareSerial nos pinos 10/11, não é necessário.
Recebo caracteres errados / dados corrompidos
O baud rate do módulo e do bt.begin() têm de ser iguais. O padrão do HC-06 é 9600. O HC-05 pode estar configurado para outro valor — verifica com comandos AT: AT+UART?
O módulo aquece muito ou não funciona
Verifica se ligaste o RX do módulo diretamente ao pino TX do Arduino (5V) sem divisor de tensão. Isso pode ter danificado o módulo. Usa sempre o divisor 1kΩ + 2kΩ.
Testar o módulo com comandos AT (HC-05)
Liga o botão EN (ou KEY) antes de alimentar. Abre o Monitor Série a 38400 baud. Escreve AT — deve responder OK. Usa AT+NAME=ArduinoKitB para mudar o nome.