- Componentes necessários
- Usando o nRF Connect Android App para ESP32 iBeacon
- Programando ESP32 para funcionar como BLE iBeacon
ESP32 é realmente um dispositivo IoT poderoso com suporte embutido para Bluetooth e WiFi. O ESP32 é uma versão avançada do seu predecessor ESP8266 com recursos extras como RAM, ROM, GPIO Pins etc. O módulo ESP32 suporta tanto o Bluetooth clássico quanto o Bluetooth Low Energy (BLE), o Bluetooth clássico pode ser usado para transferir músicas ou arquivos e o BLE a opção pode ser usada para aplicativos otimizados com bateria, como beacons Bluetooth, bandas de fitness, s de proximidade, etc. Também é possível usar o ESP32 como um Bluetooth serial como os módulos HC-05 ou HC-06 para projetos simples de microcontroladores.
Como sabemos, o BLE pode operar em dois modos diferentes - modo Servidor e modo Cliente. Ambos os modos foram discutidos em nossos Tutoriais ESP32 anteriores:
- Servidor ESP32 BLE - Serviço GATT para indicação de nível de bateria
- Cliente ESP32 BLE - Conectando-se a Fitness Band para acionar uma lâmpada
Neste tutorial, construiremos um iBeacon BLE usando ESP32, onde ESP32 atuará como um servidor e o smartphone atuará como um cliente. Presumo que você já esteja familiarizado sobre como usar a placa ESP32 com o IDE Arduino, se não voltar para o tutorial de introdução ao ESP32.
Você também pode saber mais sobre o que é a tecnologia Beacon / iBeacon, analisando nossos projetos iBeacon Bluetooth anteriores usando Raspberry Pi e HM-10 BLE iBeacon.
Componentes necessários
Hardware:
- Placa de Desenvolvimento ESP32
- Cabo Micro USB
Programas:
- IDE Arduino
- Aplicativo Android: nRF Connect for Mobile (por Nordic Semiconductor)
Existem muitos aplicativos de scanner BLE, um deles foi usado em nosso projeto anterior de Como usar o módulo HM-10 BLE com Arduino. Este aplicativo de scanner BLE fornece uma boa interface gráfica (GUI), mas carece de informações adicionais, portanto, neste projeto, estamos usando o aplicativo NRF Connect for Mobile.
Usando o nRF Connect Android App para ESP32 iBeacon
1. Baixe o aplicativo nRF Connect na Google Play Store e abra-o.
2. A tela é semelhante a abaixo. As opções úteis para este projeto serão 'Scan', 'Scanner' e 'Info' quando os dispositivos forem encontrados.
A opção 'Scan' será usada para ver todos os iBeacons disponíveis. Para começar a pesquisar o iBeacon, abra a tela ou vá para a opção 'Scan' no canto superior direito da tela. Isso começará a pesquisar os iBeacons disponíveis.
3. Depois de pesquisar o iBeacon, você poderá ver o RSSI, UUID, Principal e Menor do iBeacon. O RSSI mudará se você afastar o celular ou iBeacon um do outro. Aqui nesta tela, o RSSI é (-37). Além disso, existem alguns detalhes, como nome da empresa fictícia, tipo de dispositivo, comprimento dos bytes, o nome local do ESP32. Aqui está “ ESP32 as iBeacon ”. Você pode alterar o nome local no esboço.
4. Depois de retirar o smartphone do iBeacon, o valor RSSI muda de -37 para -58. Esses valores continuarão mudando se você mover um dos dispositivos.
Os valores aceitáveis do sinal RSSI são os seguintes:
Sinal de força | TL; DR | Requerido para | |
---|---|---|---|
-30 dBm | Surpreendente | Força máxima de sinal alcançável. O cliente pode estar a apenas alguns metros do AP para conseguir isso. Não é típico ou desejável no mundo real. | N / D |
-67 dBm | Muito bom | Intensidade mínima do sinal para aplicativos que exigem entrega muito confiável e oportuna de pacotes de dados. | VoIP / VoWiFi, streaming de vídeo |
-70 dBm | OK | Força mínima do sinal para entrega confiável de pacotes. | Email, web |
-80 dBm | Não é bom | Intensidade mínima do sinal para conectividade básica. A entrega do pacote pode não ser confiável. | N / D |
-90 dBm | Inutilizável | Aproximando-se ou se afogando no piso de ruído. Qualquer funcionalidade é altamente improvável. | N / D |
Programando ESP32 para funcionar como BLE iBeacon
Há um programa de amostra do ESP32 BLE iBeacon disponível quando você instala a placa ESP32 no Arduino IDE. Mas nós editamos ligeiramente este esboço neste tutorial, a versão editada completa do programa de amostra é fornecida no final deste tutorial.
Para abrir o Programa de Amostra do ESP32 BLE_iBeacon, siga as etapas abaixo.
- Abra o IDE Arduino e selecione “ESP32 Dev Module”. (Se você não encontrar esta placa, verifique se você instalou o pacote de placa ESP32)
- Vá para Arquivo > Exemplos > ESP32 BLE Arduino > BLE_iBeacon
- Abra o Sketch “BLE_iBeacon”.
Agora há uma pequena modificação no código que é feita neste tutorial. O nome ESP32 também será atualizado neste esboço. Portanto, comece com a inclusão das bibliotecas necessárias que serão usadas na criação do servidor BLE e no iBeacon.
#include "sys / time.h"
Esta é uma biblioteca de hora para obter a hora atual do sistema. Ele contém funções como tv_sec, gettimeofday () etc. Para obter mais informações, você pode visitar a versão oficial do UNIX de ' sys / time.h'.
Em seguida, as bibliotecas ESP32 BLE são incluídas, que contém muitas funções usadas para fazer ESP32 em diferentes configurações, como Cliente BLE ou Servidor BLE.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
A biblioteca iBeacon está incluída, o que define o ESP32 como iBeacon. Junto com isso, a biblioteca de sono profundo está incluída para ESP32. A biblioteca será usada para enviar ESP32 em modo de suspensão profunda por um período de tempo definido.
#include "BLEBeacon.h" #include "esp_sleep.h"
Defina a duração do sono para ESP32. Aqui, o ESP32 ficará em sono profundo por 10 segundos e fará um anúncio e, em seguida, voltará a dormir profundamente por 10 segundos.
#define GPIO_DEEP_SLEEP_DURATION 10
Aqui o RTC_DATA_ATTR é definido. Observe que se você definir uma variável global com o atributo RTC_DATA_ATTR, a variável será colocada na memória RTC_SLOW_MEM. Portanto, a estrutura declarada como RTC_DATA_ATTR e copiar a memória dinâmica para esta estrutura antes de um sono profundo ajuda a recuperá-la para a memória dinâmica após o despertar. Em palavras simples, estamos economizando o tempo da memória estática da memória dinâmica para recuperá-lo novamente após um sono profundo. Aqui as duas variáveis são definidas. O ' último ' é usado para obter a última vez em que o ESP32 entrou em hibernação e a contagem de inicialização é usada para contar o número de reinicializações.
RTC_DATA_ATTR estático time_t last; RTC_DATA_ATTR static uint32_t bootcount;
Em seguida, defina o tipo de publicidade BLE. A definição é feita da seguinte maneira.
BLEAdvertising * pAdvertising;
O timeval é definido como estrutura para acessar a hora atual.
struct timeval agora;
Além disso, o UUID é definido. Os UUIDs podem ser gerados a partir deste link .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Agora crie uma função que conterá atributos iBeacon como UUID, Major, Minor, Etc. Nesta função, crie uma instância para BLE como iBeacon e defina um ID de fabricante falso, UUID, principal e secundário para ESP32 como iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Defina o sinalizador como 0x04 para que ele produza BrEdrNotSupported no scanner.
oData.setFlags (0x04);
Defina os dados de publicidade para publicação.
std:: string strServiceData = "";
Adicione a string uma após a outra para anunciar.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Digite strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Comece a publicidade publicando dados.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Inicie o monitor serial na taxa de transmissão de 115200 e obtenha o tempo. Aumente também a contagem de inicialização para armazenar o número de redefinições.
Serial.begin (115200); gettimeofday (& now, NULL); Serial.printf ("iniciar ESP32% d \ n", bootcount ++);
Armazene a hora atual na memória estática.
last = now.tv_sec;
Crie um dispositivo BLE e nomeie-o como quiser. Aqui, o ESP32 é denominado “ ESP2 as iBeacon ”. Observe que os nomes podem ser longos, mas esta versão do código iniciou o suporte para nomes longos.
BLEDevice:: init ("ESP32 como iBeacon");
Crie o servidor BLE para anunciar e começar.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Em seguida, defina o ESP32 no modo iBeacon.
setBeacon ();
Comece a anunciar, pare de anunciar e durma profundamente por 10 segundos.
pPublicidade-> iniciar (); pPublicidade-> parar (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Finalmente, conecte a placa de desenvolvimento ESP32 ao seu laptop usando um cabo Micro USB e carregue o código no ESP32 usando o Arduino IDE. Em seguida, abra o nRF Connect Android App em seu smartphone e comece a digitalizar. Você encontrará o ESP32 como uma transmissão iBeacon, conforme mostrado na imagem abaixo:
É assim que ESP32 pode ser usado como BLE Beacon para anunciar UUID, Major e Minor. Se você quiser saber mais sobre o iBeacon, siga nosso tutorial anterior sobre HM10 como iBeacon. Além disso, se você tiver alguma dúvida, comente abaixo ou faça perguntas nos fóruns.
O código completo com um vídeo de trabalho é fornecido abaixo.
/>