一進(jìn)入家門(mén)就自動(dòng)開(kāi)燈,離開(kāi)時(shí)又關(guān)掉燈,這是多么酷啊!是的,一個(gè)簡(jiǎn)單的應(yīng)用程序可以為您做到這一點(diǎn)。在這個(gè)項(xiàng)目中,我們將 ESP32 用作 BLE 客戶端,將健身手環(huán)用作 BLE 服務(wù)器,因此,每當(dāng)佩戴健身手環(huán)的人進(jìn)入 ESP32 藍(lán)牙范圍內(nèi)時(shí),ESP32 都會(huì)檢測(cè)到它并打開(kāi)燈。任何具有 BLE 服務(wù)器功能的藍(lán)牙設(shè)備都可以用作觸發(fā)設(shè)備,以使用 ESP32 控制任何家用電器。
我們將對(duì) ESP32 進(jìn)行編程,使其充當(dāng) BLE 客戶端,并不斷掃描 BLE 設(shè)備;如果我們?cè)诜秶鷥?nèi)找到健身帶,我們將嘗試連接到它,如果連接成功,我們可以通過(guò)切換ESP32上的一個(gè)GPIO引腳來(lái)觸發(fā)燈泡。該方法是可靠的,因?yàn)槊總€(gè)BLE服務(wù)器(健身帶)將具有唯一的硬件ID,因此沒(méi)有兩個(gè)BLE服務(wù)器設(shè)備是相同的。有趣的對(duì)吧?!!!現(xiàn)在,讓我們開(kāi)始構(gòu)建:
所需材料
ESP32 開(kāi)發(fā)板
交流負(fù)載(燈)
繼電器模塊
硬件
這個(gè) ESP32 BLE 客戶端項(xiàng)目的硬件非常簡(jiǎn)單,因?yàn)榇蠖鄶?shù)魔術(shù)都發(fā)生在代碼內(nèi)部。ESP32 必須在發(fā)現(xiàn)或丟失藍(lán)牙信號(hào)時(shí)切換交流燈(負(fù)載)。要切換此負(fù)載,我們將使用繼電器,由于 ESP32 的 GPIO 引腳僅兼容 3.3V,我們需要一個(gè)可以用 3.3V 驅(qū)動(dòng)的繼電器模塊。只需檢查繼電器模塊中使用的晶體管,如果它是BC548,你就可以按照下面的電路圖建立自己的電路。

警告:該電路直接處理220V交流電源電壓。小心帶電電線,并確保不會(huì)產(chǎn)生短路。你已被警告。
使用BC548而不是BC547或2N2222的原因是它們具有低基極發(fā)射極電壓,僅可在3.3V下觸發(fā)。這里使用的繼電器是5V繼電器,因此我們使用Vin引腳為其供電,該引腳從電源線中獲得5V。接地引腳連接到電路的接地。電阻 R1 1K 用作基極電流限制器電阻。相線連接到繼電器的NO引腳,繼電器的共引腳連接到負(fù)載,負(fù)載的另一端連接到中性線。您可以交換相位和中性的位置,但請(qǐng)注意不要直接做空它們。電流應(yīng)始終通過(guò)負(fù)載(燈泡)。我使用了一個(gè)繼電器模塊來(lái)保持簡(jiǎn)單,這里的負(fù)載是焦點(diǎn)LED燈。我的設(shè)置如下所示

如果您現(xiàn)在想跳過(guò)硬件,可以使用 GPIO 2 引腳而不是 GPIO 13 引腳來(lái)切換 ESP32 上的板載 LED。建議初學(xué)者使用此方法。
獲取服務(wù)器的藍(lán)牙地址(健身手環(huán)的地址)
如前所述,我們將對(duì) ESP32 進(jìn)行編程,使其充當(dāng)客戶端(類似于電話)并連接到我的健身手環(huán)(聯(lián)想 HW-01)的服務(wù)器。對(duì)于連接到服務(wù)器的客戶端,它必須知道服務(wù)器的藍(lán)牙地址。每個(gè)藍(lán)牙服務(wù)器,就像我的健身手環(huán)一樣,都有自己獨(dú)特的藍(lán)牙地址,這是永久性的。您可以將此與筆記本電腦或手機(jī)的 MAC 地址相關(guān)聯(lián)。
為了從服務(wù)器中獲取此地址,我們使用稱為nRF的應(yīng)用程序從北歐半導(dǎo)體連接,我們已經(jīng)在上一個(gè)教程中使用過(guò)。它免費(fèi)提供給IOS和安卓用戶。只需下載,啟動(dòng)應(yīng)用程序并掃描附近的藍(lán)牙設(shè)備。該應(yīng)用程序?qū)⒘谐鏊业降乃蠦LE設(shè)備。我的命名為HW-01,只需查看其名稱下方,您就會(huì)發(fā)現(xiàn)服務(wù)器的硬件地址,如下所示。

所以我的健身手環(huán)的 ESP32 BLE 硬件地址是 C7:F0:69:F0:68:81,您將擁有一組相同格式的不同數(shù)字。只需記下它,因?yàn)槲覀冊(cè)诰幊蘀SP32時(shí)需要它。
獲取服務(wù)器的服務(wù)和特征 UUID
好的,現(xiàn)在我們已經(jīng)使用BLE地址標(biāo)識(shí)了我們的服務(wù)器,但是為了與之通信,我們需要說(shuō)服務(wù)語(yǔ)言和特征,如果您閱讀了上一個(gè)教程,您將理解這一點(diǎn)。在本教程中,我將使用我的服務(wù)器的寫(xiě)入特征(健身帶)與它配對(duì)。因此,為了與設(shè)備配對(duì),我們需要服務(wù)廣告特征UUID,我們可以使用相同的應(yīng)用程序再次獲得它。
只需單擊應(yīng)用程序上的“連接”按鈕并搜索一些寫(xiě)入特征,應(yīng)用程序?qū)@示服務(wù) UUID 和特征 UUID。我的如下所示

在這里,我的服務(wù) UUID 和特征 UUID 是相同的,但它不必相同。記下服務(wù)器的 UUID。我的被記錄下來(lái)
Service UUID:
0000fee7-0000-1000-8000-00805f9b34fb
UUID: 0000fee7-0000-1000-8000-00805f9b34fb
使用寫(xiě)入特性不是強(qiáng)制性的;您可以使用應(yīng)用程序中顯示的服務(wù)器的任何有效服務(wù)和特征 UUID。
對(duì) ESP32 進(jìn)行編程,使其充當(dāng)鄰近感應(yīng)開(kāi)關(guān)應(yīng)用的客戶端
該程序的理念是使 ESP32 充當(dāng)客戶端,在找到我們的服務(wù)器(健身帶)時(shí)不斷掃描藍(lán)牙設(shè)備,驗(yàn)證硬件 ID,并通過(guò) GPIO 引腳 13 切換指示燈。好吧!!,但有一個(gè)問(wèn)題。所有BLE服務(wù)器的射程均為10米,這有點(diǎn)太多了。因此,如果我們?cè)噲D使接近開(kāi)關(guān)打開(kāi)打開(kāi)一扇門(mén)的燈,這個(gè)范圍非常高。
要縮小BLE服務(wù)器的范圍,我們可以使用配對(duì)選項(xiàng)。僅當(dāng) BLE 服務(wù)器和客戶端的距離在 3-4 米以內(nèi)時(shí),兩者才會(huì)保持配對(duì)狀態(tài)。這非常適合我們的應(yīng)用。因此,我們制造 ESP32 不僅是為了發(fā)現(xiàn) BLE 服務(wù)器,也是為了連接到它并確保它是否保持配對(duì)狀態(tài)。 本頁(yè)末尾提供了完整的 ESP32 BLE 示例程序來(lái)執(zhí)行相同的操作。下面,我將代碼分解成小片段并嘗試解釋它們。
在包含頭文件后,我們通知 ESP32 我們通過(guò) nRF 連接應(yīng)用程序獲得的 BLE 地址、服務(wù)和特征 UUID,如上面的標(biāo)題中所述。代碼如下所示
static BLEUUID serviceUUID("0000fee7-0000-1000-8000-00805f9b34fb"); //Service UUID of fitnessband obtained through nRF connect application
static BLEUUID charUUID("0000fee7-0000-1000-8000-00805f9b34fb"); //Characteristic UUID of fitnessband obtained through nRF connect application
String My_BLE_Address = "c7:f0:69:f0:68:81"; //Hardware Bluetooth MAC of my fitnessband, will vary for every band obtained through nRF connect application
其次,在程序中,我們有連接到服務(wù)器和我的廣告服務(wù)回?fù)?,我們稍后將返回。然后在設(shè)置函數(shù)內(nèi)部,我們初始化串行監(jiān)視器,并使ESP上的BLE掃描設(shè)備。掃描完成后,發(fā)現(xiàn)每個(gè)BLE設(shè)備,就會(huì)調(diào)用“我的廣告設(shè)備”回調(diào)功能。
我們還支持主動(dòng)掃描,因?yàn)槲覀兪褂弥麟娫礊?ESP32 供電,對(duì)于電池應(yīng)用,它已關(guān)閉以降低電流消耗。繼電器觸發(fā)引腳在我們的硬件中連接到GPIO 13,因此我們也聲明GPIO引腳13為輸出。
void setup() {
Serial.begin(115200); //Start serial monitor
Serial.println("ESP32 BLE Server program"); //Intro message
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //Call the class that is defined above
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
pinMode (13,OUTPUT); //Declare the in-built LED pin as output
}
在“我的廣告設(shè)備回調(diào)”功能中,我們打印行將列出發(fā)現(xiàn)的BLE設(shè)備的名稱和其他信息。我們需要發(fā)現(xiàn)的BLE設(shè)備的硬件ID,以便我們可以將其與所需的設(shè)備進(jìn)行比較。因此,我們使用變量Server_BLE_Address來(lái)獲取設(shè)備的地址,然后將其從BLE地址類型轉(zhuǎn)換為字符串。
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Scan Result: %s n", advertisedDevice.toString().c_str());
Server_BLE_Address = new BLEAddress(advertisedDevice.getAddress());
Scaned_BLE_Address = Server_BLE_Address->toString().c_str();
}
};
在循環(huán)函數(shù)中,我們掃描 3 秒鐘,并將結(jié)果放在發(fā)現(xiàn)的設(shè)備中,這是來(lái)自 BLEScanResults 的對(duì)象。如果我們通過(guò)掃描找到一個(gè)或多個(gè)設(shè)備,我們將開(kāi)始檢查發(fā)現(xiàn)的BLE地址是否與我們?cè)诔绦蛑休斎氲牡刂菲ヅ?。如果匹配是正?shù),并且設(shè)備未提前配對(duì),我們嘗試使用 connectToserver 函數(shù)對(duì)其進(jìn)行配對(duì)。我們還使用了一些串行語(yǔ)句來(lái)理解目的。
while (foundDevices.getCount() >= 1)
{
if (Scaned_BLE_Address == My_BLE_Address && paired == false)
{
Serial.println("Found Device :-)... connecting to Server as client");
if (connectToserver(*Server_BLE_Address))
{
在連接服務(wù)器功能中,我們使用 UUID 與 BLE 服務(wù)器(健身帶)配對(duì)。要連接服務(wù)器,ESP32 必須充當(dāng)客戶端,因此我們使用 createClient() 函數(shù)創(chuàng)建一個(gè)客戶端,然后連接到 BLE 服務(wù)器的地址。然后,我們使用 UUID 值搜索服務(wù)和特征,并嘗試連接到它。當(dāng)連接成功時(shí),該函數(shù)返回 true,如果不是,則返回 false。請(qǐng)注意,使用服務(wù)和特征 UUID 與服務(wù)器配對(duì)并不是強(qiáng)制性的,它只是為了便于您理解。
bool connectToserver (BLEAddress pAddress){
BLEClient* pClient = BLEDevice::createClient();
Serial.println(" - Created client");
// Connect to the BLE Server.
pClient->connect(pAddress);
Serial.println(" - Connected to fitnessband");
// Obtain a reference to the service we are after in the remote BLE server.
BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
if (pRemoteService != nullptr)
{
Serial.println(" - Found our service");
return true;
}
else
return false;
// Obtain a reference to the characteristic in the service of the remote BLE server.
pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
if (pRemoteCharacteristic != nullptr)
Serial.println(" - Found our characteristic");
return true;
}
如果連接成功,則GPIO引腳13變高,并使用中斷語(yǔ)句將控件發(fā)送到環(huán)路之外。配對(duì)的布爾變量也設(shè)置為 true。
if (connectToserver(*Server_BLE_Address))
{
paired = true;
Serial.println("********************LED turned ON************************");
digitalWrite (13,HIGH);
break;
}
配對(duì)成功并打開(kāi)GPIO引腳后,我們必須檢查設(shè)備是否仍在范圍內(nèi)。由于現(xiàn)在設(shè)備已配對(duì),因此BLE掃描服務(wù)將無(wú)法再看到它。只有當(dāng)用戶離開(kāi)該區(qū)域時(shí),我們才會(huì)再次找到它。因此,我們只需要掃描BLE服務(wù)器,如果我們發(fā)現(xiàn),則必須將GPIO引腳設(shè)置為低電平,如下所示
if (Scaned_BLE_Address == My_BLE_Address && paired == true)
{
Serial.println("Our device went out of range");
paired = false;
Serial.println("********************LED OOOFFFFF************************");
digitalWrite (13,LOW);
ESP.restart();
break;
}
工作和測(cè)試
完成程序和硬件設(shè)置后,只需將代碼上傳到 ESP32 并按如下所示安排整個(gè)設(shè)置即可。

您應(yīng)該注意到,一旦健身手環(huán)(服務(wù)器)與 ESP32 配對(duì),燈就會(huì)被打開(kāi)。您也可以通過(guò)注意健身手環(huán)上的連接藍(lán)牙符號(hào)來(lái)檢查這一點(diǎn)。配對(duì)后,只需嘗試離開(kāi) ESP32,當(dāng)您越過(guò) 3-4 米時(shí),您會(huì)注意到手表上的藍(lán)牙符號(hào)消失,連接丟失?,F(xiàn)在,如果你看一下燈,它將被關(guān)閉。當(dāng)您走回設(shè)備時(shí),設(shè)備會(huì)再次配對(duì)并打開(kāi)指示燈。
-
BLE
+關(guān)注
關(guān)注
13文章
780瀏覽量
66357 -
GPIO
+關(guān)注
關(guān)注
16文章
1329瀏覽量
56245 -
ESP32
+關(guān)注
關(guān)注
26文章
1198瀏覽量
21824
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)esp32 mesh provisioner和低功耗藍(lán)牙可以共存嗎?
請(qǐng)問(wèn)esp32的藍(lán)牙能不能保持超低功耗的監(jiān)聽(tīng)?
【藍(lán)牙4.1申請(qǐng)】低功耗藍(lán)牙手環(huán)
低功耗藍(lán)牙的應(yīng)用領(lǐng)域
藍(lán)牙網(wǎng)關(guān)在運(yùn)動(dòng)健身領(lǐng)域的應(yīng)用
請(qǐng)問(wèn)esp32的藍(lán)牙能不能保持超低功耗的監(jiān)聽(tīng)?
HC05 藍(lán)牙模塊 連接 ESP32 經(jīng)典藍(lán)牙
通用型WiFi和低功耗藍(lán)牙模組ESP32-C3的優(yōu)勢(shì)特征及應(yīng)用范例
將您的Magicbit(ESP32)連接到thingsboard
使用ESP32以簡(jiǎn)單且不安全的方式連接到AWS IoT
基于ESP32的低功耗藍(lán)牙暗室定時(shí)器
將ESP32藍(lán)牙低功耗連接到健身手環(huán)以觸發(fā)燈泡的方法
評(píng)論