| Módulo | Conector Interface | Pino Arduino | Notas |
|---|---|---|---|
| RX — Recebe dados | BLE_RX | D0 (RX) | Recebe do telemóvel via UART |
| TX — Envia dados | BLE_TX | D1 (TX) | Envia para o telemóvel via UART |
| VCC | 3.3V | 3.3V | ⚠️ 3.3V — nunca ligar directamente a 5V |
| GND | GND | GND | — |
Serial.print() envia dados
Serial.read() recebe dados
via UART a 9600 baud
App BLE Terminal
envia caracteres
recebe dados dos sensores
Escolhe uma das seguintes apps gratuitas para comunicar com o HM-10:
Receber caracteres enviados pelo telemóvel e imprimir no Serial Monitor. Define a tabela de comandos que irás usar em todos os exercícios seguintes.
TABELA DE COMANDOS BLE:
void setup() {
Serial.begin(9600); // HM-10 usa 9600 baud por defeito
Serial.println("BLE pronto. A aguardar comandos...");
}
void loop() {
if (Serial.available() > 0) {
char cmd = (char) Serial.read();
// Imprime o que recebeu
Serial.print("Recebido: ");
Serial.println(cmd);
// Interpreta o comando
switch (cmd) {
case '1': Serial.println("CMD: Liga sala"); break;
case '0': Serial.println("CMD: Apaga sala"); break;
case 'A': Serial.println("CMD: Abre porta"); break;
case 'S': Serial.println("CMD: Ler sensores");break;
default: Serial.println("CMD desconhecido");
}
}
}
Controla a iluminação e a porta da casa a partir do telemóvel. Envia '1' para ligar a sala, '0' para apagar, 'A' para abrir a porta, 'F' para fechar.
#include <Servo.h>
#define LED_BRANCO 5
#define LED_AMARELO 6
#define SERVO_PORTA 10
Servo portaServo;
void setup() {
Serial.begin(9600);
pinMode(LED_BRANCO, OUTPUT);
pinMode(LED_AMARELO, OUTPUT);
portaServo.attach(SERVO_PORTA);
portaServo.write(0); // Porta fechada
Serial.println("BLE Domotica ON");
}
void loop() {
if (Serial.available()) {
char cmd = (char) Serial.read();
switch (cmd) {
case '1':
digitalWrite(LED_BRANCO, HIGH);
Serial.println("LED_BRANCO ON");
break;
case '0':
digitalWrite(LED_BRANCO, LOW);
Serial.println("LED_BRANCO OFF");
break;
case '2':
digitalWrite(LED_AMARELO, HIGH);
Serial.println("LED_AMARELO ON");
break;
case '3':
digitalWrite(LED_AMARELO, LOW);
Serial.println("LED_AMARELO OFF");
break;
case 'A':
portaServo.write(90);
Serial.println("PORTA ABERTA");
break;
case 'F':
portaServo.write(0);
Serial.println("PORTA FECHADA");
break;
}
}
}
Ao receber o comando 'S' do telemóvel, o Arduino envia uma string com todos os valores dos sensores. O telemóvel recebe e mostra no terminal BLE.
#define LDR A0
#define MQ2_ANA A1
#define PIR 2
void setup() {
Serial.begin(9600);
pinMode(PIR, INPUT);
}
void enviarSensores() {
int luz = analogRead(LDR);
int gas = analogRead(MQ2_ANA);
int mov = digitalRead(PIR);
// Formato compacto para o telemóvel
Serial.print("LUZ:"); Serial.print(luz);
Serial.print(" GAS:"); Serial.print(gas);
Serial.print(" PIR:"); Serial.print(mov == HIGH ? "1" : "0");
Serial.println(); // \n para delimitar a mensagem
}
void loop() {
if (Serial.available()) {
char cmd = (char) Serial.read();
if (cmd == 'S') {
enviarSensores(); // Resposta ao pedido
}
}
// Envia automaticamente a cada 5 segundos
static unsigned long ultimo = 0;
if (millis() - ultimo > 5000) {
enviarSensores();
ultimo = millis();
}
}
Integração completa: o Arduino responde a todos os comandos da tabela definida no Ex. 1 e envia dados dos sensores automaticamente a cada 3 segundos. Ideal para usar com uma app personalizada feita no MIT App Inventor.
#include <Servo.h>
#define LED_BRANCO 5
#define LED_AMARELO 6
#define SERVO_PORTA 10
#define SERVO_JAN 12
#define RELE 13
#define LDR A0
#define MQ2_ANA A1
#define PIR 2
Servo portaServo;
Servo janelaServo;
unsigned long ultimoEnvio = 0;
const unsigned long INTERVALO_ENVIO = 3000;
void setup() {
Serial.begin(9600);
pinMode(LED_BRANCO, OUTPUT);
pinMode(LED_AMARELO, OUTPUT);
pinMode(RELE, OUTPUT);
pinMode(PIR, INPUT);
digitalWrite(RELE, HIGH); // Relé OFF (lógica inversa)
portaServo.attach(SERVO_PORTA);
janelaServo.attach(SERVO_JAN);
portaServo.write(0);
janelaServo.write(0);
Serial.println("CASA:PRONTA");
}
void enviarEstado() {
Serial.print("LUZ:"); Serial.print(analogRead(LDR));
Serial.print(" GAS:"); Serial.print(analogRead(MQ2_ANA));
Serial.print(" PIR:"); Serial.print(digitalRead(PIR));
Serial.println();
}
void processarComando(char cmd) {
switch (cmd) {
// ── LEDs ──
case '1': digitalWrite(LED_BRANCO, HIGH); Serial.println("LED_BRANCO ON"); break;
case '0': digitalWrite(LED_BRANCO, LOW); Serial.println("LED_BRANCO OFF"); break;
case '2': digitalWrite(LED_AMARELO, HIGH); Serial.println("LED_AMARELO ON"); break;
case '3': digitalWrite(LED_AMARELO, LOW); Serial.println("LED_AMARELO OFF"); break;
// ── Porta ──
case 'A': portaServo.write(90); Serial.println("PORTA ABERTA"); break;
case 'F': portaServo.write(0); Serial.println("PORTA FECHADA"); break;
// ── Janela ──
case 'J': janelaServo.write(90); Serial.println("JANELA ABERTA"); break;
case 'j': janelaServo.write(0); Serial.println("JANELA FECHADA"); break;
// ── Relé (ventoinha) ──
case 'R': digitalWrite(RELE, LOW); Serial.println("RELE ON"); break;
case 'r': digitalWrite(RELE, HIGH); Serial.println("RELE OFF"); break;
// ── Solicitar sensores ──
case 'S': enviarEstado(); break;
}
}
void loop() {
// Processar comandos recebidos
while (Serial.available()) {
char cmd = (char) Serial.read();
processarComando(cmd);
}
// Enviar estado automático a cada 3s
if (millis() - ultimoEnvio > INTERVALO_ENVIO) {
enviarEstado();
ultimoEnvio = millis();
}
}