IoT DevKit - 16. Envio de Dados por Bluetooth

Introdução
No tutorial anterior aprendemos sobre o funcionamento do protocolo Bluetooth, tivemos nosso primeiro contato com essa conectividade através do aplicativo Blynk, porém ainda não chegamos a enviar informações do IoT DevKit para o celular.
Neste tutorial veremos como enviar as leituras do LDR do kit para o aplicativo, utilizando os pinos virtuais e o timer do Blynk.
Lista de Materiais
Configuração do Aplicativo
Para este tutorial aproveitaremos todas as configurações que já fizemos anteriormente, inclusive podemos manter o botão de acionamento do LED do kit, pois ele não irá influenciar no funcionamento deste projeto. A única alteração necessária é a adição de um novo "Widget". Portanto pressione novamente o botão para adicionar um "Widget" (que é um símbolo de adição dentro de um círculo), e então, quando a lista for apresentada, busque pelo "Widget" "Gauge", como na imagem abaixo.

Ao encontrar essa opção na lista, selecione-a para que o "Widget" seja adicionado ao painel. Então, toque sobre ele para que seja aberta uma janela de configuração, como a da imagem a seguir.

Com essa janela aberta, dê um nome para o seu "Widget" e digite "%" no campo "Label". Feito isso, altere o limite superior do "Widget" de 1023 para 100, já que iremos trabalhar com um valor em porcentagem da luminosidade ambiente, e então selecione o pino virtual "V0" no campo "Input". Deste modo o seu "Widget" ficará configurado como o da imagem a seguir.

Após configurar o "Widget", retorne para o painel do aplicativo, que deve estar parecido com o da imagem a seguir.

Vale lembrar que os "Widgets" do aplicativo Blynk são completamente personalizáveis, portanto você pode alterar suas dimensões ou seu posicionamento. Para isso, basta tocar e segurar o toque durante alguns instantes sobre um dos "Widgets", para que ele entre em modo de edição.
Código
Agora que o painel do aplicativo já está configurado para receber os valores do LDR do kit, carregue o código a seguir para o seu ESP32. Lembre-se de alterar a variável CHAVE_AUTENTICACAO
com a chave de autenticação do seu projeto no aplicativo, antes de carregar o código para a placa.
/*******************************************************************************
* IoT DevKit - Envio de Dados por Bluetooth (v1.0)
*
* Codigo utilizado para realizar a leitura do LDR do IoT DevKit e enviar
* os valores para o aplicativo Blynk atraves da conexao Bluetooth.
*
* Copyright 2020 RoboCore.
* Escrito por Giovanni de Castro (05/10/2020).
* Creditos - @francois - RoboCore
* - @bijilbaji - Solucao proposta no topico #102 do GitHub
* - (https://github.com/espressif/arduino-esp32/issues/102#issuecomment-611307887)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version (<https://www.gnu.org/licenses/>).
*******************************************************************************/
//Definicao das funcoes auxiliares para o Blynk
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
//Inclusao das bibliotecas
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <soc/sens_reg.h> //Biblioteca para a leitura dos registradores
//Declaracao da variavel que armazena a chave de autenticacao do aplicativo
const char CHAVE_AUTENTICACAO[] = "SUA-CHAVE-AUTENTICACAO-AQUI"; //Altere essa variavel com a chave de seu projeto
//Criacao do timer para a leitura do LDR
BlynkTimer timerLDR;
//Definicao do pino conectado ao LDR
const int PINO_LDR = 15;
//Declaracao da variavel e da funcao para a leitura do LDR
uint32_t adc_register; //Variavel para o registrador
int customARead(int); //Funcao para a leitura do sensor
//---------------------------------------------------------------------------------------
//Funcao para ler o LDR e enviar a leitura para o Blynk
void lerLDR(){
//Realiza a leitura e entao a mapeia entre 0 e 100
int leitura_LDR = customARead(PINO_LDR);
leitura_LDR = map(leitura_LDR, 0, 4095, 100, 0);
//Escreve o valor lido no pino virtual "V0" do aplicativo
Blynk.virtualWrite(V0, leitura_LDR);
}
//---------------------------------------------------------------------------------------
void setup(){
//Inicializacao do monitor serial
Serial.begin(115200);
Serial.println("Waiting for connections...");
//Define "PINO_LDR" como uma entrada
pinMode(PINO_LDR, INPUT);
adc_register = READ_PERI_REG(SENS_SAR_READ_CTRL2_REG); //Estado atual do registrador
//Inicializacao do Blynk com a chave de autenticacao
Blynk.begin(CHAVE_AUTENTICACAO);
//Configura o timer do LDR com intervalo de 1 segundo
timerLDR.setInterval(1000L, lerLDR);
}
//---------------------------------------------------------------------------------------
void loop(){
Blynk.run(); //Mantem a conexao ativa com o aplicativo e processa comandos recebidos ou enviados
timerLDR.run(); //Execucao do timer do LDR
}
//---------------------------------------------------------------------------------------
//Funcao responsavel por ler o ADC conectado ao LDR
int customARead(int pin){
uint32_t wifi_register = READ_PERI_REG(SENS_SAR_READ_CTRL2_REG);
WRITE_PERI_REG(SENS_SAR_READ_CTRL2_REG, adc_register);
SET_PERI_REG_MASK(SENS_SAR_READ_CTRL2_REG, SENS_SAR2_DATA_INV);
int value = analogRead(pin); //Realiza a leitura
WRITE_PERI_REG(SENS_SAR_READ_CTRL2_REG, wifi_register);
return value; //Retorna o valor lido
}
Entendendo o Código
Este código aproveita todas as funções utilizadas no tutorial anterior, porém, além das bibliotecas que já utilizamos anteriormente, nós também incluímos a biblioteca que irá nos ajudar a realizar a leitura do registrador do ADC da placa. Precisamos fazer isso, pois, assim como a conectividade Wi-Fi do ESP32, a conectividade Bluetooth da placa desabilita a leitura do conversor ADC2 da placa.
Em seguida criamos o objeto timerLDR
como uma instância da classe BlynkTimer
da biblioteca do aplicativo Blynk. Por fim, criamos a variável PINO_LDR
, que armazena o pino em que o LDR do kit está conectado ao ESP32, e novamente declaramos a variável e a função que nos ajudarão a realizar a leitura do LDR com a conectividade Bluetooth ativa.
xxxxxxxxxx
//Criacao do timer para a leitura do LDR
BlynkTimer timerLDR;
//Definicao do pino conectado ao LDR
const int PINO_LDR = 15;
//Declaracao da variavel e da funcao para a leitura do LDR
uint32_t adc_register; //Variavel para o registrador
int customARead(int); //Funcao para a leitura do sensor
Após as declarações globais do código, temos a função lerLDR()
que, como o próprio nome já diz, é responsável por ler o LDR do kit, mapear essa leitura para um valor entre 0 e 100 utilizando a variável leitura_LDR
, e então escrever a leitura no pino virtual "V0" do aplicativo (pino que foi configurado no "Widget" criado anteriormente) através da função Blynk.virtualWrite(V0, leitura_LDR)
.
xxxxxxxxxx
//Funcao para ler o LDR e enviar a leitura para o Blynk
void lerLDR(){
//Realiza a leitura e entao a mapeia entre 0 e 100
int leitura_LDR = customARead(PINO_LDR);
leitura_LDR = map(leitura_LDR, 0, 4095, 100, 0);
//Escreve o valor lido no pino virtual "V0" do aplicativo
Blynk.virtualWrite(V0, leitura_LDR);
}
Já nas configurações do código, apenas configuramos o pino conectado ao LDR como uma entrada do sistema, realizamos a configuração inicial do registrador do ADC e configuramos o objeto timerLDR
com o intervalo de 1000 milissegundos para executar a função lerLDR()
, através do comando timerLDR.setInterval(1000L, lerLDR)
.
xxxxxxxxxx
void setup(){
//Inicializacao do monitor serial
Serial.begin(115200);
Serial.println("Waiting for connections...");
//Define "PINO_LDR" como uma entrada
pinMode(PINO_LDR, INPUT);
adc_register = READ_PERI_REG(SENS_SAR_READ_CTRL2_REG); //Estado atual do registrador
//Inicializacao do Blynk com a chave de autenticacao
Blynk.begin(CHAVE_AUTENTICACAO);
//Configura o timer do LDR com intervalo de 1 segundo
timerLDR.setInterval(1000L, lerLDR);
}
A repetição do código é composta somente por duas funções, a Blynk.run()
, que já estavamos utilizando anteriormente e que é responsável por manter o ESP32 e as funcionalidades do Blynk funcionando, e a função timerLDR.run()
, que é responsável por manter o timer do LDR operando constantemente. Em outras palavras, ela mantém o envio de leituras do sensor para o aplicativo com intervalos de 1 segundo. Ao final do código temos a função customARead()
, que, como vimos em tutoriais anteriores, nos ajuda a realizar a leitura dos registradores do ADC2 do ESP32 para ler o LDR do kit.
O Que Deve Acontecer
Após carregar o código para a placa, inicialize a execução do projeto e observe que o "Widget" adicionado neste tutorial irá começar a variar de acordo com a luminosidade ambiente, como na imagem a seguir.

Além disso, o "Widget" de botão que criamos no tutorial anterior ainda está funcional, portanto basta pressionar o seu botão para que o LED do kit altere seu estado.
Conclusão
Neste tutorial vimos como enviar dados para o aplicativo Blynk utilizando os seus pinos virtuais e seus timers, enviando as leituras do LDR do kit a cada 1 segundo.
Solução de Problemas
Se mesmo seguindo as soluções propostas abaixo você não conseguir solucionar o seu problema, encaminhe um e-mail para suporte@robocore.net para que possamos te ajudar da melhor maneira possível.
Dispositivo "Blynk" não é Apresentado na Lista de Dispositivos Conectáveis
Se mesmo após carregar o código da página o ESP32 não for apresentado com o nome "Blynk" na lista de dispositivos do aplicativo, verifique se a chave de acesso ao seu projeto foi corretamente inserida no código e certifique-se que a conectividade Bluetooth está ativada em seu celular. Além disso, vale lembrar que o celular deve estar desconectado de qualquer outro dispositivo Bluetooth para que ele possa listar dispositivos disponíveis no aplicativo e se conectar ao ESP32.
Dispositivo "Blynk" é Apresentado, mas não se Conecta ao Aplicativo
Se isso ocorrer, verifique a chave de acesso inserida no código, pois ela pode estar incorreta ou incompleta.
Botão do Aplicativo Muda de Estado, mas o LED do Kit Não
Se isso acontecer, verifique a configuração do "Widget" no painel do aplicativo, pois é possível que ele tenha sido atrelado a outro pino digital ou virtual.
"Widget" "Gauge" não está Variando seu Valor
Se isso ocorrer, verifique a configuração do "Widget", pois é possível que ele não esteja atrelado ao pino virtual "V0".