#include /* ibeacon oder Beliebiger BLE Gerät Präsenz Überwachung mit Relais Anwesenheitserkennung Michael Dworkin http://esp32-server.de/ 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 #include #include #include #include #include #include //cf:d7:ab:1f:24:2c String Adresse = "96:33:bb:bf:ff:ab"; // Bluetooth Adresse die zu Anwesenheitserkennung überwacht wird ET585 //String Adresse = "cf:d7:ab:1f:24:2c"; // Bluetooth Adresse die zu Anwesenheitserkennung überwacht wird Holy-IOT const int RelaisPin = LED_BUILTIN; // Pin an dem Relais hängt int Verzoegerung = 15; // Auschaltverzögerung wenn das Signal von BLE ibeacon fehlt int VerzoegerungZaeler = 0; //long int ZZ = 0; Ticker Tic; static BLEAddress *pServerAddress; BLEScan* pBLEScan ; int scanTime = 30; //In seconds long int Feldstaerke; class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) // passiert wenn BLE Device ( beacon ) gefunden wurde { //Serial.print(ZZ); Serial.print("\t"); Serial.print(advertisedDevice.getAddress().toString().c_str()); // ibeacon Adresse anzeigen /* if (advertisedDevice.haveName()) { Serial.print(" Device name: "); Serial.print(advertisedDevice.getName().c_str()); } */ if (advertisedDevice.getAddress().equals(*pServerAddress)) // ibeacon Adresse Vergleichen { Serial.print(" Ueberwachte Adresse"); // wenn überwache Adresse gefunden wurde if (advertisedDevice.haveName()) { Serial.print(" Device name: "); Serial.print(advertisedDevice.getName().c_str()); } Serial.print(" RSSI: "); Serial.print(advertisedDevice.getRSSI()); Serial.print(" dB "); Serial.print(advertisedDevice.getTXPower()); Serial.print(" "); digitalWrite (RelaisPin, HIGH); // Relais Einschalten VerzoegerungZaeler = 0; // Ausschaltverzögerung zurücksetzen advertisedDevice.getScan()->stop(); // Scanvorgang beenden } // Found our server Serial.println(""); } }; void SekundenTic() // Wird jede Sekunde ausgefüert { VerzoegerungZaeler++; // Sekundenzähler //ZZ++; if (VerzoegerungZaeler >= Verzoegerung) digitalWrite (RelaisPin, LOW); // Wenn Verzögerungszeit erreicht wurde Auschalten } void setup() { pinMode (RelaisPin, OUTPUT); digitalWrite (RelaisPin, LOW); Serial.begin(115200); Serial.println(""); Serial.println("Starte BLE Scanner"); pServerAddress = new BLEAddress(Adresse.c_str()); BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); //create new scan pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster Tic.attach( 1,SekundenTic); } void loop() { pBLEScan->start(scanTime); delay(2000); // Alle 2s nach ibeacon scannen }