- Componenti richiesti
- Utilizzo dell'app Android nRF Connect per ESP32 iBeacon
- Programmazione di ESP32 per funzionare come BLE iBeacon
ESP32 è davvero un potente dispositivo IoT con supporto integrato per Bluetooth e WiFi. L'ESP32 è la versione avanzata del suo predecessore ESP8266 con funzionalità extra come RAM, ROM, GPIO Pin ecc. Il modulo ESP32 supporta sia il classico Bluetooth che il Bluetooth Low Energy (BLE), il classico Bluetooth può essere utilizzato per trasferire canzoni o file e il BLE opzione può essere utilizzata per applicazioni ottimizzate per la batteria come beacon Bluetooth, bande fitness, prossimità ecc. È anche possibile utilizzare ESP32 come Bluetooth seriale come i moduli HC-05 o HC-06 per semplici progetti di microcontrollori.
Come sappiamo, BLE può funzionare in due diverse modalità: modalità Server e modalità Client. Entrambe le modalità sono state discusse nei nostri precedenti tutorial ESP32:
- Server ESP32 BLE - Servizio GATT per l'indicazione del livello della batteria
- Client ESP32 BLE - Collegamento a Fitness Band per attivare una lampadina
In questo tutorial costruiremo un BLE iBeacon usando ESP32 dove ESP32 fungerà da server e lo smartphone agirà da client. Presumo che tu abbia già familiarità su come utilizzare la scheda ESP32 con l'IDE di Arduino, se non tornare al tutorial per iniziare con ESP32.
Puoi anche saperne di più su cos'è la tecnologia Beacon / iBeacon passando attraverso i nostri precedenti progetti Bluetooth iBeacon utilizzando Raspberry Pi e HM-10 BLE iBeacon.
Componenti richiesti
Hardware:
- Scheda di sviluppo ESP32
- Cavo micro USB
Software:
- IDE Arduino
- App Android: nRF Connect for Mobile (di Nordic Semiconductor)
Esistono molte app per scanner BLE, una delle quali abbiamo utilizzato nel nostro precedente progetto di How to Use HM-10 BLE Module with Arduino. Questa app per scanner BLE fornisce una buona interfaccia grafica (GUI) ma manca di ulteriori informazioni, quindi in questo progetto utilizziamo l' app NRF Connect per dispositivi mobili.
Utilizzo dell'app Android nRF Connect per ESP32 iBeacon
1. Scarica l'app nRF Connect da Google Play Store e aprila.
2. Lo schermo appare come di seguito. Le opzioni utili per questo progetto saranno "Scansione", "Scanner" e "Informazioni" quando i dispositivi vengono trovati.
L' opzione "Scansione" verrà utilizzata per vedere tutti gli iBeacons disponibili. Per iniziare a cercare iBeacon, apri lo schermo verso il basso o vai all'opzione "Scansione" nell'angolo in alto a destra dello schermo. Questo inizierà a cercare gli iBeacons disponibili.
3.Dopo la ricerca in iBeacon, sarai in grado di vedere RSSI, UUID, Major e Minor di iBeacon. L'RSSI cambierà se allontanate il cellulare o l'iBeacon l'uno dall'altro. Qui in questa schermata, l'RSSI è (-37). Oltre a questo ci sono alcuni dettagli come il nome della società fittizia, il tipo di dispositivo, la lunghezza dei byte, il nome locale di ESP32. Eccolo " ESP32 as iBeacon ". È possibile modificare il nome locale nello schizzo.
4. Dopo aver rimosso lo smartphone da iBeacon, il valore RSSI cambia da -37 a -58. Questi valori continueranno a cambiare se si sposta uno dei dispositivi.
I valori accettabili del segnale RSSI sono i seguenti:
La potenza del segnale | TL; DR | Richiesto per | |
---|---|---|---|
-30 dBm | Sorprendente | Massima potenza del segnale raggiungibile. Il client può trovarsi solo a pochi metri dall'AP per ottenere questo risultato. Non tipico o desiderabile nel mondo reale. | N / A |
-67 dBm | Molto buona | Potenza minima del segnale per applicazioni che richiedono una consegna molto affidabile e tempestiva di pacchetti di dati. | VoIP / VoWiFi, streaming video |
-70 dBm | Va bene | Potenza minima del segnale per una consegna affidabile dei pacchetti. | E-mail, web |
-80 dBm | Non bene | Potenza minima del segnale per la connettività di base. La consegna dei pacchetti potrebbe non essere affidabile. | N / A |
-90 dBm | Inutilizzabile | Avvicinarsi o annegare nel rumore di fondo. Qualsiasi funzionalità è altamente improbabile. | N / A |
Programmazione di ESP32 per funzionare come BLE iBeacon
Esiste un programma di esempio di ESP32 BLE iBeacon disponibile quando si installa la scheda ESP32 in Arduino IDE. Ma abbiamo leggermente modificato questo schizzo in questo tutorial, la versione modificata completa del programma di esempio è fornita alla fine di questo tutorial.
Per aprire il programma di esempio di ESP32 BLE_iBeacon basta seguire i passaggi seguenti.
- Apri Arduino IDE e seleziona "ESP32 Dev Module". (Se non trovi questa scheda, controlla di aver installato il pacchetto della scheda ESP32)
- Vai a File > Esempi > ESP32 BLE Arduino > BLE_iBeacon
- Apri lo schizzo "BLE_iBeacon".
Ora c'è una leggera modifica nel codice che viene eseguita in questo tutorial. Anche il nome ESP32 verrà aggiornato in questo schizzo. Quindi inizia con l'inclusione delle librerie necessarie che verranno utilizzate nella creazione di BLE Server e iBeacon.
#include "sys / time.h"
Questa è una libreria dell'ora per ottenere l'ora corrente del sistema. Contiene funzioni come tv_sec, gettimeofday () ecc. Per ulteriori informazioni, puoi visitare la versione UNIX ufficiale di " sys / time.h".
Quindi sono incluse le librerie ESP32 BLE che contengono molte funzioni utilizzate per creare ESP32 in diverse configurazioni come BLE Client o BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
La libreria iBeacon è inclusa che imposta ESP32 come iBeacon. Insieme a questo, la libreria Deep Sleep è inclusa per ESP32. La libreria verrà utilizzata per inviare ESP32 in modalità di sospensione profonda per un periodo di tempo definito.
#include "BLEBeacon.h" #include "esp_sleep.h"
Definisci la durata del sonno per ESP32. Qui l'ESP32 sarà in modalità di sonno profondo per una durata di 10 secondi e farà pubblicità e poi andrà di nuovo in sonno profondo per 10 secondi.
#define GPIO_DEEP_SLEEP_DURATION 10
Qui è definito RTC_DATA_ATTR. Notare che se si definisce una variabile globale con l'attributo RTC_DATA_ATTR, la variabile verrà inserita nella memoria RTC_SLOW_MEM. Quindi la struttura dichiarata come RTC_DATA_ATTR e copiare la memoria dinamica su questa struttura prima di un sonno profondo aiuta a recuperarla nella memoria dinamica dopo il risveglio. In parole semplici stiamo risparmiando il tempo nella memoria statica dalla memoria dinamica per recuperarlo di nuovo dopo un sonno profondo. Qui vengono definite le due variabili. L '" ultimo " viene utilizzato per ottenere l'ultima volta in cui ESP32 è andato in modalità di sospensione profonda e il conteggio del boot viene utilizzato per contare il numero di ripristini.
RTC_DATA_ATTR statico time_t last; RTC_DATA_ATTR static uint32_t bootcount;
Quindi definire il tipo di pubblicità BLE. La definizione è fatta come segue.
BLEAdvertising * pAdvertising;
Il timeval è definito come struttura per accedere all'ora corrente.
struct timeval ora;
Anche l'UUID è definito. Gli UUID possono essere generati da questo collegamento .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Ora crea una funzione che conterrà attributi iBeacon come UUID, Major, Minor, Etc. In questa funzione crea un'istanza per BLE come iBeacon e imposta un falso ID produttore, UUID, major e minor per ESP32 come iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Impostare il flag come 0x04 in modo che emetta BrEdrNotSupported nello scanner.
oData.setFlags (0x04);
Imposta i dati pubblicitari per la pubblicazione.
std:: string strServiceData = "";
Aggiungi la stringa una dopo l'altra per pubblicizzare.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Digita strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Inizia la pubblicità pubblicando i dati.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Inizia il monitor seriale a 115200 baud rate e ottieni l'ora. Aumenta anche il conteggio di avvio per memorizzare il numero di ripristini.
Serial.begin (115200); gettimeofday (& now, NULL); Serial.printf ("avvia ESP32% d \ n", bootcount ++);
Memorizza l'ora corrente nella memoria statica.
last = now.tv_sec;
Crea un dispositivo BLE e chiamalo come desideri. Qui l'ESP32 è denominato " ESP2 as iBeacon ". Si noti che i nomi possono essere lunghi ma questa versione del codice ha avviato il supporto per i nomi lunghi.
BLEDevice:: init ("ESP32 as iBeacon");
Crea un server BLE per pubblicizzare e iniziare.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Quindi impostare ESP32 in modalità iBeacon.
setBeacon ();
Inizia a fare pubblicità, quindi interrompi la pubblicità e vai a dormire profondamente per 10 secondi.
pAdvertising-> start (); pAdvertising-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Infine collega la scheda di sviluppo ESP32 al tuo laptop utilizzando un cavo micro USB e carica il codice in ESP32 utilizzando l'IDE di Arduino. Quindi apri l' app Android nRF Connect sul tuo smartphone e avvia la scansione. Troverai ESP32 come trasmissione iBeacon come mostrato nell'immagine qui sotto:
Ecco come ESP32 può essere utilizzato come BLE Beacon per pubblicizzare UUID, Major e Minor. Se vuoi saperne di più su iBeacon, segui il nostro precedente tutorial su HM10 come iBeacon. Inoltre, se hai qualche dubbio, commenta qui sotto o fai domande nei forum.
Di seguito viene fornito il codice completo con un video funzionante.
/>