如何使用esp32提高信标扫描采样率

时间:2019-02-26 16:56:15

标签: bluetooth-lowenergy arduino-ide esp32

我使用esp32通过信标的rssi检测信标,但是遇到了一些问题,首先是rssi值不稳定,因此我需要更多的rssi样本,第二个问题是esp32扫描采样率太慢,那么快速度只有一秒钟的扫描速度,下面是我使用的代码

#include <BLEAdvertisedDevice.h>
#include <BLEDevice.h>
#include <BLEScan.h>

const int PIN = 2;
const int CUTOFF = -60;

void setup() {
pinMode(PIN, OUTPUT);
BLEDevice::init("");
}

void loop() {
BLEScan *scan = BLEDevice::getScan();
scan->setActiveScan(true);
BLEScanResults results = scan->start(1);
int best = CUTOFF;
for (int i = 0; i < results.getCount(); i++) 
{
BLEAdvertisedDevice device = 
results.getDevice(i);
int rssi = device.getRSSI();
if (rssi > best) {
  best = rssi;
 }
}
digitalWrite(PIN, best > CUTOFF ? HIGH : 
LOW);
}

但是我想记住rssi示例,我尝试将scan-> start(1)更改为scan-> start(0),但结果未返回,该怎么做才能解决较低的示例问题,或者使用另一块板子?

1 个答案:

答案 0 :(得分:0)

问题在于您需要完成循环中的所有“工作”。
您是否知道ESP32微控制器以240 MHz运行的事实
我想您的循环时间约为400纳秒。 那么您的设备如何知道是否找到了多少设备。
您正尝试在扫描开始后立即对扫描结果进行处理。
为了解决这个问题,在Arduino中为ESP32代码提供了一个BLEAdvertisedDeviceCallbacks。
此回调将为找到的每个设备返回结果。

以下是GITHUB的一个示例(Neil Kolban的ESP32_BLE_Arduino)https://github.com/nkolban/ESP32_BLE_Arduino/blob/master/examples/BLE_scan/BLE_scan.ino

/*
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets 
/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
Ported to Arduino ESP32 by Evandro Copercini
*/

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

int scanTime = 5; //In seconds
BLEScan* pBLEScan;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
  Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
}
};

void setup() {
Serial.begin(115200);
Serial.println("Scanning...");

BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results
//faster
pBLEScan->setInterval(100);
pBLEScan->setWindow(99);  // less or equal setInterval value
}

void loop() {
// put your main code here, to run repeatedly:
BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
Serial.print("Devices found: ");
Serial.println(foundDevices.getCount());
Serial.println("Scan done!");
pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
delay(2000);
}

这可以让您了解其工作原理,并对其进行调整以满足自己的需求。