Comunicação serial usando bluetooth no ESP32

É a primeira vez que estou usando bluetooth no ESP32. No ESP32 podemos usar o SPP (Serial Port Protocol) ou o BLE (Bluetooth Low Energy). A grande diferença é que com SPP podemos transferir arquivos ou dados seriais; ele trabalha com streamings, enquanto o BLE é utilizado para coisas como beacons, no modo cliente-servidor.

Particularmente, acho que o BLE é muito chato de usar, mas ele consome aproximadamente 100 vezes menos energia do que o SPP. Isso porque ele não mantém uma conexão ativa, apenas acorda para fazer uma notificação e desliga novamente. Para fazer streaming de dados, prefiro usar um rádio qualquer, preferencialmente LoRa, mas existem casos que não é viável – por exemplo, na T Wristband da LilyGo, por razões óbvias. Daí resta o WiFi, mas o estou utilizando para fazer atualização via OTA. Não é exatamente um impedimento, apenas teria que trabalhar o código para subir o rádio, o webserver e não entrar em deep sleep. Mas nesse caso, é bem mais simples isolar os serviços.

Vamos por partes, usado nesse artigo o modo SPP, que é muito, muito mais simples de entender.

Código para comunicação bluetooth entre o computador e o ESP32

Supondo que quereremos mandar dados do ESP32 para o computador (no meu caso, o objetivo é enviar um mero byte para o computador tomar uma ação), deveremos escrever um código mais ou menos assim para o ESP32:

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;
uint8_t counter = 0;

void setup() {
  Serial.begin(9600);
  SerialBT.begin("Do bit Ao Byte");

}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(2000);
  SerialBT.write(counter);
  counter = counter > 254 ? 0 : counter+1;

}

O dispositivo aparecerá com o nome definido em begin():

bluetooth no ESP32 - Do bit Ao Byte

No Linux os dispositivos são arquivos descritores; a USB tem o dispositivo apontando para algo como /dev/ttyUSB0 para o primeiro dispositivo conectado à USB. No caso do bluetooth, o serviço é o blues, uma das ferramentas é a hci, mas pela interface do sistema já dá pra conectar ao dispositivo e criar uma serial. No caso, criará algo como /dev/rfcomm0. Mas anteceda esse passo fazendo o scan, então clique com o botão direito sobre o dispositivo e clique em confiar. Também pode ser necessário deixar o bluetooth no notebook visível.

bluetooth no ESP32 - porta serial

Como houve um problema estranho que não me permitiu manter a conexão serial com o FTDI juntamente à conexão serial do bluetooth, adicionei após o delay de 2 segundos um contador que se auto-incrementa para mandar mensagens diferentes. Utilizei uma variável unsigned char e os valores estão chegando em hexadecimal, como pode ser visto na saída do programa Cutecom.

bluetooth no ESP32 - leitura no Cutecom

Essa é a prova de conceito concluída. Mas vou adicionar um extra nesse artigo para adiantar chegar mais rapidamente ao artigo do projeto que tem que estar pronto em dois dias, como citei no post anterior.

Para o projeto, lerei a porta serial com Python e dispararei um comando para a interface gráfica. Para tal, instale a biblioteca serial para python de uma das duas maneiras:

sudo pip3 install pyserial
#ou
sudo apt-get install python3-serial

Aproveite para instalar uma interface de programação em fluxo, o Bpython:

sudo pip3 install bpython

Digite bpython3  no console e escreva o programa:

bluetooth no ESP32 - comunicação com Python

Na linha esp32.read() estou lendo apenas 1 byte, que já é o suficiente para saber como tratar os dados.

Vídeo

Não farei vídeo para mostrar a prova de conceito porque quem assistir de fora vai deixar um joinha de cabeça pra baixo, pois não saberá de que se trata. Mas assim que concluir o projeto, faço um vídeo do funcionamento. Se não é inscrito, inscreva-se em nosso canal DobitaobyteBrasil no Youtube e clique no sininho para receber notificações, vai valer a pena ver a integração dos recursos no T Wristband sem ele mamar a bateria com tudo ligado!

No próximo artigo relacionado a bluetooth pretendo mostrar a configuração e uso do BLE, acompanhe!

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.