Início › Exercício Extra
📱 Exercício Extra · Módulo HC-05 ou HC-06

Arduino + Bluetooth
+ Android

Guia completo para ligar o Arduino a um telemóvel Android via Bluetooth. Controla LEDs e lê sensores sem fios.

⏱️ Duração: 60–90 min
🧩 Extra: Módulo HC-05 ou HC-06
📱 Android: versão 4.4+

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.

Slave only
⭐⭐

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.

Master / Slave
💡 Para este projeto, qualquer um dos dois funciona. O código é igual — só a ligação difere ligeiramente.

Ligação ao Arduino UNO

⚡ ATENÇÃO — Nível de tensão! O Arduino UNO opera a 5V, mas o módulo BT aceita apenas 3.3V no pino RX. Ligar 5V diretamente ao RX do módulo pode danificá-lo. Usa um divisor de tensão (resistências 1kΩ + 2kΩ) ou um conversor de nível lógico.

🔌 Ligações — HC-06 (ou HC-05)

Módulo BT→Arduino / CircuitoNotas
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:

Pino 11 (5V TX) 1kΩ ~3.3V BT RX 2kΩ GND

Fórmula: Vout = 5V × (2kΩ / (1kΩ + 2kΩ)) = 3.33V ✓

💡 Usa os pinos 10 (RX do Arduino) e 11 (TX do Arduino) em vez dos pinos 0 e 1. Assim podes manter o Monitor Série funcional e carregar código sem retirar o módulo BT.

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.

software_serial_base.ino
#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.

1

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

2

Emparelhar o telemóvel

No Android: Definições → Bluetooth → Procurar dispositivos → liga a HC-06 (ou HC-05). PIN: 1234.

3

Testar com app

Usa a app Serial Bluetooth Terminal (Google Play) para enviar texto e ver o eco de resposta.

ex1_bluetooth_eco.ino
#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
📱 App BT — Botões
🔴 LED Vermelho ON → envia "R"
🟢 LED Verde ON → envia "G"
🟡 LED Amarelo ON → envia "Y"
⬛ Todos OFF → envia "X"
✓ Ligado a HC-06
ex2_bt_leds.ino
#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 "?"

ex3_bt_sensores.ino
#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.

ex4_estacao_bt_lcd.ino
#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átis
🎮

Arduino Bluetooth Controller

Interface gráfica com botões, joystick e painel de controlo pré-configurado para Arduino.

Google Play · Grátis
🔧

BlueSPP

App SPP (Serial Port Profile) simples e leve. Boa para monitorização de dados em tempo real.

Google Play · Grátis
📲 Para usar o Serial Bluetooth Terminal: Abre a app → Menu → Devices → seleciona o HC-06 → Connect. De seguida, na caixa de texto, escreve o comando e prime Enter.

🛠️ 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.

1

Aceder ao MIT App Inventor

Vai a appinventor.mit.edu e inicia sessão com uma conta Google. Clica em "Create Apps!".

2

Criar novo projeto

Clica em "Start new project" e dá um nome. Será aberto o Designer (interface visual).

3

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

4

Desenhar a interface

Adiciona Botões (Button), ListPicker para selecionar dispositivos BT, e Labels para mostrar dados recebidos.

5

Programar com blocos

Clica em "Blocks" no topo direito. Liga os eventos dos botões aos blocos de Bluetooth (BluetoothClient.SendText).

6

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

Lógica de blocos — equivalente em pseudocódigo
// 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()
🎯 Dica: Usa um Clock com intervalo de 500ms para verificar dados recebidos periodicamente. Define BluetoothClient.DelimiterByte como 10 (newline) para receber linha a linha.

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

← Voltar ao Início Ver Estação Meteorológica