- Voraussetzungen
- Erforderliche Materialien
- Hardware
- Holen Sie sich Ihre Bluetooth-Adresse des Servers (Adresse des Fitnessbands)
- Abrufen der Dienst- und charakteristischen UUID des Servers
- Programmieren des ESP32 als Client für die Proximity Switch-Anwendung
- Arbeiten und Testen
Wie cool es ist, das Licht automatisch einzuschalten, sobald Sie Ihr Haus betreten, und es wieder auszuschalten, wenn Sie gehen! Ja, eine einfache Anwendung kann dies für Sie tun. Hier in diesem Projekt werden wir ESP32 als BLE-Client und Fitnessband als BLE-Server verwenden. Wenn also eine Person, die das Fitnessband trägt, in die Reichweite von ESP32 Bluetooth kommt, erkennt das ESP32 es und schaltet das Licht ein. Alle Bluetooth-Geräte mit BLE-Serverfunktionen können als Auslösegerät zur Steuerung aller Haushaltsgeräte mit ESP32 verwendet werden.
Wir haben bereits die BLE-Funktionen (Bluetooth Low Energy) des ESP32-Moduls untersucht, und ich bin ziemlich begeistert davon. Zusammenfassend lässt sich sagen, dass dieses Modul sowohl über klassisches Bluetooth als auch über Bluetooth Low Energy (BLE) verfügt. Das klassische Bluetooth kann zum Übertragen von Songs oder Dateien verwendet werden. Die BLE-Option kann für batterieoptimierte Anwendungen wie Bluetooth-Beacons, Fitnessbänder und Proximity-Anwendungen verwendet werden usw. Es ist auch möglich, es als serielles Bluetooth wie die Module HC-05 oder HC-06 für einfache Mikrocontroller-Projekte zu verwenden.
Wie Sie wissen, kann der ESP32 BLE in zwei verschiedenen Modi betrieben werden. Einer ist der Servermodus, den wir bereits besprochen haben, indem wir den GATT-Dienst verwendet haben, um einen Dienst zur Anzeige des Batteriestands nachzuahmen. In dieser Übung fungierte der ESP32 als Server und unser Mobiltelefon als Client. Lassen Sie uns nun den ESP32 als Client betreiben und versuchen, ihn mit anderen BLE-Servern wie meinem Fitnessband zu verbinden.
Alle BLE-Server, einschließlich meines Fitnessbands, befinden sich im ständigen Werbemodus, dh sie können immer entdeckt werden, wenn sie von einem Kunden gescannt werden. Durch die Nutzung dieser Funktion können wir diese Fitnessbänder als Näherungsschalter verwenden. Dies bedeutet, dass diese Fitnessbänder immer an die Hand des Benutzers gebunden sind. Durch Scannen nach dem Band können wir feststellen, ob sich die Person in Reichweite befindet. Genau das werden wir in diesem Artikel tun. Wir werden den ESP32 so programmieren, dass er als BLE-Client fungiert und ständig nach BLE-Geräten sucht. Wenn wir das Fitnessband in Reichweite finden, werden wir versuchen, eine Verbindung herzustellen. Wenn die Verbindung erfolgreich ist, können wir eine Glühbirne auslösen, indem wir einen der GPIO-Pins am ESP32 umschalten. Die Methode ist zuverlässig, da jeder BLE-Server(Fitnessband) hat eine eindeutige Hardware-ID, sodass keine zwei BLE-Servergeräte identisch sind. Interessant, oder? !!! Jetzt lass uns bauen
Voraussetzungen
In diesem Artikel gehe ich davon aus, dass Sie bereits mit der Verwendung der ESP32-Karte mit Arduino IDE vertraut sind, wenn Sie nicht auf die ersten Schritte mit dem ESP32-Lernprogramm zurückgreifen.
Wir haben das gesamte ESP32 Bluetooth zum besseren Verständnis in drei Segmente unterteilt. Es wird daher empfohlen, die ersten beiden Tutorials durchzugehen, bevor Sie mit diesem beginnen.
- Serielles Bluetooth am ESP32 schaltet die LED vom Mobiltelefon um
- BLE-Server zum Senden von Daten zum Akkuladestand mithilfe des GATT-Dienstes an das Mobiltelefon
- BLE-Client zum Suchen nach BLE-Geräten und als Beacon.
Wir haben bereits die ersten beiden Tutorials behandelt. Hier fahren wir mit dem letzten fort, um ESP32 als BLE-Client zu erklären.
Erforderliche Materialien
- ESP32 Development Board
- Wechselstromlast (Lampe)
- Relaismodul
Hardware
Die Hardware für dieses ESP32 BLE Client-Projekt ist ziemlich einfach, da der größte Teil der Magie im Code stattfindet. Der ESP32 muss eine Wechselstromlampe (Load) umschalten, wenn das Bluetooth-Signal erkannt wird oder verloren geht. Um diese Last umzuschalten, verwenden wir ein Relais. Da die GPIO-Pins von ESP32 nur mit 3,3 V kompatibel sind, benötigen wir ein Relaismodul, das mit 3,3 V betrieben werden kann. Überprüfen Sie einfach, welcher Transistor im Relaismodul verwendet wird, wenn es sich um BC548 handelt. Sie können auch eine eigene Schaltung erstellen, indem Sie dem folgenden Schaltplan folgen.
Warnung: Die Schaltung befasst sich mit direkter 220-V-Wechselspannung. Seien Sie vorsichtig mit stromführenden Kabeln und stellen Sie sicher, dass Sie keinen Kurzschluss verursachen. Du wurdest gewarnt.
Der Grund für die Verwendung von BC548 über BC547 oder 2N2222 ist, dass sie eine niedrige Basis-Emitter-Spannung haben, die mit nur 3,3 V ausgelöst werden kann. Das hier verwendete Relais ist ein 5-V-Relais, daher versorgen wir es mit einem Vin-Pin, der 5 V über das Stromkabel erhält. Der Erdungsstift ist mit der Masse des Stromkreises verbunden. Der Widerstand R1 1K wird als Basisstrombegrenzungswiderstand verwendet. Das Phasendraht ist mit dem NO-Pin des Relais verbunden, und der gemeinsame Pin des Relais ist mit der Last verbunden, und das andere Ende der Last ist mit dem Neutralleiter verbunden. Sie können die Position von Phase und Neutral tauschen, aber achten Sie darauf, dass Sie sie nicht direkt kurzschließen. Der Strom sollte immer durch die Last (Glühlampe) fließen.Ich habe ein Relaismodul verwendet, um die Dinge einfach zu halten, und die Last hier ist eine Focus-LED-Lampe. Mein Setup sieht ungefähr so aus
Wenn Sie die Hardware vorerst überspringen möchten, können Sie den GPIO 2-Pin anstelle des GPIO 13-Pins verwenden, um die integrierte LED am ESP32 umzuschalten. Diese Methode wird Anfängern empfohlen.
Holen Sie sich Ihre Bluetooth-Adresse des Servers (Adresse des Fitnessbands)
Wie bereits erwähnt, werden wir den ESP32 so programmieren, dass er als Client fungiert (ähnlich wie beim Telefon) und eine Verbindung zu einem Server herstellt, der mein Fitnessband ist (Lenovo HW-01). Damit ein Client eine Verbindung zum Server herstellen kann, muss er die Bluetooth-Adresse des Servers kennen. Jeder Bluetooth-Server wie mein Fitnessband hier hat seine eigene eindeutige Bluetooth-Adresse, die permanent ist. Sie können dies mit der MAC-Adresse Ihres Laptops oder Mobiltelefons in Beziehung setzen.
Um diese Adresse vom Server zu erhalten, verwenden wir die Anwendung nRF connect von nordischen Halbleitern, die wir bereits für unser vorheriges Tutorial verwendet hatten. Es ist kostenlos für IOS- und Android-Benutzer verfügbar. Einfach herunterladen, die Anwendung starten und nach Bluetooth-Geräten in der Nähe suchen. Die Anwendung listet alle gefundenen BLE-Geräte auf. Meins heißt HW-01. Schauen Sie einfach unter seinen Namen und Sie finden die Hardwareadresse des Servers wie unten gezeigt.
Die ESP32 BLE- Hardwareadresse meines Fitnessbands lautet also C7: F0: 69: F0: 68: 81, Sie haben einen anderen Satz von Zahlen im gleichen Format. Notieren Sie sich dies einfach, da wir es benötigen, wenn wir unser ESP32 programmieren.
Abrufen der Dienst- und charakteristischen UUID des Servers
Okay, jetzt haben wir unseren Server anhand der BLE-Adresse identifiziert, aber um mit ihm zu kommunizieren, müssen wir die Sprache des Dienstes und die Merkmale sprechen, die Sie verstehen würden, wenn Sie das vorherige Tutorial gelesen hätten. In diesem Tutorial verwende ich die Schreibcharakteristik meines Servers (Fitnessband), um ihn zu koppeln. Für das Pairing mit dem Gerät benötigen wir also die UUID "Service Ad Characteristic", die wir mit derselben Anwendung erneut erhalten können.
Klicken Sie einfach auf die Schaltfläche Verbinden in Ihrer Anwendung und suchen Sie nach einigen Schreibmerkmalen, in denen die Anwendung die Dienst-UUID und die Merkmals-UUID anzeigt. Meins ist unten gezeigt
Hier sind meine Service-UUID und die charakteristische UUID identisch, müssen jedoch nicht identisch sein. Notieren Sie sich die UUID Ihres Servers. Meins wurde als notiert
Service-UUID: 0000fee7-0000-1000-8000-00805f9b34fb Charakteristische UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Es ist nicht obligatorisch, die Schreibmerkmale zu verwenden. Sie können jeden gültigen Dienst und jede gültige UUID des Servers verwenden, die in der Anwendung angezeigt wird.
Programmieren des ESP32 als Client für die Proximity Switch-Anwendung
Die Idee des Programms ist es, den ESP32 als Client zu fungieren, der weiterhin nach Bluetooth-Geräten sucht, wenn er unseren Server (Fitnessband) findet, die Hardware-ID überprüft und das Licht über den GPIO-Pin 13 umschaltet. Gut, okay! !, aber es gibt ein Problem damit. Alle BLE-Server haben eine Reichweite von 10 Metern, was etwas zu viel ist. Wenn wir also versuchen, einen Näherungsschalter zu betätigen, um das Licht beim Öffnen einer Tür einzuschalten, ist dieser Bereich sehr hoch.
Um die Reichweite des BLE-Servers zu verringern, können wir die Pairing-Option verwenden. Ein BLE-Server und ein Client bleiben nur dann gepaart, wenn sich beide in einem Abstand von 3-4 Metern befinden. Das ist perfekt für unsere Anwendung. Daher stellen wir den ESP32 so ein, dass er nicht nur den BLE-Server erkennt, sondern auch eine Verbindung zu ihm herstellt und sicherstellt, dass er weiterhin gekoppelt bleibt. Solange sie gekoppelt sind, bleibt die Wechselstromlampe eingeschaltet. Wenn der Bereich die Paarung überschreitet, geht sie verloren und die Lampe wird ausgeschaltet. Das vollständige ESP32 BLE-Beispielprogramm, um dasselbe zu tun, finden Sie am Ende dieser Seite. Unten hier werde ich den Code in kleine Schnipsel aufteilen und versuchen, sie zu erklären.
Nach dem Einfügen der Header-Datei informieren wir den ESP32 über die BLE-Adresse, den Service und die charakteristische UUID, die wir über die nRF-Verbindungsanwendung erhalten haben, wie in den obigen Überschriften erläutert. Der Code sieht wie folgt aus
static BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Service-UUID des Fitnessbands, die über die statische BLEUUID charUUID der nRF-Verbindungsanwendung erhalten wurde ("0000fee7-0000-1000-8000-00805f9b34fb"); // Charakteristische UUID des Fitnessbands, die über die nRF-Verbindungsanwendung erhalten wurde String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Hardware Bluetooth MAC meines Fitnessbands variiert für jedes Band, das über die nRF-Verbindungsanwendung erhalten wird
Anschließend haben wir im Programm den connectToserver und MyAdvertisedDeviceCallback, auf die wir später zurückkommen werden. Anschließend initialisieren wir innerhalb der Setup- Funktion den seriellen Monitor und lassen die BLE auf ESP nach Geräten suchen. Nachdem der Scan für jedes entdeckte BLE-Gerät abgeschlossen ist, wird die Funktion MyAdvertisedDeviceCallbacks aufgerufen.
Wir aktivieren auch den aktiven Scan, da wir den ESP32 mit Netzstrom versorgen. Für Batterieanwendungen wird er ausgeschaltet, um den Stromverbrauch zu senken. Der Relais-Trigger-Pin ist in unserer Hardware mit GPIO 13 verbunden, daher deklarieren wir auch den GPIO-Pin 13 als Ausgang.
void setup () { Serial.begin (115200); // Seriellen Monitor starten Serial.println ("ESP32 BLE Server Programm"); // Intro message BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // neuen Scan erstellen pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Rufe die oben definierte Klasse auf pBLEScan-> setActiveScan (true); // aktiver Scan verbraucht mehr Strom, erzielt aber schnellere Ergebnisse pinMode (13, OUTPUT); // Deklariere den eingebauten LED-Pin als Ausgang }
In der MyAdvertisedDeviceCallbacks- Funktion wird eine Zeile gedruckt, in der der Name und andere Informationen der erkannten BLE-Geräte aufgelistet sind . Wir benötigen die Hardware-ID des entdeckten BLE-Geräts, damit wir sie mit der gewünschten vergleichen können. So wir die Variable verwenden Server_BLE_Address die Adresse des Geräts zu bekommen und dann auch sie vom Typ BLEAddress auf Zeichenfolge zu konvertieren.
Klasse MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice AdvertisedDevice) { Serial.printf ("Scan-Ergebnis:% s \ n", AdvertisedDevice.toString (). c_str ()); Server_BLE_Address = neue BLEAddress (AdvertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Innerhalb der Schleifenfunktion scannen wir 3 Sekunden lang und fügen das Ergebnis in foundDevices ein, einem Objekt von BLEScanResults. Wenn wir durch Scannen ein oder mehrere Geräte finden, prüfen wir, ob die erkannte BLE-Adresse mit der im Programm eingegebenen übereinstimmt. Wenn die Übereinstimmung positiv ist und das Gerät nicht früher gekoppelt wurde, versuchen wir, es mit der Funktion connectToserver zu trennen. Wir haben auch einige serielle Anweisungen zum Verständnis des Zwecks verwendet.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && gepaart == false) { Serial.println ("Gefundenes Gerät: -)… Verbindung zum Server als Client herstellen"); if (connectToserver (* Server_BLE_Address)) {
Innerhalb der connectToserver- Funktion verwenden wir die UUID, um mit dem BLE-Server (Fitnessband) zu koppeln . Um eine Verbindung mit einem Server herzustellen, muss der ESP32 als Client fungieren. Daher erstellen wir einen Client mithilfe der Funktion createClient () und stellen dann eine Verbindung zur Adresse des BLE-Servers her. Dann suchen wir anhand der UUID-Werte nach dem Dienst und der Eigenschaft und versuchen, eine Verbindung herzustellen. Wenn die Verbindung erfolgreich ist, gibt die Funktion ein true und andernfalls ein false zurück. Beachten Sie, dass für die Kopplung mit einem Server kein Dienst und keine charakteristische UUID erforderlich sind. Dies erfolgt nur zu Ihrem Verständnis.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Client erstellt"); // Verbindung zum BLE-Server herstellen. pClient-> connect (pAddress); Serial.println ("- Verbunden mit Fitnessband"); // Erhalten Sie einen Verweis auf den Dienst, den wir auf dem Remote-BLE-Server suchen. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Wir haben unseren Service gefunden"); return true; } else return false; // Beziehen Sie einen Verweis auf das Merkmal im Dienst des Remote-BLE-Servers. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Gefunden unser Merkmal"); return true; }}
Wenn die Verbindung erfolgreich ist, wird der GPIO-Pin 13 auf High gesetzt und die Steuerung wird mithilfe der break-Anweisung außerhalb der Schleife gesendet. Die gepaarte boolesche Variable wird ebenfalls auf true gesetzt.
if (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("******************** LED leuchtet ************************** ** "); digitalWrite (13, HIGH); Unterbrechung; }}
Nachdem das Pairing erfolgreich war und der GPIO-Pin eingeschaltet ist, müssen wir prüfen, ob sich das Gerät noch in Reichweite befindet. Da das Gerät jetzt gekoppelt ist, kann der BLE-Scan-Dienst es nicht mehr sehen. Wir werden es erst wieder finden, wenn der Benutzer den Bereich verlässt. Wir müssen also einfach nach unserem BLE-Server suchen und wenn wir feststellen, dass wir den GPIO-Pin wie unten gezeigt auf niedrig setzen müssen
if (Scaned_BLE_Address == My_BLE_Address && gepaart == true) { Serial. println ("Unser Gerät ist außer Reichweite"); gepaart = falsch; Seriennummer. println ("******************** LED OOOFFFFF ****************************"); digitalWrite (13, LOW); ESP.restart (); Unterbrechung; }}
Arbeiten und Testen
Wenn Sie mit dem Programm und der Hardware-Einrichtung fertig sind, laden Sie einfach den Code auf den ESP32 hoch und arrangieren Sie die gesamte Einrichtung wie unten gezeigt.
Sie sollten bemerken, dass die Lampe eingeschaltet wird, sobald sich das Fitnessband (Server) mit dem ESP32 paart. Sie können dies auch überprüfen, indem Sie das Bluetooth-Verbindungssymbol auf dem Fitnessband bemerken. Nach dem Pairing versuchen Sie einfach, sich vom ESP32 zu entfernen. Wenn Sie 3-4 Meter überqueren, werden Sie feststellen, dass das Bluetooth-Symbol auf der Uhr verschwindet und die Verbindung unterbrochen wird. Wenn Sie nun auf die Lampe schauen, wird sie ausgeschaltet. Wenn Sie zurückgehen, wird das Gerät erneut gekoppelt und das Licht leuchtet auf. Die vollständige Arbeitsweise des Projekts finden Sie im folgenden Video.
Ich hoffe, Ihnen hat das Projekt gefallen und Sie haben unterwegs etwas Neues gelernt. Wenn Sie Probleme hatten, es zum Laufen zu bringen, können Sie das Problem gerne in Foren oder sogar im Kommentarbereich unten veröffentlichen