- Ön koşullar
- Gerekli malzemeler
- Donanım
- Sunucunun Bluetooth Adresini Alın (Fitness bandının adresi)
- Sunucunun Hizmet ve Karakteristik UUID'sini elde etme
- ESP32'yi Proximity Switch Uygulaması için bir istemci görevi görecek şekilde programlama
- Çalışma ve Test
Evinize girer girmez ışıkları otomatik olarak yakmak ve çıkarken tekrar kapatmak ne kadar havalı! Evet, basit bir uygulama bunu sizin için yapabilir. Burada bu projede, BLE istemcisi olarak ESP32'yi ve BLE sunucusu olarak fitness bandını kullanacağız, böylece fitness bandını takan bir kişi ESP32 Bluetooth'un menziline girdiğinde, ESP32 onu algılar ve Işığı açar. BLE sunucu özelliklerine sahip herhangi bir Bluetooth cihazı, ESP32 kullanarak herhangi bir ev aletini kontrol etmek için bir tetik cihazı olarak kullanılabilir.
ESP32 modülünün BLE (Bluetooth Low Energy) işlevlerini zaten araştırdık ve bundan oldukça heyecanlandım. Özetlemek gerekirse, bu modül hem klasik Bluetooth hem de Bluetooth Düşük Enerji'ye (BLE) sahiptir, klasik Bluetooth şarkıları veya dosyaları aktarmak için kullanılabilir ve BLE seçeneği, Bluetooth işaretçileri, fitness bantları, yakınlık s gibi pille optimize edilmiş uygulamalar için kullanılabilir., vb. Basit mikrodenetleyici projeleri için HC-05 veya HC-06 modülleri gibi seri Bluetooth olarak kullanmak da mümkündür.
Bildiğiniz gibi ESP32 BLE iki farklı modda çalışabilir. Biri, bir pil seviyesi göstergesi hizmetini taklit etmek için GATT hizmetini kullanarak daha önce tartıştığımız sunucu modudur. Bu alıştırmada, ESP32 bir sunucu olarak hareket etti ve cep telefonumuz bir istemci olarak hareket etti. Şimdi, ESP32'yi bir istemci olarak çalıştıralım ve onu fitness bandım gibi diğer BLE sunucularına bağlamayı deneyelim.
Fitness grubum dahil tüm BLE sunucuları, bir müşteri tarafından tarandığında her zaman keşfedilebilecekleri için sürekli reklam modundadır. Bu özelliği kullanarak, bu fitness bantlarını bir yakınlık anahtarı olarak kullanabiliriz, yani bu fitness bantları her zaman kullanıcının eline bağlıdır ve bandı tarayarak kişinin menzil içinde olup olmadığını tespit edebiliriz. Bu yazıda yapacağımız tam olarak budur. ESP32'yi bir BLE istemcisi olarak hareket edecek ve sürekli olarak BLE cihazlarını taramaya devam edecek şekilde programlayacağız; Fitness bandını menzil içinde bulursak ona bağlanmayı deneyeceğiz ve bağlantı başarılı olursa ESP32'deki GPIO pinlerinden birini değiştirerek bir ampulü tetikleyebiliriz. Yöntem güvenilirdir çünkü her BLE sunucusu(fitness bandı) benzersiz bir donanım kimliğine sahip olacaktır, bu nedenle iki BLE sunucu cihazı aynı olmayacaktır. İlginç değil mi? !!! Şimdi inşa etmeye başlayalım
Ön koşullar
Bu makalede, ESP32 eğitimine geri dönmüyorsa, ESP32 kartını Arduino IDE ile nasıl kullanacağınıza zaten aşina olduğunuzu varsayıyorum.
Anlama kolaylığı için eksiksiz ESP32 Bluetooth'u üç bölüme ayırdık. Bu nedenle, buna başlamadan önce ilk iki öğreticiden geçmeniz önerilir.
- ESP32'de Seri Bluetooth, Cep Telefonundan LED geçişi
- GATT Hizmetini kullanarak Pil seviyesi verilerini Cep Telefonuna göndermek için BLE sunucusu
- BLE istemcisi, BLE cihazlarını tarar ve bir işaretçi görevi görür.
İlk iki öğreticiyi zaten ele aldık, burada ESP32'yi BLE istemcisi olarak açıklamak için sonuncusuna geçiyoruz.
Gerekli malzemeler
- ESP32 Geliştirme Kurulu
- AC Yükü (Lamba)
- Röle Modülü
Donanım
Bu ESP32 BLE Client projesinin donanımı, sihrin çoğu kodun içinde gerçekleştiği için oldukça basittir. Bluetooth sinyali keşfedildiğinde veya kaybolduğunda ESP32 bir AC lambasını (Yük) değiştirmelidir. Bu yükü değiştirmek için bir Röle kullanacağız ve ESP32'nin GPIO pinleri sadece 3.3V uyumlu olduğu için 3.3V ile çalıştırılabilen bir Röle modülüne ihtiyacımız var. Sadece Röle modülünde hangi transistörün kullanıldığını kontrol edin BC548 ise, aşağıdaki devre şemasını izleyerek kendi devrenizi kurabilirsiniz.
Uyarı: Devre doğrudan 220V AC şebeke voltajı ile ilgilidir. Canlı kablolara dikkat edin ve kısa devre oluşturmadığınızdan emin olun. Uyarıldın.
BC548'i BC547 veya 2N2222 üzerinden kullanmanın arkasındaki sebep, bunların yalnızca 3,3V ile tetiklenebilen düşük bir baz emitör voltajına sahip olmalarıdır. Burada kullanılan röle bir 5V röle olduğunu biz 5V güç kablosunu oluştururlar alır Vin raptiye ile güç yüzden. Toprak pimi, devrenin toprağına bağlanır. Direnç R1 1K bir baz akım sınırlayıcı direnci olarak kullanılır. Faz teli, Rölenin NO pinine bağlanır ve Rölenin Ortak pini yüke bağlanır ve yükün diğer ucu Nötr'e bağlanır. Phase ve Neutral'ın konumunu değiştirebilirsiniz, ancak onları doğrudan kısaltmamaya dikkat edin. Akım her zaman Yük (Ampul) içinden geçmelidir .İşleri basitleştirmek için bir Röle modülü kullandım ve buradaki yük bir Focus LED lambası. Kurulumum aşağıdaki gibi görünüyor
Donanımı şimdilik atlamak istiyorsanız, ESP32 üzerindeki yerleşik LED'i değiştirmek için GPIO 13 pin yerine GPIO 2 pinini kullanabilirsiniz. Bu yöntem yeni başlayanlar için önerilir.
Sunucunun Bluetooth Adresini Alın (Fitness bandının adresi)
Daha önce de belirtildiği gibi, ESP32'yi bir istemci olarak (telefona benzer) hareket edecek ve fitness grubum olan bir sunucuya (Lenovo HW-01) bağlanacak şekilde programlayacağız. Bir istemcinin sunucuya bağlanması için sunucunun Bluetooth adresini bilmesi gerekir. Buradaki fitness grubum gibi her Bluetooth sunucusu, kalıcı olan kendi benzersiz Bluetooth adresine sahiptir. Bunu Dizüstü bilgisayarınızın veya cep telefonunuzun MAC adresiyle ilişkilendirebilirsiniz.
Bu Adresi sunucudan almak için önceki eğitimimizde zaten kullandığımız Nordic yarı iletkenlerinden nRF connect adlı uygulamayı kullanıyoruz. Hem IOS hem de Android kullanıcıları için ücretsiz olarak mevcuttur. İndirmeniz, uygulamayı başlatmanız ve yakındaki Bluetooth cihazlarını aramanız yeterlidir. Uygulama bulduğu tüm BLE cihazlarını listeleyecektir. Mine HW-01 olarak adlandırılmıştır, isminin altına basitçe bakın ve aşağıda gösterildiği gibi sunucunun donanım adresini bulacaksınız.
Dolayısıyla fitness grubumun ESP32 BLE donanım adresi C7: F0: 69: F0: 68: 81, aynı formatta farklı bir sayı kümesine sahip olacaksınız. ESP32'imizi programlarken ihtiyacımız olacağı için not edin.
Sunucunun Hizmet ve Karakteristik UUID'sini elde etme
Tamam, şimdi sunucumuzu BLE adresini kullanarak tanımladık, ancak onunla iletişim kurmak için, önceki öğreticiyi okursanız anlayacağınız Hizmet dilini ve özelliklerini konuşmamız gerekiyor. Bu eğitimde sunucumun (fitness band) yazma özelliğini onunla eşleştirmek için kullanıyorum. Bu nedenle, cihazla eşleştirmek için, aynı uygulama ile tekrar elde edebileceğimiz Service ad Characteristic UUID'ye ihtiyacımız var.
Uygulamanızdaki bağlan düğmesine tıklayın ve uygulamanın hizmet UUID'sini ve karakteristik UUID'yi görüntüleyeceği bazı yazma özelliklerini arayın. Benimki aşağıda gösterilmiştir
Burada Hizmet UUID'im ve Karakteristik UUID'm aynıdır, ancak aynı olmak zorunda değildir. Sunucunuzun UUID'sini not edin. Benimki şu şekilde not edildi
Hizmet UUID'si: 0000fee7-0000-1000-8000-00805f9b34fb Karakteristik UUID: 0000fee7-0000-1000-8000-00805f9b34fb
Yazma özelliklerinin kullanılması zorunlu değildir; uygulamada gösterilen herhangi bir geçerli hizmeti ve sunucunun karakteristik UUID'sini kullanabilirsiniz.
ESP32'yi Proximity Switch Uygulaması için bir istemci görevi görecek şekilde programlama
Programın amacı, ESP32'nin sunucumuzu (fitness bandını) bulduğunda Bluetooth cihazlarını taramaya devam eden bir istemci gibi davranmasını sağlamaktır, donanım kimliğini doğrular ve ışığı GPIO pini 13 aracılığıyla değiştirir. Peki tamam! !, ancak bununla ilgili bir sorun var. Tüm BLE sunucuları, biraz fazla olan 10 metrelik bir menzile sahip olacaktır. Yani bir kapıyı açarken ışığı yakmak için yakınlık anahtarı yapmaya çalışıyorsak bu aralık çok yüksektir.
BLE sunucusunun aralığını azaltmak için eşleştirme seçeneğini kullanabiliriz. Bir BLE sunucusu ve istemcisi, yalnızca her ikisi de 3-4 Metre uzaklıktaysa eşleşmiş olarak kalacaktır. Uygulamamız için mükemmel. Bu yüzden, ESP32'yi sadece BLE sunucusunu keşfetmek için değil, aynı zamanda ona bağlanmak ve eşleşmiş olarak kalmasını sağlamak için yapıyoruz. Eşleştirildikleri sürece AC lambası açık kalacaktır, aralık eşleştirmeyi aştığında kaybolacak ve lamba sönecektir. Aynısını yapmak için eksiksiz ESP32 BLE örnek programı bu sayfanın sonunda verilmiştir. Aşağıda, kodu küçük parçalara ayıracağım ve onları açıklamaya çalışacağım.
Başlık dosyasını ekledikten sonra ESP32'yi yukarıdaki başlıklarda anlatıldığı gibi nRF connect uygulaması ile elde ettiğimiz BLE adresi, Hizmeti ve karakteristik UUID hakkında bilgilendiriyoruz. Kod aşağıdaki gibi görünüyor
statik BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // nRF bağlantı uygulaması statik BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb") aracılığıyla elde edilen uygunluk bandının hizmet UUID'si ; // nRF bağlantı uygulaması aracılığıyla elde edilen uygunluk bandının karakteristik UUID'si String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // Fitness bandımın Donanım Bluetooth MAC'si , nRF bağlantı uygulaması aracılığıyla elde edilen her bant için değişecektir
Bunun ardından programda daha sonra geri döneceğimiz connectToserver ve MyAdvertisedDeviceCallback'e sahibiz. Daha sonra kurulum işlevinin içinde, seri monitörü başlatırız ve ESP üzerinde BLE'yi cihazı taraması için yaparız. Her BLE cihazı için tarama tamamlandıktan sonra MyAdvertisedDeviceCallbacks işlevi çağrılır.
ESP32'yi şebeke gücüyle çalıştırdığımız için aktif taramayı da etkinleştiriyoruz, pil uygulaması için akım tüketimini azaltmak için kapatılıyor. Relay tetik pimi donanımımızda GPIO 13'e bağlıdır, bu yüzden GPIO pin 13'ün de çıkış olarak olduğunu beyan ederiz.
geçersiz kurulum () { Serial.begin (115200); // Seri izlemeyi başlat Serial.println ("ESP32 BLE Sunucu programı"); // Giriş mesajı BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // yeni tarama pBLEScan-> setAdvertisedDeviceCallbacks (yeni MyAdvertisedDeviceCallbacks ()) oluştur; // pBLEScan-> setActiveScan (true) üzerinde tanımlanan sınıfı çağırın ; // aktif tarama daha fazla güç kullanır, ancak sonuçları daha hızlı alır pinMode (13, OUTPUT); // Yerleşik LED pinini çıktı olarak bildirin }
İçinde MyAdvertisedDeviceCallbacks işlev, biz adını ve keşfedildi BLE cihazların diğer bilgileri listeler çizgiyi basmak. Bulunan BLE cihazının donanım kimliğine ihtiyacımız var, böylece onu istenen cihazla karşılaştırabiliriz. Yani biz değişken kullanmak Server_BLE_Address cihazın adresini almak için ve sonra da dize tipi BLEAddress biçimlerine dönüştürebilirsiniz.
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) { Serial.printf ("Tarama Sonucu:% s \ n", adsedDevice.toString (). c_str ()); Server_BLE_Address = yeni BLEAddress (reklamı yapılanDevice.getAddress ()); Scaned_BLE_Address = Sunucu_BLE_Address-> toString (). C_str (); } };
Döngü işlevinin içinde 3 saniye tararız ve sonucu BLEScanResults'tan bir nesne olan foundDevices'in içine koyarız. Tarayarak bir veya birden fazla cihaz bulursak, keşfedilen BLE adresinin programa girdiğimiz adresle eşleşip eşleşmediğini kontrol etmeye başlarız. Eşleşme pozitifse ve cihaz daha önce eşleştirilmemişse, connectToserver işlevini kullanarak onunla eşleştirmeyi deneriz. Ayrıca anlamak için birkaç Seri ifade kullandık.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println ("Bulunan Aygıt: -)… İstemci olarak Sunucuya bağlanılıyor"); if (connectToserver (* Server_BLE_Address)) {
İçinde connectToserver fonksiyonu biz BLE sunucu ile çiftine UUID faydalanmak (spor bandı). Bir sunucuya bağlanmak için, ESP32'nin bir istemci gibi davranması gerekir, bu nedenle createClient () işlevini kullanarak bir istemci oluştururuz ve ardından BLE sunucusunun adresine bağlanırız. Ardından UUID değerlerini kullanarak hizmeti ve karakteristiği arar ve ona bağlanmayı deneriz. Bağlantı başarılı olduğunda işlev bir true döndürür ve değilse yanlış döndürür. Bir sunucuyla eşleştirmek için hizmet ve karakteristik UUID'ye sahip olmanın zorunlu olmadığını unutmayın, yalnızca anlayışınız için yapılır.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("- Oluşturulan istemci"); // BLE Sunucusuna bağlanın. pClient-> connect (pAddress); Serial.println ("- Fitnessband'a bağlı"); // Uzak BLE sunucusunda peşinde olduğumuz hizmete bir referans alın. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("- Hizmetimizi bulundu"); doğruya dön; } aksi takdirde yanlış döndürür; // Uzak BLE sunucusunun hizmetindeki karakteristiğe bir referans alın. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("- Karakteristiğimizi bulduk"); doğruya dön; }
Bağlantı başarılı olursa, GPIO pini 13 yüksek yapılır ve kontrol, break deyimi kullanılarak döngünün dışına gönderilir. Eşleştirilmiş Boole değişkeni de doğru olacak şekilde ayarlanmıştır.
eğer (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("******************** LED AÇIK ********************** ** "); digitalWrite (13, YÜKSEK); kırmak; }
Eşleştirme başarılı olduktan ve GPIO pini açıldıktan sonra, cihazın hala kapsama alanında olup olmadığını kontrol etmeliyiz. Artık cihaz eşleştirildiği için, BLE tarama hizmeti artık onu göremeyecek. Sadece kullanıcı alanı terk ettiğinde tekrar bulacağız. Bu yüzden sadece BLE sunucusunu taramamız gerekiyor ve eğer aşağıda gösterildiği gibi GPIO pinini düşük olarak ayarlamamız gerektiğini keşfedersek.
eğer (Scaned_BLE_Address == My_BLE_Address && paired == true) { Seri. println ("Cihazımız menzil dışına çıktı"); eşleştirilmiş = yanlış; Seri. println ("******************** LED OOOFFFFF *************************"); digitalWrite (13, DÜŞÜK); ESP.restart (); kırmak; }
Çalışma ve Test
Programa ve donanım kurulumuna hazır olduğunuzda, kodu ESP32'ye yükleyin ve tüm kurulumu aşağıda gösterildiği gibi düzenleyin.
Fitness bandı (sunucu) ESP32 ile eşleşir eşleşmez Lambanın açıldığını fark etmelisiniz. Bunu, fitness bandındaki bağlantı Bluetooth sembolünü fark ederek de kontrol edebilirsiniz. Eşleştirildikten sonra ESP32'den uzaklaşmayı deneyin ve 3-4 metreyi geçtiğinizde saatin üzerindeki Bluetooth sembolünün kaybolduğunu ve bağlantının kesildiğini göreceksiniz. Şimdi, lambaya bakarsanız sönecek. Geri döndüğünüzde cihaz yeniden eşleştirilir ve ışık yanar. Projenin tam çalışması aşağıdaki videoda bulunabilir.
Umarım projeden keyif almışsınızdır ve yolda yeni bir şeyler öğrenmişsinizdir. Çalışmasını sağlamakta herhangi bir sorunla karşılaştıysanız, sorunu forumlarda veya aşağıdaki yorum bölümünde yayınlamaktan çekinmeyin.