Как увеличить частоту выборки сканирования маяка, используя esp32 - PullRequest
0 голосов
/ 26 февраля 2019

Я использую 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);
}

, но я хочу больше образца, я попытался изменить scan-> start (1) на scan-> start (0), норезультат не возвращается, как это сделать, можно решить более низкую проблему с образцом или использовать другую доску?

1 Ответ

0 голосов
/ 26 февраля 2019

Проблема в том, что вы выполняете всю «работу» в цикле.
Вам известно о том, что микроконтроллер ESP32 работает на частоте 240 МГц
Я полагаю, что ваше время цикла составляет около 400 нано секунд.Итак, как ваше устройство узнает, найдено ли и сколько устройств.
Вы пытаетесь что-то сделать с результатами сканирования сразу после запуска сканирования.
Чтобы обойти эту проблему, в коде Arduino для ESP32 есть BLEAdvertisedDeviceCallbacks.
Этот обратный вызов вернет результат для каждого найденного устройства.

Вот пример из GITHUB (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);
}

Это, чтобы дать вамЧтобы понять, как это работает, настройте его в соответствии со своими потребностями.

...