Ciao a tutti,
sono uno studente universitario e mi sono avvicinato da poco ad arduino. Premetto che conosco molto poco di questo mondo ma è un argomento che mi ha sempre entusiasmato.
Sto facendo un progetto utilizzando un microprocessore Adafruit nRF52832 (Introduction | Bluefruit nRF52 Feather Learning Guide | Adafruit Learning System - link della scheda), utilizzando il bluetooth e in particolare la modalità Beacon. La scheda deve interagire con un altro dispositivo (in questo caso un app di un tablet) e regolare l'intensità luminosa di un led in base alla distanza.
Dato che il mio professore mi ha detto che per controllare la distanza devo utilizzare l'RSSI, sono arrivato a questo punto con il codice:
#include <bluefruit.h> //includo la libreria adafruit
#define MANUFACTURER_ID 0X0059 //definisce l'ID dell'azienda Nordic Semiconductor ASA ripreso da questo sito
//https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers/
uint8_t beaconUuid[16] = //Codice UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
{
0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48, 0xD2,
0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0,
};
BLEBeacon beacon(beaconUuid, 0x0001, 0x0000, -80); //Un pacchetto Beacon valido è costituito dalle seguenti informazioni: UUID, Major, Minor, RSSI @ 1M
//L'RSSI = -54 equivale alla distanza di circa 1 metro
void setup()
{
Serial.begin(115200); //Imposta la velocità dei dati in bit al secondo per la trasmissione dei dati
Serial.println("Connessione Beacon Bluefruit52"); //Scrive sul monitor seriale quello tra le virgole, che potrebbe essere anche superfluo
Bluefruit.begin();
Bluefruit.setName("Bluefruit52");
beacon.setManufacturer(MANUFACTURER_ID); //L'ID del produttore è richiesto per i dati specifici del produttore
setupAdv(); //Imposta il pacchetto pubblicitario
Bluefruit.Advertising.start(); //Inizia a fare pubblicità
/* Start Central Scanning
* - Enable auto scan if disconnected
* - Filter out packet with a min rssi
* - Interval = 100 ms, window = 50 ms
* - Use active scan (used to retrieve the optional scan response adv packet)
* - Start(0) = will scan forever since no timeout is given
*/
Bluefruit.Scanner.setRxCallback(scan_callback);
Bluefruit.Scanner.restartOnDisconnect(true);
Bluefruit.Scanner.filterRssi(-80);
//Bluefruit.Scanner.filterUuid(BLEUART_UUID_SERVICE); // only invoke callback if detect bleuart service
Bluefruit.Scanner.setInterval(160, 80); // in units of 0.625 ms
Bluefruit.Scanner.useActiveScan(true); // Request scan response data
Bluefruit.Scanner.start(0); // 0 = Don't stop scanning after n seconds
Serial.println("Scanning ...");
}
void setupAdv(void)
{
Bluefruit.Advertising.setBeacon(beacon);
Bluefruit.ScanResponse.addName();
}
void scan_callback(ble_gap_evt_adv_report_t* report)
{
/* RSSI value */
Serial.printf("%14s %d dBm\n", "RSSI", report->rssi);
}
void loop()
{
digitalToggle(LED_BUILTIN); //Attiva il LED ogni secondo
delay(1000);
}
con questo riesco a connettere il dispositivo al tablet da cui riesco a vedere l'intensità del segnale RSSI, inoltre da questa funzione in poi
Bluefruit.Scanner.setRxCallback(scan_callback);
riesco a stampare sul monitor seriale il segnale RSSI in quel momento.
La mia domanda è: come faccio ad estrapolare quel valore RSSI che mi esce dal monitor seriale per poi associarlo ad un led? come posso ricavare il valore RSSI ogni tot secondi e non solamente all'avvio del dispositivo?
Grazie per la disponibilità.