Desenvolvendo Aplicações com Bluetooth Low Energy (BLE) no ESP32

O ESP32 é um microcontrolador poderoso e versátil que tem se tornado cada vez mais popular em projetos de automação e Internet das Coisas (IoT). Uma de suas funcionalidades mais interessantes é a capacidade de se comunicar via Bluetooth Low Energy (BLE), uma versão aprimorada do Bluetooth tradicional, voltada para dispositivos de baixa energia e que requerem comunicação eficiente.

Neste artigo, vamos explorar em detalhes como desenvolver aplicações utilizando o BLE no ESP32. Abordaremos desde os conceitos básicos do BLE, passando pela configuração do ambiente de desenvolvimento, até a implementação prática de uma aplicação que permite a comunicação entre o ESP32 e um dispositivo móvel.

O que é Bluetooth Low Energy (BLE)?🔗

O Bluetooth Low Energy é uma tecnologia de comunicação sem fio projetada para aplicações que exigem baixo consumo de energia e comunicação eficiente em curtas distâncias. Diferentemente do Bluetooth Clássico, o BLE foi desenvolvido para operar em modos de baixa potência, permitindo que dispositivos funcionem por longos períodos utilizando pequenas fontes de energia, como baterias de moeda.

Algumas características do BLE:

  • Baixo consumo de energia: Ideal para dispositivos que precisam permanecer conectados por longos períodos sem a necessidade de recargas frequentes.
  • Comunicação rápida: Permite a transferência de dados de forma eficiente, embora com taxa de transferência menor comparada ao Bluetooth Clássico.
  • Conexão simplificada: Utiliza um modelo de comunicação baseado em pacotes pequenos, facilitando a implementação em dispositivos com recursos limitados.

Conceitos Básicos do BLE no ESP32🔗

Antes de começarmos a codificar, é importante entender alguns conceitos fundamentais do BLE:

  • GATT (Generic Attribute Profile): É a arquitetura que define como os dados são comunicados entre dispositivos BLE. Ele organiza os dados em serviços e características.
  • Serviços: Conjunto de características relacionadas. Por exemplo, um serviço de batimentos cardíacos pode agregar diversas características relacionadas ao monitoramento cardíaco.
  • Características: São as menores unidades de dados no BLE, contendo informações específicas como temperatura, umidade, etc.

No contexto do ESP32, podemos configurar o dispositivo para atuar como periférico (servidor) ou central (cliente):

  • Periférico (Servidor): Anuncia suas presenças e disponibiliza serviços para que dispositivos interessados possam se conectar e interagir.
  • Central (Cliente): Procura por periféricos disponíveis e se conecta a eles para acessar seus serviços e características.

Configurando o Ambiente de Desenvolvimento🔗

Para desenvolver aplicações BLE no ESP32, utilizaremos o Arduino IDE, uma plataforma amigável e bastante utilizada por iniciantes e profissionais.

Passo 1: Instalar o Arduino IDE

Se ainda não possui o Arduino IDE instalado:

1. Acesse o site oficial: arduino.cc

2. Faça o download da versão compatível com o seu sistema operacional.

3. Siga as instruções de instalação.

Passo 2: Configurar o Suporte ao ESP32

1. Abra o Arduino IDE.

2. Vá em Arquivo > Preferências.

3. No campo URLs Adicionais para Gerenciadores de Placas, adicione:

https://dl.espressif.com/dl/package_esp32_index.json

4. Clique em OK.

Passo 3: Instalar as Bibliotecas e Placas ESP32

1. Vá em Ferramentas > Placa > Gerenciador de Placas.

2. Pesquise por ESP32.

3. Selecione esp32 by Espressif Systems e clique em Instalar.

4. Aguarde a conclusão da instalação.

Criando a Primeira Aplicação BLE no ESP32🔗

Vamos desenvolver uma aplicação simples onde o ESP32 atua como um periférico BLE, transmitindo dados de temperatura simulados para um aplicativo móvel.

Passo 1: Importar as Bibliotecas Necessárias

No início do código, precisamos incluir as bibliotecas que permitirão o uso do BLE:

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

Passo 2: Definir os Identificadores (UUIDs)

Os UUIDs são identificadores únicos que distinguem serviços e características no BLE.

#define SERVICE_UUID        "12345678-1234-1234-1234-1234567890ab"
#define CHARACTERISTIC_UUID "abcdefab-1234-5678-1234-abcdefabcdef"

Passo 3: Criar a Classe do Servidor BLE

Precisamos definir callbacks para monitorar as conexões:

bool deviceConnected = false;
class MyServerCallbacks: public BLEServerCallbacks 
{
  void onConnect(BLEServer* pServer) 
  {
    deviceConnected = true;
  }
  void onDisconnect(BLEServer* pServer) 
  {
    deviceConnected = false;
  }
};

Passo 4: Configurar o Setup do ESP32

No método setup(), iniciamos o dispositivo BLE e configuramos o serviço e a característica:

void setup() 
{
  Serial.begin(115200);
  // Inicializa o dispositivo BLE
  BLEDevice::init("ESP32 BLE");
  // Cria o servidor BLE
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());
  // Cria o serviço BLE
  BLEService *pService = pServer->createService(SERVICE_UUID);
  // Cria a característica BLE
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_NOTIFY
                                       );
  pCharacteristic->addDescriptor(new BLE2902());
  // Inicia o serviço
  pService->start();
  // Inicia a publicidade BLE
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->start();
}

Passo 5: Implementar o Loop Principal

No método loop(), simularemos a leitura de uma temperatura e a enviaremos para o dispositivo conectado:

void loop() 
{
  if (deviceConnected) 
  {
    // Simula a leitura de temperatura
    float temperature = random(20, 30) + random(0, 100) / 100.0;
    // Converte o valor para string
    char tempString[8];
    dtostrf(temperature, 6, 2, tempString);
    // Envia a temperatura via BLE
    pCharacteristic->setValue(tempString);
    pCharacteristic->notify();
    Serial.print("Temperatura enviada: ");
    Serial.println(tempString);
  }
  delay(1000);
}

Passo 6: Compilar e Carregar o Código

1. Conecte o ESP32 ao computador via USB.

2. Selecione a placa correta em Ferramentas > Placa > ESP32 Arduino > ESP32 Dev Module.

3. Selecione a porta correta em Ferramentas > Porta.

4. Clique em Carregar e aguarde a conclusão.

Testando a Aplicação com um Dispositivo Móvel🔗

Para verificar se o ESP32 está transmitindo os dados corretamente, podemos utilizar um aplicativo de smartphone que permita visualizar características BLE.

Utilizando o Aplicativo nRF Connect

1. Baixe o nRF Connect na loja de aplicativos do seu celular.

2. Abra o aplicativo e escaneie os dispositivos BLE próximos.

3. Localize o dispositivo ESP32 BLE e conecte-se a ele.

4. Navegue até o serviço com o UUID definido e visualize a característica.

5. Ative as notificações para receber os dados de temperatura em tempo real.

Entendendo o Código em Detalhes🔗

Vamos examinar alguns pontos importantes do código desenvolvido.

Inicialização do Dispositivo BLE

BLEDevice::init("ESP32 BLE");

Este comando inicia o dispositivo BLE e define o nome que será exibido durante a publicidade.

Criação do Servidor BLE e Callbacks

BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());

Aqui, criamos um servidor BLE e associamos callbacks para monitorar eventos de conexão e desconexão.

Configuração do Serviço e Característica

BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                       CHARACTERISTIC_UUID,
                                       BLECharacteristic::PROPERTY_NOTIFY
                                     );
pCharacteristic->addDescriptor(new BLE2902());

Criamos um serviço com o UUID definido e uma característica que possui a propriedade de notificação. O BLE2902 é um descritor padrão que permite habilitar notificações no cliente.

Iniciando a Publicidade

pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->start();

Após iniciar o serviço, iniciamos a publicidade para que dispositivos possam encontrar e se conectar ao ESP32.

Enviando Dados via Notificações

pCharacteristic->setValue(tempString);
pCharacteristic->notify();

Atualizamos o valor da característica e enviamos uma notificação para o dispositivo conectado, permitindo que ele receba os dados em tempo real.

Dicas e Boas Práticas🔗

  • Gerenciamento de Energia: O BLE é eficiente em termos de energia, mas é importante gerenciar os ciclos de transmissão e reduzir a frequência de envio quando possível.
  • Segurança: Em aplicações sensíveis, considere implementar mecanismos de segurança, como pareamento e criptografia, para proteger os dados transmitidos.
  • Tratamento de Desconexões: Certifique-se de que o seu código lida adequadamente com eventuais desconexões e tenta reconectar ou reiniciar a publicidade quando necessário.

Expandindo a Aplicação🔗

Com a base estabelecida, você pode expandir a aplicação para incluir:

  • Múltiplas Características: Transmitir diferentes tipos de dados, como umidade, pressão, etc.
  • Controle Remoto: Receber comandos do dispositivo móvel para controlar atuadores conectados ao ESP32.
  • Interface Gráfica: Desenvolver um aplicativo móvel personalizado para interagir com o ESP32 de forma mais amigável.

Conclusão🔗

Desenvolver aplicações com Bluetooth Low Energy no ESP32 abre um leque de possibilidades para projetos de IoT e automação. Com um consumo de energia reduzido e uma comunicação eficiente, o BLE é ideal para dispositivos que precisam transmitir dados periodicamente sem a necessidade de trocas frequentes de bateria.

Neste artigo, exploramos desde os conceitos básicos do BLE, passando pela configuração do ambiente de desenvolvimento, até a implementação prática de uma aplicação funcional. Com esse conhecimento, você está pronto para criar soluções inovadoras que aproveitam o potencial do ESP32 e do BLE.

Lembre-se de sempre explorar, experimentar e adaptar os conceitos aprendidos para atender às necessidades específicas dos seus projetos. A prática e a curiosidade são fundamentais para o domínio e a inovação no mundo da tecnologia.

Este artigo faz parte do grupo Controle de Dispositivos via Bluetooth com ESP32
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Artigos Relacionados