Bluetooth Low Energy com ESP32 e DHT11 91

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.

/* 
 *  Programa baseado no programa original desenvolvido por Timothy Woo 
 *  Tutorial do projeto original; https://www.hackster.io/botletics/esp32-ble-android-arduino-ide-awesome-81c67d
 *  Modificado para ler dados do sensor DHT11 - Bluetooth Low Energy com ESP32
 */  
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#include <DHT.h>

#include <iostream>
#include <string>

BLECharacteristic *pCharacteristic;

bool deviceConnected = false;
const int LED = 2; // Could be different depending on the dev board. I used the DOIT ESP32 dev board.

/*
 * Definição do DHT11
 */
#define DHTPIN 23 // pino de dados do DHT11
#define DHTTYPE DHT11 // define o tipo de sensor, no caso DHT11

DHT dht(DHTPIN, DHTTYPE);

int humidity;
int temperature;

// Veja o link seguinte se quiser gerar seus próprios UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define DHTDATA_CHAR_UUID "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" 


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

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();
      Serial.println(rxValue[0]);

      if (rxValue.length() > 0) {
        Serial.println("*********");
        Serial.print("Received Value: ");

        for (int i = 0; i < rxValue.length(); i++) {
          Serial.print(rxValue[i]);
        }
        Serial.println();
        Serial.println("*********");
      }

      // Processa o caracter recebido do aplicativo. Se for A acende o LED. B apaga o LED
      if (rxValue.find("A") != -1) { 
        Serial.println("Turning ON!");
        digitalWrite(LED, HIGH);
      }
      else if (rxValue.find("B") != -1) {
        Serial.println("Turning OFF!");
        digitalWrite(LED, LOW);
      }
    }
};

void setup() {
  Serial.begin(115200);

  pinMode(LED, OUTPUT);

  // Create the BLE Device
  BLEDevice::init("ESP32 DHT11"); // Give it a name

  // Configura o dispositivo como Servidor BLE
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Cria o servico UART
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Cria uma Característica BLE para envio dos dados
  pCharacteristic = pService->createCharacteristic(
                      DHTDATA_CHAR_UUID,
                      BLECharacteristic::PROPERTY_NOTIFY
                    );
                      
  pCharacteristic->addDescriptor(new BLE2902());

  // cria uma característica BLE para recebimento dos dados
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID_RX,
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setCallbacks(new MyCallbacks());

  // Inicia o serviço
  pService->start();

  // Inicia a descoberta do ESP32
  pServer->getAdvertising()->start();
  Serial.println("Esperando um cliente se conectar...");
}

void loop() {
  if (deviceConnected) {

    humidity = dht.readHumidity();
    temperature = dht.readTemperature();
    // testa se retorno é valido, caso contrário algo está errado.
    if (isnan(temperature) || isnan(humidity)) 
    {
      Serial.println("Failed to read from DHT");
    }
    else 
    {
      Serial.print("Umidade: ");
      Serial.print(humidity);
      Serial.print(" %\t");
      Serial.print("Temperatura: ");
      Serial.print(temperature);
      Serial.println(" *C");
    }
    
    char humidityString[2];
    char temperatureString[2];
    dtostrf(humidity, 1, 2, humidityString);
    dtostrf(temperature, 1, 2, temperatureString);

    char dhtDataString[16];
    sprintf(dhtDataString, "%d,%d", temperature, humidity);
    
    pCharacteristic->setValue(dhtDataString);
    
    pCharacteristic->notify(); // Envia o valor para o aplicativo!
    Serial.print("*** Dado enviado: ");
    Serial.print(dhtDataString);
    Serial.println(" ***");
  }
  delay(1000);
}

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.

Existe uma extensão feita especialmente para comunicação de dispositivos usando BLE. Essa extensão pode ser baixada aqui e importada no Thunkable. Veja como fazer essa importação como nas figuras abaixo:

Importar Extensão

Escolha o arquivo baixado no link da extensão.

Importar Arquivo da Extensão

Agora a extensão estará disponível para ser usada na aplicação.

Extensão Bluetooth Low Energy

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!

Deixe uma resposta

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

91 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:

      sprintf(dhtDataString, "%d,%d", temperature, humidity);    
      pCharacteristic->setValue(dhtDataString);    
      pCharacteristic->notify(); // Envia o valor para o aplicativo!

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

      1. Me refiro ao método MyCallbacks.onWrite, tem como retornar um valor para o client BLE (no caso celular) passando uma string como retorno a resposta da requisição?

        Obrigado.

        1. Não testei dessa forma ainda. Mas creio que seria possível.

          Talvez definindo pCharacteristic como global no início do código e depois usando setValue() e notify() dentro de myCalbacks onWrite.

          // Cria uma Característica BLE para envio dos dados
            pCharacteristic = pService->createCharacteristic(
                                DHTDATA_CHAR_UUID,
                                BLECharacteristic::PROPERTY_NOTIFY
                              );
          class MyCallbacks: public BLECharacteristicCallbacks {
              void onWrite(BLECharacteristic *pCharacteristic) {
                std::string rxValue = pCharacteristic-&gt;getValue();
                Serial.println(rxValue[0]);
           
                if (rxValue.length() &gt; 0) {
                  Serial.println("*********");
                  Serial.print("Received Value: ");
           
                  for (int i = 0; i &lt; rxValue.length(); i++) {
                    Serial.print(rxValue[i]);
                  }
                  Serial.println();
                  Serial.println("*********");
                }
           
                // Processa o caracter recebido do aplicativo. Se for A acende o LED. B apaga o LED
                if (rxValue.find("A") != -1) { 
                  Serial.println("Turning ON!");
                  digitalWrite(LED, HIGH);
             
                  pCharacteristic->setValue("A Recebido");    
                  pCharacteristic->notify(); // Envia o valor para o aplicativo!
                
                }
                else if (rxValue.find("B") != -1) {
                  Serial.println("Turning OFF!");
                  digitalWrite(LED, LOW);
                }
              }
          };
  4. Boa tarde!

    estou fazendo um app utilizando o Bluetooth Low Energy e arduíno. Minha missão é transmitir a temperatura interna do arduíno para o app. Mas o problema está nessa parte, os dados do arduíno não estão sendo transmitidos para o app.

    Vocês poderiam me ajudar?

    1. Olá Giovanna!

      Esse tipo de problema costumamos resolver no fórum, você já deu uma olhada lá?
      https://www.filipeflop.com/forum/

      Seria bom você fazer um post sobre seu problema lá. Coloca o código que você está utilizando, o circuito montado, pode detalhar bastante.

      Abraços!

      André – Equipe FILIPEFLOP

  5. Olá!

    Parabéns pelo material!

    Sobre a comunicação do ESP com um celular por exemplo, eu conseguiria fazer um push para um celular que esteja com o bluetooth ligado? Quais tipos de dados eu conseguiria enviar (imagem, texto, link)?

    Obrigado!

    1. Olá Guilherme! Obrigado pela leitura.

      O que você diz com “fazer um Push para o celular”, é conhecido no BLE como uma característica de notificação.
      Veja um exemplo aqui: https://devzone.nordicsemi.com/tutorials/b/bluetooth-low-energy/posts/ble-characteristics-a-beginners-tutorial

      Em nosso tutorial a característica que envia os dados de temperatura e umidade para o celular é uma notificação.

      O Bluetooth Low Energy é ideal para transmissão de pequenos pacotes de dados. Como por exemplo, batimento cardíaco, velocidade da bicicleta, consumo de bateria. São valores geralmente numéricos.

      Veja por exemplo a específicação para um valor de consumo de bateria; https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.battery_level.xml

      O BLE não foi feito para transmissão de áudio, vídeo etc.

      Abraço!

  6. Hi. I have tried to use your aia file as well as i made it again from scratch. However, it does not seem to scan devices because there is nothing in the list. Do you have any idea why that is? thanks

    1. Hi Imre! Welcome to our blog! 🙂

      Are you using Android or iOS?

      Are you sure the ESP32 is broadcasting its signal correctly?

      You could check that with Nordic’s nRF Connect app for smartphone. It’s available for both Android and iOS.

  7. Olá cara,
    Muito bom o material, não estava conseguindo usar e após um estudo do seu código consegui entender melhor e ele é muito aplicável num projeto em que estou trabalhando.
    Mas notei que ao enviar um dado muito grande do celular para o esp a string trunca e chega em duas partes diferentes. Tem como fazer isso vir de uma vez só?
    O exemplo abaixo:
    “Sometimes i need spiritual protection”
    Foi separado em duas partes.

    *********
    Received Value: sometimes i need spi
    *********
    r
    *********
    Received Value: ritual protection
    *********

    1. Olá Lucas! Obrigado pela leitura!

      Como você está enviando essas strings?

      No meu código eu fiz umas conversões pq não consegui enviar números inteiros apenas strings.

      Você está usando as mesmas conversões que usei?

  8. Parabéns pelo post man.

    Sabe informar se eu conseguiria ler uma tag (id card ble 4.0 ibeacon) neste ESP32?

    1. Valeu amigo! Obrigado pela visita.

      Se é Bluetooth Low Energy provavelmente vai funcionar sim. Só programar pra comunicar.

  9. Boa tarde

    Gostei muito também, mas quando tento ler QR code do programa meu celular copia a UR do mit.edu e não sai do lugar.
    Vcs tem alguma ideia do que pode esta ocorrendo?

    vandilson oliveira dos santos
    1. Olá Vandilson.
      Está usando MIT App Inventor ou o Thunkable?

      1. Estou usando o app iventor 2, pois quando baixei o Thunkable o lay out não era o mesmo que aparecia no tutorial.

        Grato pela agilidade

        vandilson oliveira dos santos
        1. Não sei se o app irá funcionar da mesma maneira no App Inventor. Talvez algum componente não seja suportado e está dando erro na aplicação.

          Você pode usar o thunkable e criar seu próprio layout. Não precisa ser exatamente igual ao tutorial. Vai da sua criatividade!

          Abraço!

          1. Consegui encontrar o app correto, mas agora estou com problemas no bloco de comando na parte de conexão de dispositivos no segundo bloco(botão connect) não consigo encontrar para o bloco verde o item select index, alguma dica.

        2. Você precisa de um componente chamado List Picker.

          Só que existe diferença do Thunkable Classic e do Thunkable cross platform. Alguns componentes e extensões podem não ser compatíveis ainda com o Cross platform.

          O app do tutorial fizemos no Classic.

          Você pode estudar mais sobre o thunkable lendo a documentação: https://docs.thunkable.com/

          Abraço e sucesso nos projetos!

          1. Olá

            Atualmente estou montando os blocos conforme esta no tutorial, para depois modifica-los, me diga uma coisa o tempo do timer e o padrão ou devo altera-l0.

          2. Fica a seu critério. Quanto maior o tempo do timer maior o tempo de conectar e desconectar o dispositivo.
            1 segundo acho de bom tamanho.

  10. BOA TARDE
    EU GOSTARIA DE ESTAR USANDO OUTRO TIPO DE SENSOR, NO CASO SERIA SENSOR DE CORRENTE NÃO INVASIVO….
    GOSTARIA DE RECEBER UMAS DICAS….
    FICO NO AGUARDE…..

    1. Olá Diego!

      infelizmente ainda não temos um tutorial do sensor de corrente não invasivo com ESP32 e bluetooth low energy.

      Mas enquanto isso você pode começar por aqui:
      https://www.filipeflop.com/blog/medidor-de-energia-eletrica-com-arduino/

      Abraço e bons projetos!

  11. Boa tarde, tentei compilar o app sem nenhuma alteração pelo Thukable, mas ele apresenta um erro e não compila. Será que está faltando algo ou a extensão está com defeito? Nos testes eu notei que o problema está na extensão, criei um projeto novo e ele sem nada apenas com a extensão compila normal, quando eu coloco o bloco Screen.Initialize e chamo a função BluetoothLE1.startScanning ele chega a compilar mas apresenta erro no app.

    1. Olá Paulo!

      O Thunkable mudou um pouco. Tinha a versão Classic e agora a Cross Platform que funciona tanto em Android como iOS. Na época do post fizemos na versão Classic.

      Qual versão você está usando?

      1. Estou usando a versão classic. É estranho o seu projeto não compilar. e quando começo um do 0, só de colocar a função startscanning ele compila mas dá erro no app.

        1. Eu tive problemas também pegando um projeto pronto e importando no Thunkable. Por isso coloquei todos os prints dos blocos para ficar mais fácil construir a aplicação do zero.

          Seu celular tem BLE?

          1. Consegui fazer funcionar pelo AppInventor, mas tive que instalar outra extensão, essa que está em seu link não rodou de maneira alguma.
            Baixei a extensão nesta pagina:

            https://puravidaapps.com/extensions.php

            Se reparar, verá que terá duas versões de extensão BLE, a que funcionou foi a NEW.
            Algumas vezes o botão LED não funciona, parece que reconhece que não está conectado, mas se eu clico em desconectar e depois em conectar novamente ele funciona. Vou tentar debugar melhor para ver se acho alguma falha, mas fica a dica sobre a extensão.

            Abraços e obrigado pela rápida resposta!! Isso valoriza muito a página.

            Paulo Thomazelli
          2. Que bom que funcionou Paulo!

            Vou verificar essa extensão do link.

            Obrigado pelas dicas. Abraço!

  12. Ola Giovanni, bom dia.
    Amigo realizei todos os steps do tutorial, penei um pouco pois usava muito arduino, agora que comecei com esp32.

    Estou com um problema,
    Ao clicar em “connect” a app vai para uma tela preta (acho que e a lista de dispositivos) porem nao aparece NADA NELA.
    Por fora do aplicativo consigo parear com o esp, mas dentro dele nao aparece na lista.

    poderia me ajudar ? muito obrigado!

    1. Olá Newton!

      Baixe o aplicativo nRF connect e tente fazer a conexão.
      https://itunes.apple.com/us/app/nrf-connect/id1054362403?mt=8
      https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=en

      Com esse aplicativo você também consegue fazer conexão com dispositivos BLE e ver os dados que eles estão emitindo, só não é de maneira gráfica como o aplicativo do thunkable.

      Veja se funciona pra você esse teste.

      1. Olá Giovanni,

        Quando faço download do aplicativo .apk, a lista de dispositivos funciona perfeitamente.
        Porém quando baixo o arquivo .aia e exporto pelo site thunkable, ai já não funciona.

        Estou querendo fazer um projeto de automação residencial, comecei a utilizar pelo wifi mesmo e está dando resultados. Porem acho mais interessante utilizar um app ao invés de abrir uma página pelo web browser (configurada com esp32 modo web server).

        Por acaso você tem algum tutorial sobre enviar e receber dados via wifi, e via app pela sketch do thunkable ?

        Obrigado!

        1. Olá Newton!

          Eu tive problemas também pegando um projeto pronto e importando no Thunkable. Por isso coloquei todos os prints dos blocos para ficar mais fácil construir a aplicação do zero.

          Ainda não temos tutorial com aplicação WiFi.

          Uma opção é cirar um Web App, que seria uma página web com cara de aplicativo

          https://developers.google.com/web/progressive-web-apps/

  13. hey! When i try to run your code im getting an error! Error compiling for board ESP32 Dev Module

    1. Hey Harini! Welcome to our blog

      Did you install the board using the official instructions? Check them here:
      https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md

      Is there any more information about the error?
      You can get more information enabling “Show verbose output during: compilation” under File->Preferences menu.

  14. can u upload the apk file please

  15. HEY ! Whever i try to build the aia file uploaded by you, Im getting this error
    The compiler error output was
    ________Preparing application icon
    ________Creating animation xml
    ________Generating manifest file
    ________Attaching native libraries
    ________Attaching component assets
    ________Compiling source files
    (compiling appinventor/ai_alex_sneedmiller/newRGB/Screen1.yail to appinventor.ai_alex_sneedmiller.newRGB.Screen1)
    ERROR: appinventor/ai_alex_sneedmiller/newRGB/Screen1.yail line 320: caught exception in inliner for # – java.lang.RuntimeException: no such class: edu.mit.appinventor.ble.BluetoothLE
    gnu.bytecode.ObjectType.getReflectClass(ObjectType.java:179)
    gnu.bytecode.ClassType.getModifiers(ClassType.java:103)
    gnu.bytecode.ClassType.isInterface(ClassType.java:471)
    gnu.expr.InlineCalls.checkType(InlineCalls.java:56)
    gnu.expr.InlineCalls.visit(InlineCalls.java:49)
    gnu.expr.InlineCalls.visitSetExpValue(InlineCalls.java:363)
    gnu.expr.InlineCalls.visitSetExpValue(InlineCalls.java:28)
    gnu.expr.ExpVisitor.visitSetExp(ExpVisitor.java:114)
    gnu.expr.InlineCalls.visitSetExp(InlineCalls.java:369)
    gnu.expr.InlineCalls.visitSetExp(InlineCalls.java:28)
    gnu.expr.SetExp.visit(SetExp.java:406)
    gnu.expr.ExpVisitor.visit(ExpVisitor.java:55)
    gnu.expr.InlineCalls.visit(InlineCalls.java:46)
    gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:272)
    gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:28)
    gnu.expr.BeginExp.visit(BeginExp.java:156)
    gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
    gnu.expr.InlineCalls.visit(InlineCalls.java:46)
    gnu.expr.InlineCalls.visit(InlineCalls.java:28)
    gnu.expr.ExpVisitor.visitAndUpdate(ExpVisitor.java:161)
    gnu.expr.ExpVisitor.visitExps(ExpVisitor.java:175)
    gnu.expr.ApplyExp.visitArgs(ApplyExp.java:416)
    gnu.kawa.functions.CompileMisc.validateApplyAppendValues(CompileMisc.java:139)
    sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    gnu.expr.InlineCalls.maybeInline(InlineCalls.java:467)
    gnu.expr.QuoteExp.validateApply(QuoteExp.java:150)
    gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:119)
    gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:28)
    gnu.expr.ApplyExp.visit(ApplyExp.java:411)
    gnu.expr.ExpVisitor.visit(ExpVisitor.java:55)
    gnu.expr.InlineCalls.visit(InlineCalls.java:46)
    gnu.expr.InlineCalls.visit(InlineCalls.java:28)
    gnu.expr.LambdaExp.visitChildrenOnly(LambdaExp.java:1664)
    gnu.expr.LambdaExp.visitChildren(LambdaExp.java:1651)
    gnu.expr.InlineCalls.visitScopeExp(InlineCalls.java:279)
    gnu.expr.InlineCalls.visitLambdaExp(InlineCalls.java:349)
    gnu.expr.InlineCalls.visitLambdaExp(InlineCalls.java:28)
    gnu.expr.ExpVisitor.visitModuleExp(ExpVisitor.java:103)
    gnu.expr.ModuleExp.visit(ModuleExp.java:482)
    gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
    gnu.expr.InlineCalls.visit(InlineCalls.java:46)
    gnu.expr.InlineCalls.inlineCalls(InlineCalls.java:33)
    gnu.expr.Compilation.walkModule(Compilation.java:994)
    gnu.expr.Compilation.process(Compilation.java:1965)
    gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:330)
    gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:315)
    gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:315)
    gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:315)
    kawa.repl.compileFiles(repl.java:783)
    kawa.repl.processArgs(repl.java:412)
    kawa.repl.main(repl.java:827)
    Kawa compile time: 3.589 seconds
    .P.S : I HAVED INCLUDED THE EXTENSION U SAID TO INCLUDE!
    PLEASE HELP ! THANKS IN ADVANCE

    1. Hi Hairini!

      I also had many problems trying to import .aia files into App Inventor. The blocks get all mixed and out of place.

      That’s why I included all the pictures of the blocks into the tutorial. Maybe you can try to build the blocks yourself so they don’t get mixed and out of place when importing.

      I also found someone with the same issue, but not related to my project:
      https://groups.google.com/forum/#!category-topic/mitappinventortest/sIkVeUutTpo

  16. Olá Geovanni

    Uma pergunta: Eu consigo enviar dados via BLE sem precisar estar conectado? Mesmo que seja pouca informação? Seria como uma notificação junto com o advertisement. 🙂

    Meu objetivo é que o ESP32 envie pequenos pacotes de informação. Mas como estará em movimento e o sistema que deve coletar a informação ficará parado, não há muito tempo para conectar e enviar os dados enquanto estiverem no alcance do sinal.

    Já pesquisei sobre o BLE Mesh, que acredito poderá resolver o problema, mas ainda tem pouco material. A própria biblioteca da Espressif ainda está em um brench de desenvolvimento segundo o site deles [1].

    Obrigado

    [1] https://www.espressif.com/en/news/Espressifs_BLE_Mesh_SDK_Is_Now_Bluetooth_SIG_certified

    1. Olá!

      É possível comunicar via Bluetooth sem fazer o emparelhamento. Dê uma olhada neste livro, do MIT sobre Bluetooth.
      http://people.csail.mit.edu/rudolph/Teaching/Articles/BTBook-march.pdf

      Na página 25 ele explica uma forma de mandar mensagem sem fazer o emparelhamento.

      Abraços!

      André Rocha – Equipe FilipeFlop

  17. Olá, excelente artigo e muito bem explicado, obrigado por compartilhar conhecimento com nós. Eu tenho uma dúvida, como que eu faço para regular a distância de leitura?

    1. Acho que não soube me expressar direito, eu gostaria de saber como que eu faço para regular a distância de envio de informação por bluetooth, nesse caso, eu gostaria de diminuir ou seja, apenas a partir de tal distância há o envio de informações

      1. Olá Elias,

        Para isso você precisaria saber tanto a posição do seu sensor quanto a do seu celular. Ou seja, precisaria adicionar algum sensor do seu projeto e implementar algumas funções no seu código.
        Também é importante observar que o ESP32 possui tecnologia Bluetooth 4.2 a qual trabalho em um raio de 50m. Se a tecnologia Bluetooth do seu celular trabalha em um raio menor que 50m, esse será o limite de distância para que a comunicação ocorra.

        Abraço!
        Rosana – equipe FilipeFlop

        1. É possível por meio de programação diminuir o alcance do scanner do Bluetooth que tem no ESP32?

          1. Olá Elias,

            Acredito que não seja possível.

            Abraço!
            Rosana – Equipe FilipeFlop

  18. Olá!

    Estou desenvolvendo um sensor para contagem volumétrica de passageiros, e para isso estou utilizando o ESP32.
    Como o ônibus possui três portas de entrada/saída irei instalar o sensor nas três portas. No entanto, gostaria de fazer com que um dos sensores funcionasse como “master” e os outros dois como “slaves”. Gostaria de fazer essa comunicação via Bluetooth por questões de economia de energia, além disso o ônibus não possui WIFI.
    Você poderia apenas me esclarecer se eu consigo estabelecer uma conexão via Bluetooth entre dois ESP32 de forma que o “slave! envio o dado coletado para o “master” ?
    Desde já agradeço a atenção.

    1. Olá Rafael,

      É possível configurar o ESP32 como master e como slave. E também é possível fazer a comunicação entre os dois.
      Boa sorte no projeto 😀

      Abraço!
      Rosana – Equipe FilipeFlop

      1. Fala Rafael você tem algum projeto de comunicação entre os dois para compartilhar?

  19. Alguém teria para disponibilizar algum código BLE funcionando como “master” e os outros dois como “slaves”. Gostaria de fazer essa comunicação via Bluetooth por questões de economia de energia usando dois ESP32 de forma que o “slave! envio o dado coletado para o “master” e o master use este dado se maior que um determinado valor para acender ou apagar um led ?

    1. Olá Marques,

      Ainda não temos nenhum tutorial sobre o assunto. Mas é bem possível que logo sai algum post com esse conteúdo!

      Abraço!
      Rosana – Equipe FilipeFlop

  20. VOcê poderia disponibilizar o componente esp32 devkit pro fritzing? Não consigo achar.
    Desde já grato, se puder me enviei por e-mail
    an-menezes@hotmail.com

    1. Olá André,

      Acho que você precisa baixar o componente.

      Abraço!
      Rosana – Equipe FilipeFlop

  21. Olá! Bem interessante esse artigo, até então não conhecia programação em bloco para criar Apps, gostaria de saber se consigo utilizar algum trecho desse artigo para criar um “intevalo” de quanto em quanto tempo acende um led, utilizando BLE para definir o intervalo do tempo que o LED irá acender!

    1. Olá Nicholas,

      É possível fazer isso sim!

      Abraço!
      Rosana – Equipe FilipeFlop

  22. Ola Giovanni,

    Primeiro parabéns pelo post, muito esclarecedor e bem útil.

    Estou tentando replicar a prática em casa para uma disciplina de IOT do meu curso de ciência da computação, mas estou com o seguinte problema:
    O app quando lê a medida do DHT aparece com um valor de 13°C de temperatura e um valor muito alto de umidade (mais de 100%).
    Depois de um tempo lendo o app começa uma leitura totalmente errada apresentando o valor de 2147483 para ambos temperatura e umidade.
    Já tentei trocar o dht e as portas IO do ESP32 mas o problema persiste.

    Você teve problema similar quando estava desenvolvendo o código?
    Obrigado

    1. Olá Diego,

      Você usou o resistor de pull up?
      Além disso, os valores no serial monitor, também estão assim?

      Abraço!
      Rosana – Equipe FilipeFlop

      1. Olá Rosana bom dia,

        Usei um resistor de 120 ohms. De quanto era o resistor usado por vocês no circuito?

        No monitor serial a medida aparece igual a do app.
        Hoje por exemplo estou lendo 11°C de temperatura e 170 % de umidade.
        Acho que o problema pode estar na conversão dos valores de int para String na parte final do código:

        char humidityString[2];
        char temperatureString[2];
        dtostrf(humidity, 1, 2, humidityString);
        dtostrf(temperature, 1, 2, temperatureString);

        char dhtDataString[16];
        sprintf(dhtDataString, “%d,%d”, temperature, humidity);

        pCharacteristic->setValue(dhtDataString);

        Vcs tiveram problemas com essa conversão?

        Obrigado pela ajuda.
        Abraço
        Diego

        1. Olá Diego,

          Tente usar um resistor de 4.7k.
          O código foi testado sim e deu tudo certo 😉

          Abraço!
          Rosana – Equipe FilipeFlop

        2. Boa tarde! Encontrei o problema: no void setup acrescente a linha abaixo:

          dht.begin();

          1. Olá Fábio,

            Obrigada pelo aviso, iremos adicionar a linha ao código.

            Abraço!
            Rosana – Equipe FilipeFlop

          2. Outro ponto: não sei a razão, mas aplicativos feitos pelo Thunkable/App Inventor não estão conseguindo localizar o Bluetooth LE do ESP32. A solução é usar o Bluetooth Clássico do ESP32. Se alguém precisar, posso compartilhar o código do ESP e do Thunkable.

          3. Olá Fábio,

            Isso acontece apenas nesses aplicativos?

            Abraço!
            Rosana – Equipe FilipeFlop

  23. Boa noite
    gostaria de saber se vcs podem me esclarecer um duvida sobre o codigo de blocos
    de onde vc tiro o bloco call bluetoothle star scanning
    des de ja agradeço

    Diego pereira de sousa
    1. Olá Diego,

      Você baixou a a extensão de comunicação BLE? O bloco deve estar dentro desta biblioteca.

      Abraço!
      Rosana – Equipe FilipeFlop

  24. Boa tarde. Gostaria de saber se o mesmo programa pode ser utilizado com uma ESP-01. É necessário alterar as UUIDS? Mais uma pergunta: onde eu acho o bloco “When Connect After Picking do”?

    VINICIUS DE SOUZA OLIVEIRA
    1. Olá Vinicius,

      O ESP-01 não possui Bluetooth, o que torna impossível utilizar o mesmo programa.

      Abraço!
      Rosana – Equipe FilipeFlop

  25. Parabéns pelo Post!

    Gostaria de saber o que posso fazer para usar o BLE com várias telas. Por que estou trabalhando em um projeto que utiliza a conexão ble com esp32 porém preciso usar mais de uma tela, e quando mudo a tela o app perde a conexão com o esp utilizando essas funções que vocês disponibilizaram.

    Agradeço desde já!

    1. Olá André,

      Para fazer isso é necessário alterar a programação. Se tiver dúvidas, enter no nosso fórum, lá o pessoal pode te ajudar nisso.

      Abraço!
      Rosana – Equipe FilipeFlop

  26. Ola por favor poderia me sanar uma duvida, já pesquisei muito a respeito e nada a própria espressifi não fala a respeito de nada similar, gostaria de estabelecer uma comunicação entre dois esp32 dentro de uma distancia de 8m sem usar internet / wi-fi mas sim por meio de comunicação Bluetooth pois o consumo de bateria é baixo, eu só preciso saber se é possível e se alguém já o fez! Obrigado.

    1. Olá Rodrigo,

      Sugiro que você poste sua dúvida no nosso fórum. Lá o pessoal pode te ajudar mais nisso 😉

      Abraço!
      Rosana – Equipe FilipeFlop

  27. olá boa noite, sou novo com o esp32, possuo um NodMCU32S e ao testar o codigo com as bibliotecas bluetooth sempre me deparo com o “erro compilar para placa nodmcu32s” ja testei codigos mais simples como o blink e da certo e sempre q tento algum codigo relacionado ao bluetooth. Saberia me dizer o que pode estar errado?

    1. Olá, Ivan,

      Seria interessante você postar essa dúvida lá no nosso fórum! Chegando lá, posta seu código e todos os erros para uma análise mais acertada!

      Abraços!
      Diogo – Equipe FilipeFlop

  28. No aplicativo a temperatura esta dando -14º e a humidade 151%,não to entendo por que isso :/

    1. Adriam,

      Verifique se as conexões estão bem encaixadas e se está tudo ok!

      Abraços!
      Diogo – Equipe FilipeFlop

  29. Boa tarde Giovanni, tudo joia?

    Eu quero fazer um projeto onde eu preciso enviar dados de um ponto qualquer para um celular/smartphone (independente da interface).
    Basicamente seria enviar uma notificação (qualquer tipo de notificação) para um celular que se aproxima deste ponto. Ou seja, o ponto precisa reconhecer a aproximação e enviar uma notificação para o smartphone.
    Qual seria a maneira ideal de realizar esse projeto? Você poderia me ajudar, por favor?

    Obrigado e abraços!

  30. Olá Giovanni. Excelente post!

    Estive acompanhando seu diálogo com o Timothy através do link colocado no post e me deparei com o limite de 20 bytes que o BLE suporta.

    Como estou desenvolvendo uma aplicação que terá uma mini impressora térmica Bluetooth, acredito que o BLE do ESP2 não atenderá às especificações.

    Minha dúvida é como ativar o Bluetooth clássico do ESP32 para poder efetuar a comunicação com a impressora. Você tem informações sobre essa configuração?

    1. Edelson,

      Dê uma olhada nesse link: https://randomnerdtutorials.com/esp32-bluetooth-classic-arduino-ide/
      Ele deve te ajudar 🙂

      Abraços!
      Diogo – Equipe FilipeFlop

      1. Olá Diogo,

        Ajudou mesmo, ótimo tutorial.

        Obrigado!

        Edelson

  31. Será possível em vez de definires os UUID’s logo de início, chamar um bloco que devolva essa mesma informação e só depois guarda-la nas variáveis correspondentes? Assim, numa lista de opções possíveis para estabelecer conexão por BLE, a aplicação definia automaticamente os UUID’s automaticamente conforme o dispositivo que iria conectar-se.

    Obrigado,
    Francisco Campos

    1. Francisco,

      Você deseja ir gerando os UUID ao longo da necessidade, ou vai ter uma lista pré-definida com alguns?

      Abraços!
      Diogo – Equipe FilipeFlop

      1. Para ir gerando ao longo da necessidade

        1. Francisco,

          Nesse caso, o seu código teria que ir gerando os códigos através de algum método criado fora do void loop(). E para isso, você teria que aprender como esses número UUID são formados, para então aplicar um código que faça isso. É bastante complicado se quiser que ele vá gerando simultaneo ao uso.

          Abraços!
          Diogo – Equipe FilipeFlop

        2. Ok, muito obrigado.

          Cumprimentos.