- Erforderliche Komponenten
- Verwenden der nRF Connect Android App für ESP32 iBeacon
- Programmieren von ESP32 als BLE iBeacon
ESP32 ist wirklich ein leistungsstarkes IoT-Gerät mit integrierter Unterstützung für Bluetooth und WiFi. Der ESP32 ist eine erweiterte Version seines Vorgängers ESP8266 mit zusätzlichen Funktionen wie RAM, ROM, GPIO-Pins usw. Das ESP32-Modul unterstützt sowohl klassisches Bluetooth als auch Bluetooth Low Energy (BLE). Das klassische Bluetooth kann zum Übertragen von Songs oder Dateien und der BLE verwendet werden Die Option kann für batterieoptimierte Anwendungen wie Bluetooth-Beacons, Fitnessbänder, Proximity-Anwendungen usw. verwendet werden. Es ist auch möglich, ESP32 als serielles Bluetooth wie die HC-05- oder HC-06-Module für einfache Mikrocontroller-Projekte zu verwenden.
Wie wir wissen, kann die BLE in zwei verschiedenen Modi betrieben werden - im Servermodus und im Clientmodus. Beide Modi wurden in unseren vorherigen ESP32-Tutorials erläutert:
- ESP32 BLE Server - GATT-Dienst zur Anzeige des Batteriestands
- ESP32 BLE Client - Verbindung zum Fitnessband herstellen, um eine Glühbirne auszulösen
In diesem Tutorial erstellen wir einen BLE iBeacon mit ESP32, wobei ESP32 als Server und das Smartphone als Client fungiert. Ich gehe davon aus, dass Sie bereits mit der Verwendung der ESP32-Karte mit Arduino IDE vertraut sind, wenn Sie nicht auf die ersten Schritte mit dem ESP32-Lernprogramm zurückgreifen.
Sie können auch mehr über die Beacon / iBeacon-Technologie erfahren, indem Sie unsere vorherigen Bluetooth iBeacon-Projekte mit Raspberry Pi und HM-10 BLE iBeacon durchgehen.
Erforderliche Komponenten
Hardware:
- ESP32 Development Board
- Micro-USB-Kabel
Software:
- Arduino IDE
- Android App: nRF Connect für Handys (von Nordic Semiconductor)
Es gibt viele BLE-Scanner-Apps, eine davon haben wir in unserem vorherigen Projekt zur Verwendung des HM-10-BLE-Moduls mit Arduino verwendet. Diese BLE-Scanner-App bietet eine gute grafische Oberfläche (GUI), es fehlen jedoch zusätzliche Informationen, sodass wir in diesem Projekt die NRF Connect for Mobile-App verwenden.
Verwenden der nRF Connect Android App für ESP32 iBeacon
1. Laden Sie die nRF Connect-App aus dem Google Play Store herunter und öffnen Sie sie.
2. Der Bildschirm sieht wie folgt aus. Die nützlichen Optionen für dieses Projekt sind "Scannen", "Scanner" und "Info", wenn Geräte gefunden werden.
Mit der Option "Scannen" werden alle verfügbaren iBeacons angezeigt. Um mit der Suche nach dem iBeacon zu beginnen, ziehen Sie entweder den Bildschirm herunter oder gehen Sie zur Option "Scannen" in der oberen rechten Ecke des Bildschirms. Dadurch wird nach den verfügbaren iBeacons gesucht.
3.Nach dem Durchsuchen des iBeacon können Sie RSSI, UUID, Major und Minor von iBeacon anzeigen. Der RSSI ändert sich, wenn Sie das Mobiltelefon oder den iBeacon voneinander entfernen. Hier in diesem Bildschirm ist der RSSI (-37). Abgesehen davon gibt es einige Details wie Dummy-Firmenname, Gerätetyp, Länge der Bytes, den lokalen Namen von ESP32. Hier ist es " ESP32 als iBeacon ". Sie können den lokalen Namen in der Skizze ändern.
4. Nach dem Entfernen des Smartphones von iBeacon ändert sich der RSSI-Wert von -37 auf -58. Diese Werte ändern sich ständig, wenn Sie eines der Geräte bewegen.
Die akzeptablen Werte für das RSSI-Signal sind wie folgt:
Signalstärke | TL; DR | Benötigt für | |
---|---|---|---|
-30 dBm | Tolle | Maximal erreichbare Signalstärke. Der Client kann nur wenige Meter vom AP entfernt sein, um dies zu erreichen. In der realen Welt nicht typisch oder wünschenswert. | N / A |
-67 dBm | Sehr gut | Minimale Signalstärke für Anwendungen, die eine sehr zuverlässige und zeitnahe Zustellung von Datenpaketen erfordern. | VoIP / VoWiFi, Video-Streaming |
-70 dBm | okay | Minimale Signalstärke für zuverlässige Paketzustellung. | E-Mail, Web |
-80 dBm | Nicht gut | Minimale Signalstärke für grundlegende Konnektivität. Die Paketzustellung kann unzuverlässig sein. | N / A |
-90 dBm | Unbrauchbar | Annäherung oder Ertrinken im Grundrauschen. Eine Funktionalität ist höchst unwahrscheinlich. | N / A |
Programmieren von ESP32 als BLE iBeacon
Bei der Installation der ESP32-Karte in Arduino IDE ist ein Beispielprogramm für ESP32 BLE iBeacon verfügbar. Wir haben diese Skizze in diesem Tutorial jedoch leicht bearbeitet. Die vollständig bearbeitete Version des Beispielprogramms finden Sie am Ende dieses Tutorials.
Befolgen Sie zum Öffnen des Beispielprogramms von ESP32 BLE_iBeacon die folgenden Schritte.
- Öffnen Sie die Arduino IDE und wählen Sie "ESP32 Dev Module". (Wenn Sie diese Karte nicht finden, überprüfen Sie bitte, ob Sie das ESP32-Kartenpaket installiert haben.)
- Gehen Sie zu Datei > Beispiele > ESP32 BLE Arduino > BLE_iBeacon
- Öffnen Sie die Skizze „BLE_iBeacon“.
Jetzt gibt es eine geringfügige Änderung im Code, die in diesem Tutorial vorgenommen wird. Der ESP32-Name wird in dieser Skizze ebenfalls aktualisiert. Beginnen Sie also mit der Aufnahme der erforderlichen Bibliotheken, die beim Erstellen von BLE Server und iBeacon verwendet werden.
#include "sys / time.h"
Dies ist eine Zeitbibliothek, um die aktuelle Systemzeit abzurufen. Dies enthält Funktionen wie tv_sec, gettimeofday () usw. Weitere Informationen finden Sie in der offiziellen UNIX-Version von ' sys / time.h'.
Dann sind die ESP32-BLE-Bibliotheken enthalten, die viele Funktionen enthalten, mit denen ESP32 in verschiedenen Konfigurationen wie BLE-Client oder BLE-Server erstellt wird.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
Die iBeacon-Bibliothek ist enthalten, mit der der ESP32 als iBeacon festgelegt wird. Zusammen mit diesem ist die Tiefschlafbibliothek für ESP32 enthalten. Die Bibliothek wird verwendet, um ESP32 für einen definierten Zeitraum im Tiefschlafmodus zu senden.
#include "BLEBeacon.h" #include "esp_sleep.h"
Definieren Sie die Schlafdauer für ESP32. Hier befindet sich der ESP32 10 Sekunden lang im Tiefschlaf und wirbt für 10 Sekunden im Tiefschlaf.
# GPIO_DEEP_SLEEP_DURATION definieren 10
Hier wird der RTC_DATA_ATTR definiert. Beachten Sie, dass beim Definieren einer globalen Variablen mit dem Attribut RTC_DATA_ATTR die Variable im Speicher RTC_SLOW_MEM abgelegt wird. Die als RTC_DATA_ATTR deklarierte Struktur und das Kopieren des dynamischen Speichers in diese Struktur vor einem Tiefschlaf hilft also, diesen nach dem Aufwachen in den dynamischen Speicher wiederherzustellen. Mit einfachen Worten, wir sparen die Zeit im statischen Speicher aus dem dynamischen Speicher, um sie nach einem tiefen Schlaf wieder herzustellen. Hier werden die beiden Variablen definiert. Das ' Letzte ' wird verwendet, um das letzte Mal abzurufen, wenn der ESP32 in den Tiefschlaf ging und die Anzahl der Zurücksetzungen beim Bootcount verwendet wurde.
RTC_DATA_ATTR static time_t last; RTC_DATA_ATTR static uint32_t bootcount;
Dann definieren die BLE Werbung Typ. Die Definition erfolgt wie folgt.
BLEAdvertising * pAdvertising;
Der Zeitwert ist als Struktur für den Zugriff auf die aktuelle Zeit definiert.
struct timeval now;
Auch die UUID ist definiert. Die UUIDs können über diesen Link generiert werden .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Erstellen Sie nun eine Funktion, die iBeacon-Attribute wie UUID, Major, Minor usw. enthält. Erstellen Sie in dieser Funktion eine Instanz für BLE als iBeacon und legen Sie eine gefälschte Hersteller-ID, UUID, Major und Minor für ESP32 als iBeacon fest.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (Bootcount & 0xFFFF);
Setzen Sie das Flag auf 0x04, damit BrEdrNotSupported im Scanner ausgegeben wird.
oData.setFlags (0x04);
Werbedaten für die Veröffentlichung festlegen.
std:: string strServiceData = "";
Fügen Sie die Zeichenfolge nacheinander hinzu, um Werbung zu machen.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Typ strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Starten Sie die Werbung, indem Sie Daten veröffentlichen.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Starten Sie den seriellen Monitor mit einer Baudrate von 115200 und holen Sie sich die Zeit. Erhöhen Sie auch die Startanzahl , um die Anzahl der Zurücksetzungen zu speichern.
Serial.begin (115200); gettimeofday (& jetzt NULL); Serial.printf ("ESP32% d \ n starten", bootcount ++);
Speichern Sie die aktuelle Uhrzeit im statischen Speicher.
last = now.tv_sec;
Erstellen Sie ein BLE-Gerät und benennen Sie es nach Ihren Wünschen. Hier wird der ESP32 als " ESP2 als iBeacon " bezeichnet. Beachten Sie, dass die Namen lang sein können, diese Codeversion jedoch die Unterstützung für lange Namen gestartet hat.
BLEDevice:: init ("ESP32 als iBeacon");
Erstellen Sie einen BLE-Server, um Werbung zu machen und zu starten.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Stellen Sie dann den ESP32 in den iBeacon-Modus.
setBeacon ();
Starten Sie die Werbung, beenden Sie die Werbung und schlafen Sie 10 Sekunden lang tief ein.
pAdvertising-> start (); pWerbung-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Schließen Sie schließlich das ESP32-Entwicklungsboard mit einem Micro-USB-Kabel an Ihren Laptop an und laden Sie den Code mithilfe der Arduino IDE in ESP32 hoch. Öffnen Sie dann die nRF Connect Android App auf Ihrem Smartphone und starten Sie den Scanvorgang. Sie finden ESP32 als iBeacon- Broadcast, wie im folgenden Bild gezeigt:
Auf diese Weise kann ESP32 als BLE-Beacon verwendet werden, um für UUID, Major und Minor zu werben. Wenn Sie mehr über iBeacon erfahren möchten, folgen Sie unserem vorherigen Tutorial zu HM10 als iBeacon. Auch wenn Sie irgendwelche Zweifel haben, dann kommentieren Sie unten oder stellen Sie Fragen in Foren.
Der vollständige Code mit einem Arbeitsvideo ist unten angegeben.
/>