- Wymagania wstępne
- Wymagane materiały
- Sprzęt komputerowy
- Uzyskaj adres serwera Bluetooth (adres opaski fitness)
- Uzyskanie usługi i charakterystycznego UUID serwera
- Programowanie ESP32 do działania jako klient aplikacji czujnika zbliżeniowego
- Praca i testowanie
Jak fajnie jest włączać światła automatycznie, gdy tylko wejdziesz do domu, i wyłączać je, gdy wychodzisz! Tak, prosta aplikacja może to za Ciebie zrobić. Tutaj, w tym projekcie, użyjemy ESP32 jako klienta BLE i opaski fitness jako serwera BLE, więc gdy osoba nosząca opaskę fitness znajdzie się w zasięgu ESP32 Bluetooth, ESP32 wykryje to i włączy Światło. Każde urządzenie Bluetooth, które ma możliwości serwera BLE, może być używane jako urządzenie wyzwalające do sterowania dowolnym urządzeniem gospodarstwa domowego za pomocą ESP32.
Poznaliśmy już możliwości BLE (Bluetooth Low Energy) modułu ESP32 i jestem tym bardzo podekscytowany. Podsumowując, ten moduł ma zarówno klasyczny Bluetooth, jak i Bluetooth Low Energy (BLE), klasyczny Bluetooth może być używany do przesyłania utworów lub plików, a opcja BLE może być używana do aplikacji zoptymalizowanych pod kątem baterii, takich jak nadajniki Bluetooth, opaski fitness, zbliżeniowe itp. Można go również używać jako szeregowego łącza Bluetooth, jak moduły HC-05 lub HC-06 do prostych projektów mikrokontrolerów.
Jak wiesz, ESP32 BLE może działać w dwóch różnych trybach. Jednym z nich jest tryb serwera, który już omówiliśmy, wykorzystując usługę GATT do naśladowania usługi wskaźnika poziomu baterii. W tym ćwiczeniu ESP32 działał jako serwer, a nasz telefon komórkowy działał jako klient. Teraz obsługujmy ESP32 jako klienta i spróbujmy połączyć go z innymi serwerami BLE, takimi jak moja opaska fitness.
Wszystkie serwery BLE, w tym moja opaska fitness, są w trybie ciągłej reklamy, co oznacza, że zawsze można je wykryć podczas skanowania przez klienta. Korzystając z tej funkcji, możemy używać tych pasków fitness jako przełączników zbliżeniowych, co oznacza, że te opaski fitness są zawsze przywiązane do dłoni użytkownika i skanując w poszukiwaniu pasma, które możemy wykryć, czy dana osoba znajduje się w zasięgu. Dokładnie to zrobimy w tym artykule. Będziemy zaprogramować ESP32 działać jako BLE klienta i stale utrzymywać skanowania dla urządzeń ble; jeśli znajdziemy w zasięgu opaskę fitness, spróbujemy się z nią połączyć, a jeśli połączenie się powiedzie, możemy wyzwolić żarówkę, przełączając jeden z pinów GPIO na ESP32. Metoda jest niezawodna, ponieważ każdy serwer BLE(zespół fitness) będzie miał unikalny identyfikator sprzętu, więc żadne dwa urządzenia serwera BLE nie będą identyczne. Ciekawe prawda? !!! Teraz zacznijmy budować
Wymagania wstępne
W tym artykule zakładam, że wiesz już, jak używać płyty ESP32 z Arduino IDE, jeśli nie wróć do rozpoczęcia pracy z samouczkiem ESP32.
Podzieliliśmy cały moduł ESP32 Bluetooth na trzy segmenty, aby ułatwić zrozumienie. Dlatego zaleca się, aby przejść przez pierwsze dwa samouczki, zanim zaczniesz od tego.
- Szeregowy Bluetooth na ESP32 przełączający diodę LED z telefonu komórkowego
- Serwer BLE do wysyłania danych o poziomie baterii do telefonu komórkowego za pomocą usługi GATT
- Klient BLE do skanowania w poszukiwaniu urządzeń BLE i działania jako beacon.
Omówiliśmy już pierwsze dwa samouczki, tutaj przechodzimy do ostatniego, aby wyjaśnić ESP32 jako klienta BLE.
Wymagane materiały
- Płytka rozwojowa ESP32
- Obciążenie AC (lampa)
- Moduł przekaźników
Sprzęt komputerowy
Sprzęt dla tego projektu klienta ESP32 BLE jest dość prosty, ponieważ większość magii dzieje się wewnątrz kodu. ESP32 musi przełączać lampę AC (Obciążenie), gdy sygnał Bluetooth zostanie wykryty lub utracony. Aby przełączyć to obciążenie, użyjemy przekaźnika, a ponieważ piny GPIO ESP32 są kompatybilne tylko z 3,3 V, potrzebujemy modułu przekaźnika, który może być zasilany napięciem 3,3 V. Po prostu sprawdź, jaki tranzystor jest używany w module przekaźnikowym, jeśli jest to BC548, możesz przejść dalej, zbudować własny obwód, postępując zgodnie ze schematem obwodu poniżej.
Ostrzeżenie: Obwód obsługuje bezpośrednie napięcie sieciowe 220 V AC. Uważaj na przewody pod napięciem i upewnij się, że nie powodują zwarcia. Zostałeś ostrzeżony.
Powodem używania BC548 zamiast BC547 lub 2N2222 jest to, że mają niskie napięcie bazowe-emiter, które można wyzwolić za pomocą tylko 3,3 V. Zastosowany tutaj przekaźnik to przekaźnik 5V, więc zasilamy go pinem Vin, który pobiera 5V z kabla zasilającego. Kołek uziemiający jest połączony z masą obwodu. Rezystor R1 1K jest stosowane jako podłoże rezystor ogranicznika. Przewód fazowy jest podłączony do styku NO przekaźnika, a wspólny styk przekaźnika jest podłączony do obciążenia, a drugi koniec obciążenia jest podłączony do przewodu neutralnego. Możesz zamienić pozycję Fazy i Neutralnej, ale uważaj, aby nie skracać ich bezpośrednio. Prąd powinien zawsze przepływać przez obciążenie (żarówkę).Użyłem modułu przekaźnika, aby uprościć sprawę, a obciążenie to lampa Focus LED. Moja konfiguracja wygląda mniej więcej tak poniżej
Jeśli chcesz na razie pominąć sprzęt, możesz użyć pinów GPIO 2 zamiast pinów GPIO 13, aby przełączyć wbudowaną diodę LED w ESP32. Ta metoda jest zalecana dla początkujących.
Uzyskaj adres serwera Bluetooth (adres opaski fitness)
Jak wspomniano wcześniej, zamierzamy zaprogramować ESP32 tak, aby działał jako klient (podobnie jak telefon) i łączył się z serwerem, którym jest moja opaska fitness (Lenovo HW-01). Aby klient mógł połączyć się z serwerem, musi znać adres Bluetooth serwera. Każdy serwer Bluetooth, jak moja opaska fitness, ma swój własny, stały adres Bluetooth. Możesz to powiązać z adresem MAC swojego laptopa lub telefonu komórkowego.
Aby uzyskać ten adres z serwera, używamy aplikacji nRF connect z nordyckich półprzewodników, której używaliśmy już w naszym poprzednim samouczku. Jest dostępny bezpłatnie dla użytkowników IOS i Android. Wystarczy pobrać, uruchomić aplikację i wyszukać pobliskie urządzenia Bluetooth. Aplikacja wyświetli listę wszystkich znalezionych urządzeń BLE. Mój nazywa się HW-01, po prostu spójrz pod jego nazwą, a znajdziesz adres sprzętowy serwera, jak pokazano poniżej.
Tak więc adres sprzętowy ESP32 BLE mojej opaski fitness to C7: F0: 69: F0: 68: 81, będziesz mieć inny zestaw liczb w tym samym formacie. Po prostu zanotuj to, ponieważ będziemy potrzebować podczas programowania naszego ESP32.
Uzyskanie usługi i charakterystycznego UUID serwera
OK, teraz zidentyfikowaliśmy nasz serwer przy użyciu adresu BLE, ale aby się z nim komunikować, musimy mówić językiem Usługi i cechami, które zrozumiałbyś, gdybyś przeczytał poprzedni samouczek. W tym samouczku używam charakterystyki zapisu mojego serwera (zespołu fitness), aby się z nim sparować. Więc do sparowania z urządzeniem potrzebujemy Service ad Characteristic UUID, który możemy ponownie uzyskać za pomocą tej samej aplikacji.
Wystarczy kliknąć przycisk Połącz w swojej aplikacji i wyszukać jakieś charakterystyki zapisu, gdzie aplikacja wyświetli UUID usługi i charakterystyczny UUID. Mój jest pokazany poniżej
Tutaj mój Service UUID i Characteristic UUID są takie same, ale nie muszą być takie same. Zanotuj identyfikator UUID swojego serwera. Mój został zapisany jako
Identyfikator UUID usługi: 0000fee7-0000-1000-8000-00805f9b34fb Charakterystyczny UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Korzystanie z charakterystyk zapisu nie jest obowiązkowe; możesz użyć dowolnej ważnej usługi i charakterystycznego UUID serwera, który jest pokazany w aplikacji.
Programowanie ESP32 do działania jako klient aplikacji czujnika zbliżeniowego
Pomysł programu polega na tym, aby ESP32 działał jako klient, który skanuje w poszukiwaniu urządzeń Bluetooth, gdy znajdzie nasz serwer (zespół fitness), weryfikuje identyfikator sprzętu i przełącza światło przez pin 13 GPIO. No dobrze! !, ale jest z tym jeden problem. Wszystkie serwery BLE będą miały zasięg 10 metrów, czyli trochę za dużo. Jeśli więc próbujemy ustawić przełącznik zbliżeniowy, aby zapalał światło przy otwartych drzwiach, to zasięg jest bardzo duży.
Aby zmniejszyć zasięg serwera BLE możemy skorzystać z opcji parowania. Serwer i klient BLE pozostaną sparowane tylko wtedy, gdy oba znajdują się w odległości 3-4 metrów. To idealne rozwiązanie dla naszej aplikacji. Dlatego sprawiamy, że ESP32 nie tylko wykrywa serwer BLE, ale także łączy się z nim i upewnia się, czy pozostaje sparowany. Dopóki są sparowane, lampa AC pozostanie włączona, gdy zakres przekroczy parowanie, zostanie utracone, a lampa zostanie wyłączona. Kompletny przykładowy program ESP32 BLE, który robi to samo, jest podany na końcu tej strony. Poniżej podzielę kod na małe fragmenty i spróbuję je wyjaśnić.
Po dołączeniu pliku nagłówkowego informujemy ESP32 o adresie BLE, usłudze i charakterystycznym UUID, który uzyskaliśmy za pomocą aplikacji nRF connect, jak wyjaśniono w powyższych nagłówkach. Kod wygląda jak poniżej
statyczny BLEUUID serviceUUID („0000fee7-0000-1000-8000-00805f9b34fb”); // Identyfikator UUID usługi pasma sprawności uzyskany za pomocą aplikacji nRF connect static BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // Charakterystyczny identyfikator UUID pasma sprawności uzyskany przez aplikację nRF connect String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Sprzętowy adres MAC Bluetooth mojej opaski fitness będzie różny dla każdego pasma uzyskanego za pośrednictwem aplikacji nRF connect
Następnie w programie mamy connectToserver i MyAdvertisedDeviceCallback, do których wrócimy później. Następnie w funkcji konfiguracji inicjalizujemy monitor szeregowy i wykonujemy BLE na ESP, aby skanować w poszukiwaniu urządzenia. Po zakończeniu skanowania dla każdego wykrytego urządzenia BLE wywoływana jest funkcja MyAdvertisedDeviceCallbacks .
Włączamy również aktywne skanowanie, ponieważ ESP32 zasilamy z sieci, w przypadku aplikacji bateryjnej jest ono wyłączone, aby zmniejszyć pobór prądu. Pin wyzwalacza przekaźnika jest podłączony do GPIO 13 w naszym sprzęcie, więc deklarujemy również, że pin 13 GPIO jako wyjście.
void setup () { Serial.begin (115200); // Uruchom monitor szeregowy Serial.println ("Program serwera ESP32 BLE"); // Wiadomość wprowadzająca BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // utwórz nowe skanowanie pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // Wywołaj klasę zdefiniowaną powyżej pBLEScan-> setActiveScan (true); // aktywne skanowanie zużywa więcej energii, ale wyniki są szybsze pinMode (13, OUTPUT); // Zadeklaruj wbudowany pin LED jako wyjście }
Wewnątrz funkcji MyAdvertisedDeviceCallbacks drukujemy wiersz zawierający nazwę i inne informacje o wykrytych urządzeniach BLE. Potrzebujemy identyfikatora sprzętu wykrytego urządzenia BLE, abyśmy mogli go porównać z wybranym. Więc używamy zmiennej Server_BLE_Address, aby uzyskać adres urządzenia, a następnie przekonwertować go z typu BLEAddress na łańcuch.
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice AdvertisedDevice) { Serial.printf ("Wynik skanowania:% s \ n", anonsisedDevice.toString (). c_str ()); Server_BLE_Address = nowy BLEAddress (AdvertisedDevice.getAddress ()); Scaned_BLE_Address = Server_BLE_Address-> toString (). C_str (); } };
Wewnątrz funkcji pętli skanujemy przez 3 sekundy i umieszczamy wynik w foundDevices, który jest obiektem z BLEScanResults. Jeśli przez skanowanie znajdziemy jedno lub więcej urządzeń, zaczynamy sprawdzać, czy wykryty adres BLE pasuje do tego, który wprowadziliśmy do programu. Jeśli dopasowanie jest pozytywne, a urządzenie nie zostało sparowane wcześniej, spróbujemy z nim sparować za pomocą funkcji connectToserver. Użyliśmy również kilku instrukcji Serial dla zrozumienia celu.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Znaleziono urządzenie: -)… łączę się z serwerem jako klient"); if (connectToserver (* Server_BLE_Address)) {
W funkcji connectToserver wykorzystujemy UUID do parowania z serwerem BLE (pasmo fitness). Aby połączyć się z serwerem, ESP32 musi działać jako klient, więc tworzymy klienta za pomocą funkcji createClient (), a następnie łączymy się z adresem serwera BLE. Następnie wyszukujemy usługę i charakterystykę za pomocą wartości UUID i próbujemy się z nią połączyć. Gdy połączenie się powiedzie, funkcja zwraca prawdę, a jeśli nie, zwraca fałsz. Zauważ, że nie jest obowiązkowe posiadanie usługi i charakterystycznego UUID do sparowania z serwerem, jest to robione tylko dla twojego zrozumienia.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Utworzono klienta"); // Połącz się z serwerem BLE. pClient-> connect (pAddress); Serial.println ("- Połączono z pasmem fitness"); // Uzyskaj odniesienie do usługi, której szukamy na zdalnym serwerze BLE. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Znaleziono naszą usługę"); powrót prawda; } else zwraca false; // Uzyskaj odniesienie do charakterystyki w usłudze zdalnego serwera BLE. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Znaleziono naszą cechę"); powrót prawda; }
Jeśli połączenie się powiedzie, pin 13 GPIO jest ustawiony w stan wysoki, a sterowanie jest wysyłane poza pętlę za pomocą instrukcji break. Sparowana zmienna logiczna również ma wartość true.
if (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("******************** Dioda LED włączona ********************** ** "); digitalWrite (13, WYSOKI); przerwa; }
Po pomyślnym sparowaniu i włączeniu pinów GPIO musimy sprawdzić, czy urządzenie nadal jest w zasięgu. Ponieważ teraz urządzenie jest sparowane, usługa skanowania BLE nie będzie już mogła go zobaczyć. Znajdziemy go ponownie dopiero wtedy, gdy użytkownik opuści teren. Musimy więc po prostu przeskanować w poszukiwaniu serwera BLE i jeśli odkryjemy, musimy ustawić pin GPIO na niski, jak pokazano poniżej
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Serial. println ("Nasze urządzenie wyszło poza zasięg"); paired = false; Seryjny. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, NISKI); ESP.restart (); przerwa; }
Praca i testowanie
Gdy będziesz gotowy z programem i konfiguracją sprzętu, po prostu prześlij kod do ESP32 i zaaranżuj całą konfigurację, jak pokazano poniżej.
Powinieneś zauważyć, że lampa włącza się, gdy tylko zespół fitness (serwer) połączy się z ESP32. Możesz to również sprawdzić, zauważając symbol połączenia Bluetooth na opasce fitness. Po sparowaniu po prostu spróbuj odejść od ESP32, a po przekroczeniu 3-4 metrów zauważysz, że symbol Bluetooth na zegarku znika i połączenie zostało zerwane. Teraz, jeśli spojrzysz na lampę, zostanie ona wyłączona. Gdy wrócisz do środka, urządzenie zostanie ponownie sparowane i zapali się światło. Pełne działanie projektu można zobaczyć na poniższym filmie.
Mam nadzieję, że projekt Ci się podobał i po drodze nauczyłeś się czegoś nowego. Jeśli napotkałeś jakikolwiek problem z uruchomieniem go, napisz go na forach lub nawet w sekcji komentarzy poniżej