Pular para o conteúdo principal

Biblioteca de Bluetooth Clássico para ESP32

O framework Arduino já possuí uma biblioteca de Bluetooth Clássico. Para utilizá-la basta incluir o cabeçalho BluetoothSerial.h. Ela funciona de forma bem parecida com as funções Serial. Para utilizar as funções do Bluetooth primeiro é necessário instanciar um objeto do tipo BluetoothSerial. A partir disso, será possível utilizar os métodos para realizar a troca de dados. Segue abaixo a lista de métodos e o que eles fazem:

  • BluetoothSerial::begin(String localName = String(), bool isMaster = false): Inicia o Bluetooth, permitindo que dispositivos pareem com o ESP32. A string passada será o nome que irá aparecer na varredura do Bluetooth;
  • BluetoothSerial::available(): Retorna a quantidade de bytes recebidos via Bluetooth. É utilizada para verificar se pode começar a leitura da mensagem recebida;
  • BluetoothSerial::read(): Retorna um byte da mensagem recebida;
  • BluetoothSerial::write(const uint8_t *buffer, size_t size): Envia uma mensagem via Bluetooth. Recebe uma string com a mensagem e seu tamanho.

Código Exemplo

A seguir está um código que envia e recebe mensagens em formato JSON via Bluetooth. O ESP32 foi conectado no celular utilizando o app Serial Bluetooth Terminal.

Serial Bluetooth Terminal na Google Play Store

Código

#include <Arduino.h>
#include <BluetoothSerial.h>

#include <ArduinoJson.h> // Biblioteca ArduinoJson por Benoit Blanchon

// Objeto responsável pela troca de dados via Bluetooth
BluetoothSerial bt;

// String para armazenar a mensagem recebida via Bluetooth
String mensagemRecebida;

// Documento JSON para armazenar a mensagem recebida via Bluetooth
DynamicJsonDocument documentoJSONDaMensagemRecebida(1024);

void setup() {
// Inicia o Bluetooth com o nome "Presto" como o nome do dispositivo
bt.begin("Presto");
}

void loop() {
// Loop para ler a mensagem recebida via Bluetooth
// Também pode ser utilizado "if" se deseja fazer outras coisas enquanto recebe a mensagem
while (bt.available()) {
// Lê o byte recebido
char byteRecebido = (char)bt.read();

// Se o byte recebido for o caractere terminador nulo ('\0') desserializa a mensagem recebida no documento JSON
// O recebimento deste caractere indica que a mensagem completa foi recebida
if (byteRecebido == '\0') {
// Desserializa a mensagem recebida no documento JSON
DeserializationError houveErroAoDesserializar = deserializeJson(documentoJSONDaMensagemRecebida, mensagemRecebida);

// Se não houve erro ao desserializar, envia de volta a mensagem recebida
// Enviar a mensagem de volta é só um exemplo, a partir daqui já é possível aplicar as requisições com os dados em formato JSON
if (houveErroAoDesserializar == DeserializationError::Ok) {
bt.write((uint8_t*)mensagemRecebida.c_str(), mensagemRecebida.length());
}

// Reseta a string que armazena a mensagem recebida
mensagemRecebida = "";
}
// Senão, concatena o byte recebido na string que armazena a mensagem recebida
else {
// Concatena o byte recebido na string que armazena a mensagem recebida
mensagemRecebida += byteRecebido;
}
}
}

Imagens

Pareando o ESP32 no celular:

Configurando o Caractere Terminador

Conectando o ESP32 no app:

Enviando e Recebendo Mensagens