如何使用esp32增加信标扫描采样率

问题描述 投票:0回答:1

我使用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);
}

但是我想要mor rssi样本,我试过改变scan-> start(1)来扫描 - > start(0),但结果是不返回,怎么办可以解决下样本问题,还是使用另一块板?

bluetooth-lowenergy arduino-ide esp32
1个回答
0
投票

问题是你在循环中完成了所有的“工作”。 您是否意识到ESP32微控制器的运行频率为240 MHz 我猜你的循环时间大约是400纳秒。那么您的设备将如何知道是否以及找到了多少设备。 扫描开始后,您正尝试对扫描结果执行某些操作。 为了解决这个问题,在Arduino for 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);
}

这可以让您了解它的工作原理,调整它以满足您自己的需求。

© www.soinside.com 2019 - 2024. All rights reserved.