Bluetooth Anwesenheitserkennungfür mehrere Geräte

Hallo grüßt euch,

Ich bin aktuell dabei eine Lösung zu finden ein Relais zu schalten wenn gewisse Bluetooth Geräte in die Nähe kommen, bin im Netz auf folgendes fertiges Script gestoßen, was genau meine bedürfnisse trifft aber das einzige was mir fehlt ist die möglichkeit das der ausgang geschaltet werden soll wenn mehr als nur ein Gerät erkannt werden soll. Ich würde gerne 10-15 Geräte hinzufügen, sollte eins dieser Geräte in der nähe sein so soll der Ausgang geschalten werden, aktuell ist der code mit einem String programmiert, so wie ich verstanden hab benötige ich für diese Funktion ein eray, kann mir jemand helfen dies umzusetzten ? ich bin was Programmierung angeht absolut Lost.

Hier der Code iBeacon / iTag Präsenz Schalter – ESP32 Arduino Projekte

Ich würde gern die möglichkeit haben in der Zeile "String Adresse = "00:15:83:40:7c:bc"; // Bluetooth Adresse die zu Anwesenheitserkennung überwacht wird" mehrere Mac Adressen hinzuzufügen, weiß jemand wie das geht ?

Hallo,
ich hab mit den Sketch nicht angesehen, aber ich denke die Lösung könnte ein konstantes string Char Array sein. Da wo die Abfrage gemacht wird nutzt Du dann eine for.. Schleife mit jedem einzelnen Element des Arrays und wenn eines als gültig erkannt wird setzt Du eine Statusvariable.

static BLEAddress *pServerAddress;

ich nehme es zurück so einfach scheint es mir nicht zu sein :see_no_evil: die Zeile macht mir Kopfzerbrechen

Heinz

Damit erstmal die ESPler wissen, um was es geht...
Der Code.....

/*
   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 <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <BLEAddress.h>
#include <Ticker.h>

String Adresse = "00:15:83:40:7c:bc"; // Bluetooth Adresse die zu Anwesenheitserkennung überwacht wird
const int RelaisPin = 22;             // Pin an dem Relais hängt
int Verzoegerung = 15;                // Auschaltverzögerung wenn das Signal von BLE ibeacon fehlt

int VerzoegerungZaeler = 0;
Ticker Tic;
static BLEAddress *pServerAddress;
BLEScan* pBLEScan ;
int scanTime = 30; //In seconds


class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
    void onResult(BLEAdvertisedDevice advertisedDevice) // passiert wenn BLE Device ( beacon ) gefunden wurde
    {
      Serial.print(advertisedDevice.getAddress().toString().c_str()); // ibeacon Adresse anzeigen
      if (advertisedDevice.getAddress().equals(*pServerAddress))      // ibeacon Adresse Vergleichen
      {
        Serial.print(" Ueberwachte Adresse");                         // wenn überwache Adresse gefunden wurde
        digitalWrite (RelaisPin, 0);                                  // 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
if (VerzoegerungZaeler >= Verzoegerung) digitalWrite (RelaisPin, 1); // Wenn Verzögerungszeit erreicht wurde Auschalten
}

void setup() 
{
  pinMode (RelaisPin, OUTPUT);
  digitalWrite (RelaisPin, 1);
  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
}

Ja so ähnlich.
Der Code ist gut kommentiert.

Ist vielleicht nicht die optimalste Version, aber ohne zu wissen was der genau aus der BLEAdress macht, geht´s so:

/*
   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 <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <BLEAddress.h>
#include <Ticker.h>

String Adresses[] = {"12:34:30:d0:72:b3", "12:34:3b:9f:76:77", "12:34:24:ca:ff:a6", "12:34:bf:75:36:e0"};

const int RelaisPin = 22;             // Pin an dem Relais hängt
int Verzoegerung = 15;                // Auschaltverzögerung wenn das Signal von BLE ibeacon fehlt

int VerzoegerungZaeler = 0;
Ticker Tic;
static BLEAddress *pServerAddress;
BLEScan* pBLEScan ;
int scanTime = 30; //In seconds


class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
    void onResult(BLEAdvertisedDevice advertisedDevice) // passiert wenn BLE Device ( beacon ) gefunden wurde
    {
      Serial.print(advertisedDevice.getAddress().toString().c_str()); // ibeacon Adresse anzeigen
      for(uint8_t i = 0; i < 4; i++){
        pServerAddress = new BLEAddress(Adresses[i].c_str());
      if (advertisedDevice.getAddress().equals(*pServerAddress))      // ibeacon Adresse Vergleichen      
      {
        Serial.print(" Ueberwachte Adresse");                         // wenn überwache Adresse gefunden wurde
        Serial.print(" " + String(i));
        digitalWrite (RelaisPin, 0);                                  // 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
if (VerzoegerungZaeler >= Verzoegerung) digitalWrite (RelaisPin, 1); // Wenn Verzögerungszeit erreicht wurde Auschalten
}

void setup() 
{
  pinMode (RelaisPin, OUTPUT);
  digitalWrite (RelaisPin, 1);
  Serial.begin(115200);
  Serial.println("");
  Serial.println("Starte BLE Scanner");
  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
}

Die Schleife bekommt man sicherlich auch noch schöner hin :man_shrugging:t3:

Danke dir TriB, funktioniert super, hast mir weitergeholfen, vielen Danke !

Hallo, kann mir bitte einen den Code erklären?
bin noch neu auf diesem Gebiet.
vielen Dank.

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice) // passiert wenn BLE Device ( beacon ) gefunden wurde
{
Serial.print(advertisedDevice.getAddress().toString().c_str()); // ibeacon Adresse anzeigen
for(uint8_t i = 0; i < 4; i++){
pServerAddress = new BLEAddress(Adresses[i].c_str());
if (advertisedDevice.getAddress().equals(*pServerAddress)) // ibeacon Adresse Vergleichen
{
Serial.print(" Ueberwachte Adresse"); // wenn überwache Adresse gefunden wurde
Serial.print(" " + String(i));

Mahlzeit!
Es wird eine Klasse erstellt, welche die Methode onResult() beinhaltet.
Diese wird im setup() zugewiesen, so dass die BLE Bibliothek weiß was sie aufrufen soll, wenn ein Bluetoothgerät oder Beacon in der Nähe ist.
Die BLE-Bibliothek (am Anfang diese ganzen #include´s) übernimmt dann die Kommunikation mit dem Bluetooth Modul.

OnResult() wird dann eine Klasse namens BLEAdvertisedDevice übergeben. Dort sind die Informationen über das Bluetooth-Gerät enthalten und können z.B. über die Methode getAdress() abgerufen werden.
Um herauszufinden welche Methoden es da so alle gibt, kann man in der *.h-Datei der BLE-Bibliothek nachsehen oder man sucht sich ein Wiki oder eine Doku heraus, die die Funktionalitäten beschreibt.

Ansonsten habe ich dort für kingwall nur eine Prüfung eingebaut, welche die übergebene Adresse mit einer Liste von Adressen überprüft, damit nur diese bekannten Geräte auf der seriellen Schnittstelle landen.

1 Like

Mahlzeit,
Zunächst einmal vielen Dank. Etwas Licht kommt ins dunkle.
Ich habe mit dem original Code schon ein paar ergebnislose Versuche unternommen.
So gehe ich mal davon aus, dass hier im String
Serial.print(" " + String(i));
eine von den 4 Adressen steht? die ausgegeben wird.
Kann ich zB. hier eine if Bedingung einfügen, wo ich einen vergleich auf eine bestimmte Adresse abfrage?
Hintergrund ist folgender. Ich möchte für jede Adresse einen bestimmten Port schalten.

Bei mir postet dein Sketch immer die Bluetooth Adresse von Nachbars Samsung Fernseher der nicht auf meiner List steht, sobald er die MAC aus der Liste sieht kommt hat noch "Ueberwachte Adresse" dazu, also Funktioniert der Sketch sehr gut DANKE!!!!

Frage:
Hätte man die Unterschiedlichen MAC Adressen nicht als Liste in die setup.ini im Ordner /Data besser eingetragen? So muss jedes mal neu geflash werden wenn man was editieren möchte?

Problem zuerst als ESP32 anfänger:

Okay hab es hinbekommen, wer Platzprobleme hat probiert "Minimal SPIFFS" 1.9MB APP OTA/190KB Spiff..

[EDIT] Ursprüngliche frage :slight_smile:
Welches ESP32 Modul hat denn genügend Speicher für den Sketch?

Bei mir kommt in der Arduino IDE folgende Fehlermeldung:
Der Sketch verwendet 1485402 Bytes (113%) des Programmspeicherplatzes. Das Maximum sind 1310720 Bytes.text section exceeds available space in board

Globale Variablen verwenden 51748 Bytes (15%) des dynamischen Speichers, 275932 Bytes für lokale Variablen verbleiben. Das Maximum sind 327680 Bytes.
Sketch too big; see https://support.arduino.cc/hc/en-us/articles/360013825179 for tips on reducing it.
Fehler beim Kompilieren für das Board ESP32 Wrover Module.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.