我使用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),但结果未返回,该怎么做才能解决较低的示例问题,或者使用另一块板子?
答案 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);
}
这可以让您了解其工作原理,并对其进行调整以满足自己的需求。