Atenção com o seu Navegador!
A Web Bluetooth API pode não ser suportada neste ambiente. No **Android**, use o Google Chrome. No **iOS (iPhone)**, use navegadores como o Bluefy ou WebBLE. Certifique-se também de que esta página está rodando sob conexão segura **HTTPS**.
Conectar ao Robô
Ligue o Bluetooth do celular e o ESP32 para iniciar o pareamento.
Configurações avançadas de UUID Bluetooth
Direcionais do Robô
DICA: Segure os botões para mover e solte para parar automaticamente.
Potência do Motor
150 / 255
MIN (0)
MÉDIO (128)
MÁX (255)
Ações Extra
Terminal de Depuração
[Sistema] Inicializando console... Pronto para parear.
Código Arduino C++ para o seu ESP32
Grave esse código para permitir que o robô obedeça aos comandos enviados por esta página.
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// Pinos de Controle do Motor (Ajuste para seu Driver L298N, L293D ou Ponte H)
const int PIN_MOTOR_A_1 = 12;
const int PIN_MOTOR_A_2 = 13;
const int PIN_MOTOR_B_1 = 14;
const int PIN_MOTOR_B_2 = 27;
const int PIN_SPEED_A = 25; // Pino PWM para velocidade
const int PIN_SPEED_B = 26; // Pino PWM para velocidade
// UUIDs idênticos aos definidos no painel Web Bluetooth
#define SERVICE_UUID "6e400001-b5a3-f393-e0a9-e50e24dcca9e"
#define CHARACTERISTIC_UUID_RX "6e400002-b5a3-f393-e0a9-e50e24dcca9e"
BLEServer *pServer = NULL;
BLECharacteristic *pCharacteristicTX = NULL;
bool deviceConnected = false;
int velocidade_atual = 150; // Velocidade inicial padrão (0-255)
// Classe de Callback para receber conexões BLE
class ServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
// Parar robô por segurança em caso de queda de sinal
pararRobo();
// Reinicia anúncio de sinal para reconexão rápida
pServer->startAdvertising();
}
};
// Configura os pinos dos motores
void setupMotores() {
pinMode(PIN_MOTOR_A_1, OUTPUT);
pinMode(PIN_MOTOR_A_2, OUTPUT);
pinMode(PIN_MOTOR_B_1, OUTPUT);
pinMode(PIN_MOTOR_B_2, OUTPUT);
pinMode(PIN_SPEED_A, OUTPUT);
pinMode(PIN_SPEED_B, OUTPUT);
pararRobo();
}
// Funções de movimentação do Robô
void moverFrente() {
analogWrite(PIN_SPEED_A, velocidade_atual);
analogWrite(PIN_SPEED_B, velocidade_atual);
digitalWrite(PIN_MOTOR_A_1, HIGH);
digitalWrite(PIN_MOTOR_A_2, LOW);
digitalWrite(PIN_MOTOR_B_1, HIGH);
digitalWrite(PIN_MOTOR_B_2, LOW);
}
void moverTras() {
analogWrite(PIN_SPEED_A, velocidade_atual);
analogWrite(PIN_SPEED_B, velocidade_atual);
digitalWrite(PIN_MOTOR_A_1, LOW);
digitalWrite(PIN_MOTOR_A_2, HIGH);
digitalWrite(PIN_MOTOR_B_1, LOW);
digitalWrite(PIN_MOTOR_B_2, HIGH);
}
void girarEsquerda() {
analogWrite(PIN_SPEED_A, velocidade_atual);
analogWrite(PIN_SPEED_B, velocidade_atual);
digitalWrite(PIN_MOTOR_A_1, LOW);
digitalWrite(PIN_MOTOR_A_2, HIGH);
digitalWrite(PIN_MOTOR_B_1, HIGH);
digitalWrite(PIN_MOTOR_B_2, LOW);
}
void girarDireita() {
analogWrite(PIN_SPEED_A, velocidade_atual);
analogWrite(PIN_SPEED_B, velocidade_atual);
digitalWrite(PIN_MOTOR_A_1, HIGH);
digitalWrite(PIN_MOTOR_A_2, LOW);
digitalWrite(PIN_MOTOR_B_1, LOW);
digitalWrite(PIN_MOTOR_B_2, HIGH);
}
void pararRobo() {
digitalWrite(PIN_MOTOR_A_1, LOW);
digitalWrite(PIN_MOTOR_A_2, LOW);
digitalWrite(PIN_MOTOR_B_1, LOW);
digitalWrite(PIN_MOTOR_B_2, LOW);
}
// Callback executado ao receber comandos BLE da página Web
class CharacteristicCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {
char comando = rxValue[0];
// Verifica se é alteração de velocidade
if (comando == 'V') {
// Extrai o número de velocidade (ex: "V255" -> extrai "255")
String rawVal = "";
for(int i = 1; i < rxValue.length(); i++) {
rawVal += rxValue[i];
}
velocidade_atual = rawVal.toInt();
return;
}
// Executa o comando de movimentação
switch (comando) {
case 'F': moverFrente(); break;
case 'B': moverTras(); break;
case 'L': girarEsquerda(); break;
case 'R': girarDireita(); break;
case 'S': pararRobo(); break;
case 'H': /* Ligar Farol */ break;
case 'h': /* Desligar Farol */ break;
case 'W': /* Ativar Buzina */ break;
default: pararRobo(); break;
}
}
}
};
void setup() {
Serial.begin(115200);
setupMotores();
// Inicializando o Dispositivo BLE
BLEDevice::init("ESP32-Robot-Car");
// Criando o Servidor BLE
pServer = BLEDevice::createServer();
pServer->setCallbacks(new ServerCallbacks());
// Criando o Serviço BLE
BLEService *pService = pServer->createService(SERVICE_UUID);
// Criando a Característica para receber comandos (Escrita/Gravação)
BLECharacteristic *pCharacteristicRX = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristicRX->setCallbacks(new CharacteristicCallbacks());
// Iniciando o Serviço
pService->start();
// Iniciando os Anúncios de sinal para o celular achar o robô
pServer->getAdvertising()->start();
Serial.println("ESP32 BLE inicializado com sucesso! Pronto para conexão.");
}