Bluetooth Low Energy com ESP32 e DHT11 7

Você já deve ter ouvido falar de Bluetooth Low Energy, Bluetooth Smart ou BLE. Tem sido uma tecnologia bastante aplicada a dispositivos como sensores de batimento cardíaco, pedômetros, sensores para bicicleta entre outros. E se você já é nosso cliente também viu que temos em nossa loja alguns módulos disponíveis para quem quer começar a trabalhar com BLE como é o caso do módulo BLE Keyes HM-10 e a placa de desenvolvimento ESP32 WiFi+Bluetooth, e nesse post vamos abordar o uso do Bluetooth Low Energy com ESP32.

Bluetooth Low Energy com ESP32

Veremos alguns conceitos básicos sobre BLE, desenvolvendo um programa que utiliza os recursos de BLE do ESP32, para enviar a um aplicativo de celular, dados de temperatura e umidade, coletados de um DHT11. O aplicativo de celular será desenvolvido no Thunkable (uma plataforma parecida com MIT App Inventor).

Conceitos básicos sobre Bluetooth Low Energy

O Bluetooth Low Energy, ou BLE, é um subconjunto do clássico Bluetooth e foi introduzido juntamente com as especificações do Bluetooth 4.0. Em contraste com o BLuetooth clássico, o BLE tem um baixo consumo de energia mesmo mantendo um alcance similar.

Logo Bluetooth Low Energy 4.0

Os dispositivos que trabalham com BLE podem ter duas funções diferentes em uma conexão, Dispositivo Central ou Dispositivo Periférico (Central Device or Peripheral Device). Geralmente os dispositivos centrais são telefones celulares, tablets, computadores, etc. São dispositivos centrais que recebem dados. Já os dispositivos periféricos são sensores e dispositivos low power que se conectam ao dispositivo central. Podemos pensar também como uma estrutura cliente/servidor, onde um celular é o cliente e o sensor é o servidor que “serve” seus dados para o cliente.

GATT (Generic Attribute Profile), é a forma com que os dados são organizados para comunicação entre os dispositivos. GATT é composto por um ou mais serviços que por sua vez são compostos de características. Existem especificações padrão de GATT para os tipos de aplicação mais comuns encontradas no mercado. Várias dessas especificações podem ser encontradas no site oficial do Bluetooth. As características por sua vez são basicamente os valores em si.

Os serviços e características são identificados por um UUID. Por exemplo “0x180F” ou “6E400001-B5A3-F393-E0A9-E50E24DCCA9E”. O legal é que podemos criar nossas próprias características customizadas ou até mesmo utilizar as características já existentes como por exemplo Sensoriamento de Ambiente.

Para sermos um pouco mais práticos, vamos analisar, por exemplo, o serviço oficial de nível de bateria Battery Service. Esse serviço tem um UUID 0x180F e uma característica chamada Battery Level de UUID 0x2A19. Imagine que existe um sensor BLE que mede nível de bateria(serviço) e que envia dados indicando o nível da bateria(característica). Caso um celular se conecte a esse sensor, o celular já irá saber que aquele sensor mede nível de bateria e seus dados enviados são o nível da bateria em si. Pensando em um ESP32, se ele tiver programado essas características, ele “seria um sensor” de nível de bateria e seria reconhecido como tal por qualquer aplicativo BLE de celular (fica a dica para colocar sua criatividade em ação criando um dispositivo BLE, pode ser qualquer um destes).

Bluetooth Clássico vs BLE

Além da diferença do consumo de energia, que no caso do BLE é mais baixo se comparado ao Bluetooth clássico, a forma com que os dispositivos se comunicam e organizam seus dados também é diferente.

Com os módulos tipo HC-05 usávamos o bluetooth clássico. Eles basicamente faziam uma comunicação UART sem fio, bastando apenas parear os dispositivos como visto no Tutorial Módulo Bluetooth com Arduino. Mas se tentarmos parear um dispositivo BLE da mesma forma, veremos que a comunicação não é tão simples assim pois como vimos acima o BLE usa uma organização diferente de dados.

Para simular uma comunicação UART usando BLE, o fabricante Nordic Semiconductor criou um serviço proprietário chamado Nordic UART Service. É um serviço que tem duas características sendo elas TX para transmissão de dados e RX para recepção de dados. Esses serviços e suas características tem os seguintes UUIDs:

Nordic UART Service: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
RX Characteristic: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E
TX Characteristic: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E

Montagem do Circuito

O circuito do nosso teste usando Bluetooth Low Energy com ESP32 é bem simples e utilizaremos um sensor de umidade e temperatura DHT11. O pino de dados do DHT11 deve ser ligado ao pino 23 do ESP32.

Programa Bluetooth Low Energy com ESP32

Para programar o ESP32 utilizando a IDE Arduino, siga as instruções de instalação de acordo com seu sistema operacional. Certifique-se de conseguir compilar e carregar qualquer programa para o ESP32, por exemplo um Blink LED.

Carregue então o programa abaixo na IDE Arduino. Certifique-se também de ter a biblioteca para sensor DHT instalada em sua IDE.

O programa basicamente define os UUID do serviço de comunicação UART, faz a leitura de umidade e temperatura do sensor DHT e transmite esses dados para o aplicativo no celular. Os dados são enviados em uma única variável, mas num formato tipo CSV, com temperatura e umidade separados por vírgula.

Aplicativo de celular com Thunkable

Para que possamos visualizar no celular os dados enviados pelo ESP32, desenvolvemos um aplicativo utilizando a plataforma Thunkable. Pra quem já utilizou o MIT App Inventor já estará familiarizado com o Thunkable e irá achar super legal o Material Design.

O Thunkable contém uma extensão que nos possibilita a comunicação com dispositivos BLE. Iremos utilizar o Bluetooth Client:

Componente Bluetooth Client

O design da aplicação ficou como a seguir, mas você pode usar sua criatividade e mudar a “cara” da aplicação. Existem dois botões para gerenciar a conexão com o ESP32 e um botão mais abaixo para ligar e desligar o led built-in do ESP32. Em dois labels mostramos a temperatura e umidade do DHT11.

Design da tela do aplicativo

É na seção de blocos onde é feita a programação do aplicativo. Veja na foto a seguir a estrutura geral do aplicativo:

Blocos do aplicativo completo

Primeiramente declaramos os UUIDs utilizados pelo ESP32.

Blocos do aplicativo

Então gerenciamos o escaneamento e conexão de dispositivos:

Blocos do aplicativo

O botão disconnect fica responsável por desconectar o ESP32.

Blocos do aplicativo

Um Timer verifica se o dispositivo ainda está conectado e se foi recebido algum dado do ESP32. Assim que um dado é recebido, o evento StringsReceived é disparado, exibindo os dados de temperatura e umidade nos respectivos labels. Nesse bloco fazemos a separação dos dados de temperatura e umidade que foram recebidos separados por uma vírgula.

Blocos do aplicativo

Quando o botão LED é clicado, o bloco a seguir envia um caractere A ou B para o ESP32, que por sua vez liga o LED se receber A ou desliga se receber B.

Blocos do aplicativo

Caso queira modificar a aplicação você pode baixar o arquivo do projeto(.aia) aqui. Ou se preferir, pode instalar o .apk direto no seu celular. 

Funcionamento do Projeto

Veja no vídeo abaixo o funcionamento do projeto Bluetooth Low Energy com ESP32. Basta clicar no botão connect, escolher o ESP32 na lista de dispositivos e os dados já começam a aparecer. Acenda e apague o LED clicando no botão LED.

Esse projeto de Bluetooth Low Energy com ESP32 foi baseado no projeto original de Timothy Woo e pode ser encontrado no Hackster.io. Agradecemos também ao Timothy por ter nos ajudado com algumas questões técnicas, sobre como enviar mais de um dado ao aplicativo usando apenas uma característica.

Gostou de aprender sobre Bluetooth Low Energy com ESP32? Ajude-nos a melhorar o blog comentando abaixo sobre este tutorial. Não se esqueça de visitar nosso Fórum!

Posts Relacionados

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

7 Comentários

  1. Very nice! I was looking for something like this to help me understand receiving multiple values. Is the #include and the #include necessary? Thanks!!

    1. sorry…it disappeared. The #include iostream and #include string necessary?

      1. Hey Mickael! Welcome to our Blog, nice to see you here.

        #include iostream
        #include string

        This libs are actually not necessary. I was just testing a few things and forgot to remove them. You can comment them out and the code will compile just fine.

  2. And it won’t allow modifications to the Thunkable app. When you request a build it comes up with all kinds of errors. Thanks!!

    1. It seems like Thunkable has bugs when trying to open existing projects. It happened to me many times as well.

      You can see in the tutorial all the pictures with the building blocks. You could try to create a new project and build the blocks yourself.

      Hope it helps! Cheers!

  3. Muito bom, parabéns pelo tutorial!

    Como faço para enviar um dado (string) do celular, e fazer o ESP32 receber esse valor, e devolver uma outra string?

    Muito obrigado,

    Homero

    1. Olá Homero! Obrigado pela leitura do post!

      No último bloco do aplicativo thunkable onde tem “when LED Click” você encontra a resposta.

      Veja ali que quando o botão é LED é clicado ele muda o estado e envia string “A” ou “B” com “call BluetoothLE1 writeStrings”. No código o ESP32 espera por essa string e executa a ação de acender o LED de acordo com a string recebida.

      Bloco LED Click

      Para que o ESP32 devolva outra string basta ver no código o trecho onde o ESP32 envia o valor de temperatura e umidade para o aplicativo. Veja abaixo:

      Tente entender um pouco mais a fundo o exemplo que mostramos. Espero ter ajudado. Bons projetos!