Bluetooth Low Energy com ESP32 e DHT11 111

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. 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. 

Faça seu comentário

Acesse sua conta e participe

111 Comentários

  1. Quando fecha o aplicativo, o bluetooth do esp32 trava e nao conecta mais.
    O que pode ser?

    1. Olá,

      Encontrei esse post aqui: https://arduino.stackexchange.com/questions/82165/esp32-arduino-bluetooth-serial-does-not-reconnect-after-disconnecting

      Parece se tratar de um problema com o Windows 10, e que estão trabalhando para resolver.

      Se você conseguir testar com outra versão de Windows ou outro sistema operacional para ver se dessa forma funciona.

      Abraços!
      Vinícius – Equipe MakerHero

  2. Quando faço a conexao pelo apk, da o seguinte erro:
    Runtime Error
    Service 6E400001-B5A3-F393-E0A9-E50E24DCCA9E, characteristic 6E400003-B5A3-F393-E0A9-E50E24DCCA9E are not published by the connected device

    Instalei o apk da MakerHero, gravei o mesmo codigo no esp32.

    1. Olá,

      As linhas

      #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”

      estão corretas no programa?

      Verifique também se os códigos estão iguais nessa parte dos blocos:

      initialize global service_UUID to “6E400001-B5A3-F393-E0A9-E50E24DCCA9E”
      initialize global RX_char_UUID to “6E400001-B5A3-F393-E0A9-E50E24DCCA9E”
      initialize global TX_char_UUID to “6E400001-B5A3-F393-E0A9-E50E24DCCA9E”

      Abraços!
      Vinícius – Equipe MakerHero

  3. Preciso enviar dados de acelerômetro MPU6050 para um celular android via bluetooth. Necessito renderizar na tela do celular um segmento da trajetória do acelerômetro. Qual módulo bluetooth(hc ou BLE) é o melhor indicado? Posso usar o arduino pro mini nessa configuração para economia de espaço e energia? Poderia indicar referências de código para esta aplicação?

    1. Olá Marco,

      A escolha do módulo Bluetooth deve levar em consideração o alcance (qual a distância entre transmissor e receptor?) e quais tipos de dispositivo você está querendo comunicar (nesse caso você já respondeu que é um celular Android). Leve em consideração também a taxa de transmissão e o consumo de energia. Dessa forma você pode fazer a escolha do melhor módulo.

      Abraço!
      Rosana – Equipe MakerHero

  4. Boa noite
    Giovanni Bauermeister

    Estou tentando realizar um projeto parecido com o seu, no meu projeto não tenho um sensor de temperatura e humidade, eu quero usar um sensor de batimentos cardíacos MAX30100. Você poderia me ajudar.

    Atenciosamente Humberto S. Lima

    email: [email protected]

    Cel/Zap 85 9 8728 5728

    1. Olá Humberto!

      Você já deu uma olhada na nossa comunidade no Facebook?
      Acho que o pessoal pode te ajudar melhor lá com a sua ideia de projeto 🙂

      Abraço!
      Rosana – Equipe MakerHero

  5. Olá!
    Estou usando o BLE Scanner ou o Serial Bluetooth Terminal para comunicar com o ESP32 com este código que copiei daqui.
    O device aparece ao escanear, o serviço com as características é exibido corretamente e consigo receber a temperatura e humidade (coloquei valores direto no código) no celular.
    Mas quando envio o caracter “A” ou qualquer outra coisa, o callback de RX não é acionado de nenhuma forma.
    Coloquei um println para monitorar e não chega nada nunca.

    Ficando um pouco desanimado com o ESP32…

    Alguém pode ajudar?

    Obrigado.

    1. Iatamar,

      Você já verificou todas as conexões para garantir que está tudo ok?

      Abraços!
      Diogo – Equipe MakerHero

  6. Muito legal seu projeto, porém não tenho experiência noTrunkable, e percebi que são usados chamadas de procedures, mas no esquema geral de blocos não encontrei a criação das procedures, pode me ajudar neste passo? Obrigado.

  7. Parabéns pelo post. Gostaria de saber se tem como enviar o projeto .aia por e-mail pois o link aqui do site eu não consegui baixar. Outra pergunta é se eu consigo abrir o arquivo .aia pelo App Inventor ? Obrigado

  8. Eu estou tentando fazer apenas a parte de ligar um led, mas meu app fecha quando deveria enviar algum dado para o esp32, mesmo eu tendo utilizado esse como base. Alguém tem alguma idéia do q pode estar causando isso?

  9. Há alguma forma de enviar os dois dados separados? Usando dois UUID’s, por exemplo.

  10. Muito bom esse tuto,mas tenho uma duvida, to usando o pzem pra mandar dados pro smartphone, so que ele nao envia mais de 16 caracteres. Isso é normal?

    1. Wellington,

      São 16 caracteres de uma vez? Pode ser que exista alguma limitação de bits por aí.

      Abraços!
      Diogo – Equipe MakerHero

  11. Olá, preciso de ajuda, fiz o código para o apk como acima e quando aperto em conectar a tela fica preta, não aparece o dispositivo disponível, testei o meu programa do esp 32 com o apk que vcs disponibilização para baixar e funcionou corretamente, não sei mais o que fazer, fico no aguardo!

    1. vai em configurações do apk e de as permissões de gps e quando for acessar o apk ligue o gps

      WELLINGTON ARAUJO DA SILVA
  12. ótimo projeto. obrigado pela aula.

    tem como enviar a hora do celular, msg, notificação para o esp32 e exibir em um display oled ?

  13. 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 MakerHero

      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 MakerHero

        2. Ok, muito obrigado.

          Cumprimentos.

  14. 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 MakerHero

      1. Olá Diogo,

        Ajudou mesmo, ótimo tutorial.

        Obrigado!

        Edelson

  15. 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!

  16. 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 MakerHero

  17. 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 MakerHero

  18. 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 MakerHero

  19. 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á!

  20. 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 MakerHero

  21. 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

    1. Olá Diego,

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

      Abraço!
      Rosana – Equipe MakerHero

  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 MakerHero

      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 MakerHero

        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 MakerHero

          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 MakerHero

          4. Fabio boa tarde. Adicionei a linha referida no código compila sem erros mas ao tentar conectar não pareia o esp32. Descarto o problema do esp pois fiz teste com outros códigos e funciona. Li alguns relatos atuais de problemas com a biblioteca ble. Você disse que possui os códigos no ESP e do Thunkable usando a versão clássica. Se não for incomodo poderia compartilhar ambos os códigos do ESP e Trunkable comigo, pois estou estudando e iniciando no ESP. O código no Trunkable do post exportei para o Kodular, mais atual e não tive problemas. Segue meu e-mail, [email protected] desde já agradeço a atenção.

          5. Boa tarde, Fabio!

            Pode me enviar, por favor, o código do ESP e Thunkable utilizando o Bluetooth clássico? O meu email é [email protected]

            Desde já, agradeço a sua atenção e o conhecimento compartilhado! Abraço.

  23. 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 MakerHero

  24. VOcê poderia disponibilizar o componente esp32 devkit pro fritzing? Não consigo achar.
    Desde já grato, se puder me enviei por e-mail
    [email protected]

    1. Olá André,

      Acho que você precisa baixar o componente.

      Abraço!
      Rosana – Equipe MakerHero

  25. 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 MakerHero

      1. Obrigado Rosana!

  26. 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 MakerHero

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

  27. 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 MakerHero

        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 MakerHero

  28. 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.
      https://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 MakerHero

  29. 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

  30. can u upload the apk file please

    1. Hello Nandy! Welcome to our blog

      The link for the apk file is here: https://drive.google.com/file/d/1oMLX2FboC0SNiAb1dn2a0TlED_mgx3Bi/view

  31. 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.

  32. 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/

  33. 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!

            Giovanni Bauermeister
  34. 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.makerhero.com/blog/medidor-de-energia-eletrica-com-arduino/

      Abraço e bons projetos!

  35. 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.

            Giovanni Bauermeister
  36. 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.

  37. 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?

  38. 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.

  39. 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!

  40. 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.makerhero.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 MakerHero

  41. 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.

      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);
                }
              }
          };
  42. 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!

  43. 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.