- Composants requis
- Utilisation de l'application Android nRF Connect pour ESP32 iBeacon
- Programmation d'ESP32 pour fonctionner comme BLE iBeacon
ESP32 est vraiment un appareil IoT puissant avec une prise en charge intégrée du Bluetooth et du WiFi. L'ESP32 est une version avancée de son prédécesseur ESP8266 avec des fonctionnalités supplémentaires telles que la RAM, la ROM, les broches GPIO, etc. Le module ESP32 prend en charge à la fois Bluetooth classique et Bluetooth Low Energy (BLE), le Bluetooth classique peut être utilisé pour transférer des chansons ou des fichiers et le BLE L'option peut être utilisée pour des applications optimisées pour la batterie comme les balises Bluetooth, les bandes de fitness, la proximité, etc. Il est également possible d'utiliser ESP32 comme un Bluetooth série comme les modules HC-05 ou HC-06 pour de simples projets de microcontrôleurs.
Comme nous le savons, le BLE peut fonctionner dans deux modes différents: le mode serveur et le mode client. Les deux modes ont été discutés dans nos précédents tutoriels ESP32:
- ESP32 BLE Server - Service GATT pour l'indication du niveau de batterie
- Client ESP32 BLE - Connexion à Fitness Band pour déclencher une ampoule
Dans ce tutoriel, nous allons créer une BLE iBeacon en utilisant ESP32 où ESP32 agira comme un serveur et un smartphone agira comme un client. Je suppose que vous savez déjà comment utiliser la carte ESP32 avec Arduino IDE, sinon revenez au didacticiel de démarrage avec ESP32.
Vous pouvez également en savoir plus sur la technologie Beacon / iBeacon en parcourant nos précédents projets Bluetooth iBeacon utilisant Raspberry Pi et HM-10 BLE iBeacon.
Composants requis
Matériel:
- Carte de développement ESP32
- Câble micro USB
Logiciel:
- IDE Arduino
- Application Android: nRF Connect pour mobile (par Nordic Semiconductor)
Il existe de nombreuses applications de scanner BLE, l'une d'entre elles que nous avons utilisée dans notre projet précédent de Comment utiliser le module HM-10 BLE avec Arduino. Cette application de scanner BLE fournit une bonne interface graphique (GUI) mais manque d'informations supplémentaires, donc dans ce projet, nous utilisons l'application NRF Connect for Mobile.
Utilisation de l'application Android nRF Connect pour ESP32 iBeacon
1. Téléchargez l'application nRF Connect sur Google Play Store et ouvrez-la.
2. L'écran ressemble à ci-dessous. Les options utiles pour ce projet seront «Scan», «Scanner» et «Info» lorsque des appareils seront trouvés.
L' option 'Scan' sera utilisée pour voir toutes les iBeacons disponibles. Pour commencer à rechercher l'iBeacon, déroulez l'écran ou accédez à l'option «Scan» dans le coin supérieur droit de l'écran. Cela lancera la recherche des iBeacons disponibles.
3.Après avoir recherché l'iBeacon, vous pourrez voir le RSSI, l'UUID, le majeur et le mineur d'iBeacon. Le RSSI changera si vous éloignez le mobile ou l'iBeacon l'un de l'autre. Ici, dans cet écran, le RSSI est (-37). En dehors de cela, il existe des détails tels que le nom de société factice, le type de périphérique, la longueur des octets, le nom local d'ESP32. Ici, il s'agit de « ESP32 comme iBeacon ». Vous pouvez modifier le nom local dans l'esquisse.
4. Après avoir retiré le smartphone d'iBeacon, la valeur RSSI passe de -37 à -58. Ces valeurs continueront à changer si vous déplacez l'un des appareils.
Les valeurs acceptables du signal RSSI sont les suivantes:
Force du signal | TL; DR | Requis pour | |
---|---|---|---|
-30 dBm | Incroyable | Force de signal maximale réalisable. Le client ne peut être qu'à quelques mètres de l'AP pour y parvenir. Pas typique ou souhaitable dans le monde réel. | N / A |
-67 dBm | Très bon | Force de signal minimale pour les applications qui nécessitent une livraison très fiable et rapide de paquets de données. | VoIP / VoWiFi, vidéo en streaming |
-70 dBm | d'accord | Force minimale du signal pour une livraison fiable des paquets. | Courriel, Web |
-80 dBm | Pas bon | Force de signal minimale pour la connectivité de base. La livraison des paquets peut ne pas être fiable. | N / A |
-90 dBm | Inutilisable | Approche ou noyade dans le bruit de fond. Toute fonctionnalité est hautement improbable. | N / A |
Programmation d'ESP32 pour fonctionner comme BLE iBeacon
Un exemple de programme d'ESP32 BLE iBeacon est disponible lorsque vous installez la carte ESP32 dans Arduino IDE. Mais nous avons légèrement édité cette esquisse dans ce tutoriel, la version éditée complète de l'exemple de programme est donnée à la fin de ce tutoriel.
Pour ouvrir l'exemple de programme de ESP32 BLE_iBeacon, suivez simplement les étapes ci-dessous.
- Ouvrez Arduino IDE et sélectionnez «ESP32 Dev Module». (Si vous ne trouvez pas cette carte, veuillez vérifier si vous avez installé le package de carte ESP32)
- Allez dans Fichier > Exemples > ESP32 BLE Arduino > BLE_iBeacon
- Ouvrez «BLE_iBeacon» Sketch.
Maintenant, il y a une légère modification dans le code qui est effectuée dans ce tutoriel. Le nom ESP32 sera également mis à jour dans cette esquisse. Commencez donc par inclure les bibliothèques nécessaires qui seront utilisées dans la création de BLE Server et d'iBeacon.
#include "sys / time.h"
Il s'agit d'une bibliothèque de temps pour obtenir l'heure actuelle du système. Il contient des fonctions telles que tv_sec, gettimeofday () etc. Pour plus d'informations, vous pouvez visiter la version UNIX officielle de ' sys / time.h'.
Ensuite, les bibliothèques ESP32 BLE sont incluses et contiennent de nombreuses fonctions utilisées pour créer ESP32 dans différentes configurations telles que BLE Client ou BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
La bibliothèque iBeacon est incluse, ce qui définit l'ESP32 comme iBeacon. Parallèlement à cela, la bibliothèque de sommeil profond est incluse pour ESP32. La bibliothèque sera utilisée pour envoyer ESP32 en mode veille profonde pendant une période de temps définie.
#include "BLEBeacon.h" #include "esp_sleep.h"
Définissez la durée de veille pour ESP32. Ici, l'ESP32 sera en sommeil profond pendant 10 secondes et il fera de la publicité, puis passera à nouveau en sommeil profond pendant 10 secondes.
#define GPIO_DEEP_SLEEP_DURATION 10
Ici, le RTC_DATA_ATTR est défini. Notez que si vous définissez une variable globale avec l'attribut RTC_DATA_ATTR, la variable sera placée dans la mémoire RTC_SLOW_MEM. Ainsi, la structure déclarée comme RTC_DATA_ATTR et la copie de la mémoire dynamique dans cette structure avant un sommeil profond aide à récupérer cela dans la mémoire dynamique après le réveil. En termes simples, nous économisons le temps dans la mémoire statique de la mémoire dynamique pour le récupérer à nouveau après un sommeil profond. Ici, les deux variables sont définies. Le « dernier » est utilisé pour obtenir la dernière fois que l'ESP32 est passé en veille profonde et que bootcount est utilisé pour compter le nombre de réinitialisations.
RTC_DATA_ATTR statique time_t last; RTC_DATA_ATTR static uint32_t bootcount;
Définissez ensuite le type de publicité BLE. La définition se fait comme suit.
BLEAdvertising * pAdvertising;
La valeur temporelle est définie comme une structure permettant d'accéder à l'heure actuelle.
struct timeval maintenant;
L'UUID est également défini. Les UUID peuvent être générés à partir de ce lien .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Créez maintenant une fonction qui contiendra des attributs iBeacon tels que UUID, Major, Minor, Etc. Dans cette fonction, créez une instance pour BLE comme iBeacon et définissez un faux ID de fabricant, UUID, majeur et mineur pour ESP32 comme iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Définissez l'indicateur sur 0x04 pour qu'il affiche BrEdrNotSupported dans le scanner.
oData.setFlags (0x04);
Définissez les données publicitaires pour la publication.
std:: string strServiceData = "";
Ajoutez la chaîne l'une après l'autre pour faire de la publicité.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Tapez strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Démarrez la publicité en publiant des données.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Commencez le moniteur série à un débit de 115 200 bauds et obtenez l'heure. Incrémentez également le bootcount pour stocker le nombre de réinitialisations.
Serial.begin (115200); gettimeofday (& maintenant, NULL); Serial.printf ("démarrer ESP32% d \ n", bootcount ++);
Stockez l'heure actuelle dans la mémoire statique.
dernier = maintenant.tv_sec;
Créez un appareil BLE et nommez-le comme vous le souhaitez. Ici, l'ESP32 est nommé « ESP2 as iBeacon ». Notez que le, les noms peuvent être longs mais cette version de code a démarré la prise en charge des noms longs.
BLEDevice:: init ("ESP32 comme iBeacon");
Créez un serveur BLE pour faire de la publicité et démarrer.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Réglez ensuite l'ESP32 en mode iBeacon.
setBeacon ();
Commencez à faire de la publicité, puis arrêtez la publicité et endormez-vous profondément pendant 10 secondes.
pPublicité-> début (); pPublicité-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Enfin, branchez la carte de développement ESP32 avec votre ordinateur portable à l'aide d'un câble micro USB et téléchargez le code dans ESP32 à l'aide de l'IDE Arduino. Ouvrez ensuite l' application Android nRF Connect sur votre smartphone et lancez la numérisation. Vous trouverez ESP32 comme diffusion iBeacon comme indiqué dans l'image ci-dessous:
C'est ainsi qu'ESP32 peut être utilisé comme balise BLE pour annoncer UUID, majeur et mineur. Si vous souhaitez en savoir plus sur iBeacon, suivez notre précédent tutoriel sur HM10 en tant qu'iBeacon. Aussi, si vous avez le moindre doute, commentez ci-dessous ou posez des questions dans les forums.
Le code complet avec une vidéo de travail est donné ci-dessous.
/>