Manual
do
Maker
.
com
É 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, usando nesse artigo o modo SPP, que é muito, muito mais simples de entender.
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("Manual do Maker");
}
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():
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.
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 autoincrementa 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.
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:
Na linha esp32.read() estou lendo apenas 1 byte, que já é o suficiente para saber como tratar os dados.
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!
Revisão: Ricardo Amaral de Andrade
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.