- Componenten vereist
- Met behulp van de nRF Connect Android-app voor ESP32 iBeacon
- ESP32 programmeren om te werken als BLE iBeacon
ESP32 is echt een krachtig IoT-apparaat met ingebouwde ondersteuning voor Bluetooth en WiFi. De ESP32 is een geavanceerde versie van zijn voorganger ESP8266 met extra features zoals RAM, ROM, GPIO Pins etc. De ESP32 module ondersteunt zowel klassieke Bluetooth als Bluetooth Low Energy (BLE), de klassieke Bluetooth kan gebruikt worden om liedjes of bestanden over te zetten en de BLE optie kan worden gebruikt voor batterij-geoptimaliseerde toepassingen zoals Bluetooth-bakens, fitnessbanden, nabijheidssystemen enz. Het is ook mogelijk om ESP32 te gebruiken als een seriële Bluetooth zoals de HC-05 of HC-06 modules voor eenvoudige microcontrollerprojecten.
Zoals we weten, kan de BLE in twee verschillende modi werken: servermodus en clientmodus. Beide modi zijn besproken in onze vorige ESP32-zelfstudies:
- ESP32 BLE-server - GATT-service voor indicatie van batterijniveau
- ESP32 BLE Client - Verbinding maken met fitnessband om een lamp te activeren
In deze tutorial zullen we een BLE iBeacon bouwen met behulp van ESP32 waarbij ESP32 zal fungeren als server en smartphone als client. Ik neem aan dat je al bekend bent met het gebruik van het ESP32-bord met Arduino IDE, zo niet, val dan terug op de tutorial Aan de slag met ESP32.
U kunt ook meer weten over wat Beacon / iBeacon-technologie is door onze eerdere Bluetooth iBeacon-projecten te doorlopen met Raspberry Pi en HM-10 BLE iBeacon.
Componenten vereist
Hardware:
- ESP32-ontwikkelbord
- Micro USB-kabel
Software:
- Arduino IDE
- Android-app: nRF Connect voor mobiel (door Nordic Semiconductor)
Er zijn veel BLE-scanner-apps, waarvan we er één hebben gebruikt in ons vorige project van How to Use HM-10 BLE Module with Arduino. Deze BLE-scanner-app biedt een goede grafische interface (GUI) maar mist aanvullende informatie, dus in dit project gebruiken we de NRF Connect for Mobile-app.
Met behulp van de nRF Connect Android-app voor ESP32 iBeacon
1. Download de nRF Connect-app van Google Play Store en open deze.
2. Het scherm ziet er als volgt uit. De nuttige opties voor dit project zijn 'Scannen', 'Scanner' en 'Info' wanneer apparaten worden gevonden.
De optie 'Scannen' wordt gebruikt om alle beschikbare iBeacons te zien. Om te beginnen met zoeken naar de iBeacon, trekt u het scherm omlaag of gaat u naar de optie 'Scannen' in de rechterbovenhoek van het scherm. Dit zal beginnen met zoeken naar de beschikbare iBeacons.
3.Nadat u de iBeacon hebt doorzocht, kunt u de RSSI, UUID, Major en Minor van iBeacon zien. De RSSI verandert als je de gsm of iBeacon uit elkaar haalt. Hier in dit scherm is de RSSI (-37). Behalve dit zijn er enkele details zoals Dummy Company Name, Device Type, Length of the Bytes, The Local Name of ESP32. Hier is het " ESP32 als iBeacon ". U kunt de lokale naam in de schets wijzigen.
4. Nadat de smartphone van iBeacon is verwijderd, verandert de RSSI-waarde van -37 naar -58. Deze waarden blijven veranderen als u een van de apparaten verplaatst.
De aanvaardbare waarden van het RSSI-signaal zijn als volgt:
Signaalsterkte | TL; DR | Benodigd voor | |
---|---|---|---|
-30 dBm | Verbazingwekkend | Maximaal haalbare signaalsterkte. De klant kan maar een paar meter van het AP verwijderd zijn om dit te bereiken. Niet typisch of wenselijk in de echte wereld. | Nvt |
-67 dBm | Zeer goed | Minimale signaalsterkte voor applicaties die een zeer betrouwbare, tijdige levering van datapakketten vereisen. | VoIP / VoWiFi, streaming video |
-70 dBm | Oke | Minimale signaalsterkte voor betrouwbare pakketbezorging. | E-mail, internet |
-80 dBm | Niet goed | Minimale signaalsterkte voor basisconnectiviteit. Pakketbezorging kan onbetrouwbaar zijn. | Nvt |
-90 dBm | Onbruikbaar | Naderen of verdrinken in de noise-floor. Elke functionaliteit is hoogst onwaarschijnlijk. | Nvt |
ESP32 programmeren om te werken als BLE iBeacon
Er is een voorbeeldprogramma van ESP32 BLE iBeacon beschikbaar wanneer u het ESP32-bord in Arduino IDE installeert. Maar we hebben deze sketch in deze tutorial enigszins aangepast, de volledige bewerkte versie van het voorbeeldprogramma wordt aan het einde van deze tutorial gegeven.
Volg onderstaande stappen om het voorbeeldprogramma van ESP32 BLE_iBeacon te openen.
- Open Arduino IDE en selecteer "ESP32 Dev Module". (Als u dit bord niet kunt vinden, controleer dan of u het ESP32-bordpakket hebt geïnstalleerd)
- Ga naar Bestand > Voorbeelden > ESP32 BLE Arduino > BLE_iBeacon
- Open de schets "BLE_iBeacon".
Nu is er een kleine wijziging in de code die in deze tutorial wordt gedaan. De ESP32-naam wordt ook bijgewerkt in deze schets. Dus begin met het opnemen van de benodigde bibliotheken die zullen worden gebruikt bij het maken van BLE-server en iBeacon.
#inclusief "sys / time.h"
Dit is een tijdbibliotheek om de huidige systeemtijd op te halen. Dit bevat functies zoals tv_sec, gettimeofday () etc. Voor meer informatie kun je de officiële UNIX-uitgave van ' sys / time.h' bezoeken.
Vervolgens zijn de ESP32 BLE-bibliotheken inbegrepen die veel functies bevatten die worden gebruikt om ESP32 in verschillende configuraties te maken, zoals BLE Client of BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
De iBeacon-bibliotheek is inbegrepen die de ESP32 instelt als iBeacon. Daarnaast is de diepe slaapbibliotheek inbegrepen voor ESP32. De bibliotheek wordt gebruikt om ESP32 gedurende een bepaalde tijd in diepe slaapstand te sturen.
#include "BLEBeacon.h" #include "esp_sleep.h"
Definieer de slaapduur voor ESP32. Hier zal de ESP32 gedurende 10 seconden in diepe slaap zijn en zal hij adverteren en dan opnieuw gedurende 10 seconden in diepe slaap gaan.
# definiëren GPIO_DEEP_SLEEP_DURATION 10
Hier wordt de RTC_DATA_ATTR gedefinieerd. Merk op dat als u een globale variabele definieert met het RTC_DATA_ATTR-attribuut, de variabele in het RTC_SLOW_MEM-geheugen wordt geplaatst. Dus de structuur gedeclareerd als RTC_DATA_ATTR en het kopiëren van het dynamische geheugen naar deze structuur voor een diepe slaap helpt om dit na het ontwaken in het dynamische geheugen te herstellen. In eenvoudige bewoordingen besparen we de tijd in het statische geheugen uit het dynamische geheugen om het na een diepe slaap weer te herstellen. Hier worden de twee variabelen gedefinieerd. De ' laatste ' wordt gebruikt om de laatste keer dat de ESP32 in diepe slaap is gegaan te krijgen en bootcount wordt gebruikt om het aantal resets te tellen.
RTC_DATA_ATTR statische time_t last; RTC_DATA_ATTR statische uint32_t bootcount;
Vervolgens bepalen de BLE Advertising Type. De definitie is als volgt gedaan.
BLEAdvertising * pAdvertising;
De tijdwaarde wordt gedefinieerd als een structuur om toegang te krijgen tot de huidige tijd.
struct timeval nu;
Ook de UUID is gedefinieerd. Via deze link kunnen de UUID's worden gegenereerd .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Maak nu een functie die iBeacon-attributen zal bevatten zoals UUID, Major, Minor, enz. In deze functie maak je een instantie voor BLE als iBeacon, en stel je een nepfabrikant-ID, UUID, major en minor in voor ESP32 als iBeacon.
leegte setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Stel de vlag in op 0x04 zodat BrEdrNotSupported in de scanner wordt uitgevoerd.
oData.setFlags (0x04);
Stel advertentiegegevens in voor publicatie.
std:: string strServiceData = "";
Voeg de string een voor een toe om te adverteren.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Typ strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Start de reclame door gegevens te publiceren.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Begin de seriële monitor met een baudrate van 115200 en verkrijg de tijd. Verhoog ook de opstarttelling om het aantal resets op te slaan.
Serial.begin (115200); gettimeofday (& nu, NULL); Serial.printf ("start ESP32% d \ n", bootcount ++);
Sla de huidige tijd op in het statische geheugen.
last = nu.tv_sec;
Maak een BLE-apparaat en geef het een naam zoals u wilt. Hier wordt de ESP32 genoemd als " ESP2 als iBeacon ". Merk op dat de namen lang kunnen zijn, maar deze versie van de code heeft de ondersteuning voor lange namen gestart.
BLEDevice:: init ("ESP32 als iBeacon");
Maak een BLE-server om te adverteren en te starten.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Zet de ESP32 vervolgens in iBeacon-modus.
setBeacon ();
Begin met adverteren, stop dan met adverteren en ga 10 seconden in diepe slaap.
pAdvertising-> start (); pAdvertising-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Sluit ten slotte het ESP32-ontwikkelbord aan op uw laptop met behulp van een micro-USB-kabel en upload de code naar ESP32 met behulp van Arduino IDE. Open vervolgens de nRF Connect Android-app op uw smartphone en begin met scannen. U vindt ESP32 als iBeacon- uitzending zoals weergegeven in de onderstaande afbeelding:
Dit is hoe ESP32 kan worden gebruikt als BLE Beacon om UUID, Major en Minor te adverteren. Als je meer wilt weten over iBeacon, volg dan onze vorige tutorial over HM10 als iBeacon. Ook als je twijfelt, reageer dan hieronder of stel vragen in forums.
Volledige code met een werkende video wordt hieronder gegeven.
/>