一進入家門就自動開燈,離開時又關(guān)掉燈,這是多么酷?。∈堑?,一個簡單的應(yīng)用程序可以為您做到這一點。在這個項目中,我們將 ESP32 用作 BLE 客戶端,將健身手環(huán)用作 BLE 服務(wù)器,因此,每當(dāng)佩戴健身手環(huán)的人進入 ESP32 藍牙范圍內(nèi)時,ESP32 都會檢測到它并打開燈。任何具有 BLE 服務(wù)器功能的藍牙設(shè)備都可以用作觸發(fā)設(shè)備,以使用 ESP32 控制任何家用電器。
我們將對 ESP32 進行編程,使其充當(dāng) BLE 客戶端,并不斷掃描 BLE 設(shè)備;如果我們在范圍內(nèi)找到健身帶,我們將嘗試連接到它,如果連接成功,我們可以通過切換ESP32上的一個GPIO引腳來觸發(fā)燈泡。該方法是可靠的,因為每個BLE服務(wù)器(健身帶)將具有唯一的硬件ID,因此沒有兩個BLE服務(wù)器設(shè)備是相同的。有趣的對吧?!!!現(xiàn)在,讓我們開始構(gòu)建:
所需材料
ESP32 開發(fā)板
交流負載(燈)
繼電器模塊
硬件
這個 ESP32 BLE 客戶端項目的硬件非常簡單,因為大多數(shù)魔術(shù)都發(fā)生在代碼內(nèi)部。ESP32 必須在發(fā)現(xiàn)或丟失藍牙信號時切換交流燈(負載)。要切換此負載,我們將使用繼電器,由于 ESP32 的 GPIO 引腳僅兼容 3.3V,我們需要一個可以用 3.3V 驅(qū)動的繼電器模塊。只需檢查繼電器模塊中使用的晶體管,如果它是BC548,你就可以按照下面的電路圖建立自己的電路。
警告:該電路直接處理220V交流電源電壓。小心帶電電線,并確保不會產(chǎn)生短路。你已被警告。
使用BC548而不是BC547或2N2222的原因是它們具有低基極發(fā)射極電壓,僅可在3.3V下觸發(fā)。這里使用的繼電器是5V繼電器,因此我們使用Vin引腳為其供電,該引腳從電源線中獲得5V。接地引腳連接到電路的接地。電阻 R1 1K 用作基極電流限制器電阻。相線連接到繼電器的NO引腳,繼電器的共引腳連接到負載,負載的另一端連接到中性線。您可以交換相位和中性的位置,但請注意不要直接做空它們。電流應(yīng)始終通過負載(燈泡)。我使用了一個繼電器模塊來保持簡單,這里的負載是焦點LED燈。我的設(shè)置如下所示
如果您現(xiàn)在想跳過硬件,可以使用 GPIO 2 引腳而不是 GPIO 13 引腳來切換 ESP32 上的板載 LED。建議初學(xué)者使用此方法。
獲取服務(wù)器的藍牙地址(健身手環(huán)的地址)
如前所述,我們將對 ESP32 進行編程,使其充當(dāng)客戶端(類似于電話)并連接到我的健身手環(huán)(聯(lián)想 HW-01)的服務(wù)器。對于連接到服務(wù)器的客戶端,它必須知道服務(wù)器的藍牙地址。每個藍牙服務(wù)器,就像我的健身手環(huán)一樣,都有自己獨特的藍牙地址,這是永久性的。您可以將此與筆記本電腦或手機的 MAC 地址相關(guān)聯(lián)。
為了從服務(wù)器中獲取此地址,我們使用稱為nRF的應(yīng)用程序從北歐半導(dǎo)體連接,我們已經(jīng)在上一個教程中使用過。它免費提供給IOS和安卓用戶。只需下載,啟動應(yīng)用程序并掃描附近的藍牙設(shè)備。該應(yīng)用程序?qū)⒘谐鏊业降乃蠦LE設(shè)備。我的命名為HW-01,只需查看其名稱下方,您就會發(fā)現(xiàn)服務(wù)器的硬件地址,如下所示。
所以我的健身手環(huán)的 ESP32 BLE 硬件地址是 C7:F0:69:F0:68:81,您將擁有一組相同格式的不同數(shù)字。只需記下它,因為我們在編程ESP32時需要它。
獲取服務(wù)器的服務(wù)和特征 UUID
好的,現(xiàn)在我們已經(jīng)使用BLE地址標(biāo)識了我們的服務(wù)器,但是為了與之通信,我們需要說服務(wù)語言和特征,如果您閱讀了上一個教程,您將理解這一點。在本教程中,我將使用我的服務(wù)器的寫入特征(健身帶)與它配對。因此,為了與設(shè)備配對,我們需要服務(wù)廣告特征UUID,我們可以使用相同的應(yīng)用程序再次獲得它。
只需單擊應(yīng)用程序上的“連接”按鈕并搜索一些寫入特征,應(yīng)用程序?qū)@示服務(wù) UUID 和特征 UUID。我的如下所示
在這里,我的服務(wù) UUID 和特征 UUID 是相同的,但它不必相同。記下服務(wù)器的 UUID。我的被記錄下來
Service UUID:
0000fee7-0000-1000-8000-00805f9b34fb
UUID: 0000fee7-0000-1000-8000-00805f9b34fb
使用寫入特性不是強制性的;您可以使用應(yīng)用程序中顯示的服務(wù)器的任何有效服務(wù)和特征 UUID。
對 ESP32 進行編程,使其充當(dāng)鄰近感應(yīng)開關(guān)應(yīng)用的客戶端
該程序的理念是使 ESP32 充當(dāng)客戶端,在找到我們的服務(wù)器(健身帶)時不斷掃描藍牙設(shè)備,驗證硬件 ID,并通過 GPIO 引腳 13 切換指示燈。好吧!!,但有一個問題。所有BLE服務(wù)器的射程均為10米,這有點太多了。因此,如果我們試圖使接近開關(guān)打開打開一扇門的燈,這個范圍非常高。
要縮小BLE服務(wù)器的范圍,我們可以使用配對選項。僅當(dāng) BLE 服務(wù)器和客戶端的距離在 3-4 米以內(nèi)時,兩者才會保持配對狀態(tài)。這非常適合我們的應(yīng)用。因此,我們制造 ESP32 不僅是為了發(fā)現(xiàn) BLE 服務(wù)器,也是為了連接到它并確保它是否保持配對狀態(tài)。 本頁末尾提供了完整的 ESP32 BLE 示例程序來執(zhí)行相同的操作。下面,我將代碼分解成小片段并嘗試解釋它們。
在包含頭文件后,我們通知 ESP32 我們通過 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ù)回撥,我們稍后將返回。然后在設(shè)置函數(shù)內(nèi)部,我們初始化串行監(jiān)視器,并使ESP上的BLE掃描設(shè)備。掃描完成后,發(fā)現(xiàn)每個BLE設(shè)備,就會調(diào)用“我的廣告設(shè)備”回調(diào)功能。
我們還支持主動掃描,因為我們使用主電源為 ESP32 供電,對于電池應(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è)備進行比較。因此,我們使用變量Server_BLE_Address來獲取設(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è)備中,這是來自 BLEScanResults 的對象。如果我們通過掃描找到一個或多個設(shè)備,我們將開始檢查發(fā)現(xiàn)的BLE地址是否與我們在程序中輸入的地址匹配。如果匹配是正數(shù),并且設(shè)備未提前配對,我們嘗試使用 connectToserver 函數(shù)對其進行配對。我們還使用了一些串行語句來理解目的。
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ù)器(健身帶)配對。要連接服務(wù)器,ESP32 必須充當(dāng)客戶端,因此我們使用 createClient() 函數(shù)創(chuàng)建一個客戶端,然后連接到 BLE 服務(wù)器的地址。然后,我們使用 UUID 值搜索服務(wù)和特征,并嘗試連接到它。當(dāng)連接成功時,該函數(shù)返回 true,如果不是,則返回 false。請注意,使用服務(wù)和特征 UUID 與服務(wù)器配對并不是強制性的,它只是為了便于您理解。
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變高,并使用中斷語句將控件發(fā)送到環(huán)路之外。配對的布爾變量也設(shè)置為 true。
if (connectToserver(*Server_BLE_Address))
{
paired = true;
Serial.println("********************LED turned ON************************");
digitalWrite (13,HIGH);
break;
}
配對成功并打開GPIO引腳后,我們必須檢查設(shè)備是否仍在范圍內(nèi)。由于現(xiàn)在設(shè)備已配對,因此BLE掃描服務(wù)將無法再看到它。只有當(dāng)用戶離開該區(qū)域時,我們才會再次找到它。因此,我們只需要掃描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;
}
工作和測試
完成程序和硬件設(shè)置后,只需將代碼上傳到 ESP32 并按如下所示安排整個設(shè)置即可。
您應(yīng)該注意到,一旦健身手環(huán)(服務(wù)器)與 ESP32 配對,燈就會被打開。您也可以通過注意健身手環(huán)上的連接藍牙符號來檢查這一點。配對后,只需嘗試離開 ESP32,當(dāng)您越過 3-4 米時,您會注意到手表上的藍牙符號消失,連接丟失?,F(xiàn)在,如果你看一下燈,它將被關(guān)閉。當(dāng)您走回設(shè)備時,設(shè)備會再次配對并打開指示燈。
-
BLE
+關(guān)注
關(guān)注
12文章
661瀏覽量
59471 -
GPIO
+關(guān)注
關(guān)注
16文章
1215瀏覽量
52231 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17417
發(fā)布評論請先 登錄
相關(guān)推薦
評論