-
Notifications
You must be signed in to change notification settings - Fork 8
/
BLE-detector.ino
106 lines (88 loc) · 3.45 KB
/
BLE-detector.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
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 <Arduino.h>
#include <sstream>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#define LED_ONBOARD 22
/* Duration of BLE scan
============== ============== ==============
= WINDOW = ===INTERVAL=== = WINDOW = ===INTERVAL=== = WINDOW =
============== ============== ==============
===============================================================================
= SCAN TIME =
===============================================================================
*/
#define SCAN_TIME 1 // seconds
#define INTERVAL_TIME 200 // (mSecs)
#define WINDOW_TIME 100 // less or equal setInterval value
BLEScan* pBLEScan;
String deviceName;
String deviceAddress;
int16_t deviceRSSI;
uint16_t countDevice;
boolean check;
int count_stable = 0;
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
/* unComment when you want to see devices found */
Serial.printf("Found device: %s \n", advertisedDevice.toString().c_str());
}
};
void setup() {
Serial.begin(115200);
Serial.println("BLEDevice init...");
pinMode(LED_ONBOARD, OUTPUT);
digitalWrite(LED_ONBOARD, LOW);
BLEDevice::init("");
pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
pBLEScan->setInterval(INTERVAL_TIME); // Set the interval to scan (mSecs)
pBLEScan->setWindow(WINDOW_TIME); // less or equal setInterval value
}
void loop() {
BLEScanResults foundDevices = pBLEScan->start(SCAN_TIME);
int count = foundDevices.getCount();
for (int i = 0; i < count; i++)
{
BLEAdvertisedDevice d = foundDevices.getDevice(i);
if (d.getName() == "Mi Band 3") {
check = true;
count_stable =0;
char deviceBuffer[100];
deviceName = d.getName().c_str();
deviceAddress = d.getAddress().toString().c_str();
deviceRSSI = d.getRSSI();
sprintf(deviceBuffer, "Name: %s| Address: %s| RSSI: %d\n", deviceName.c_str(), deviceAddress.c_str(), deviceRSSI);
Serial.print(deviceBuffer);
if (deviceAddress == "e6:37:63:e7:2f:4b" && deviceRSSI > -80)
{
digitalWrite(LED_ONBOARD, HIGH); // Turn on LED
}
else
{
digitalWrite(LED_ONBOARD, LOW); // Turn off LED
Serial.println("OFF");
}
//---------------------------------------------------------Check if not found Mi Band-------------------------------------
}else if(i == count-1 && check == false){
count_stable +=1;
if(count_stable ==20){ // set limit to reset counter
count_stable =0;
}
Serial.println(count_stable);
if(count_stable == 4){ //set quantity of scan cycle for accept missing Mi Band
digitalWrite(LED_ONBOARD, LOW);
Serial.println("Not Found");
}
}
check = false;
//---------------------------------------------------------------------------------------------------------------------------
}
pBLEScan->clearResults();
}