在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何利用ESP32和Arduino制作BLE檢測器

科技觀察員 ? 來源:circuitdigest ? 作者:Debashis Das ? 2022-08-09 17:15 ? 次閱讀

接近傳感器可以描述為一種借助光、電磁場或聲音檢測附近物體的開關。通常,這些類型的設備旨在檢測附近的對象,并且大多數這些傳感器將用于實際應用中。但是在某些情況下,對象遠離傳感器或對象被遮擋障礙物,在這些類型的情況下,我們可以使用BLE(低功耗藍牙)設備來檢測和感知物體的接近度。 ESP32 開發板內置 BLE,我們在很多其他項目中都使用過。

在本文中,我將向您展示如何在ESP32 和 Arduino 的幫助 下制作一個簡單的BLE 存在檢測器,最后,我們將在我的智能手機智能手表上使用 BLE 測試這些設備。

什么是低功耗藍牙 (BLE)?

BLE 代表低功耗藍牙,它于 2011 年進入我們的日常生活,因為每年的那個時候,每個主要制造商都開始在他們的設備中嵌入 BLE 技術。BLE 是一種低功耗無線通信技術,專為電池供電應用而開發,可用于短距離設備之間的通信。您每天使用的一些設備都內置了藍牙,例如您的智能手機、智能手表、無線 耳塞、無線 揚聲器、智能 家居 設備。,以及更多的嵌入式藍牙進行通信或獲取位置數據。

BLE 是一項相對較新的技術,BLE 協議是由藍牙特別興趣小組 (SIG)開發的,其主要目標是使低功耗設備成為現實。雖然新開發的協議名稱保持不變,但新開發的 BLE 協議不向后兼容,這意味著我們的藍牙經典設備無法與 BLE 設備通信,盡管該技術存在缺點,但它使開發人員能夠產生非常低的功率能量- 使用小型紐扣電池可持續數月甚至數年的高效設備。

BLE 通信如何工作?

BLE 使用分層數據結構來發送和接收信息。充當服務器的 BLE 設備將發布客戶端可以檢測到的服務和特征,一旦信息交換成功,BLE 設備可以同時相互通信。用技術術語來說,這個信息堆棧一起被稱為 BLE 設備的屬性。它是使用 GATT(通用屬性)配置文件定義和實現的。在這些配置文件中,我們按層次順序排列了服務、特征和值。服務包含特征,特征包含值,通過讀取特征,我們可以讀取值和值隨時間的變化。

pYYBAGLyJLuAARXlAAF58oVg1ME310.png

可以處理特征以包括讀取或寫入信息。包含讀取組件的設備可以發布信息,包含寫入特性的設備可以從客戶端接收數據。

定義服務和特性的GATT 配置文件稱為通用唯一標識符 (UUID)。SIG 公司定義和保留了一些標準服務和特性,如果我們讀取 BLE 設備的 UUID,我們可以立即知道它是什么類型的設備。稍后再討論這個話題。

BLE 數據以非常小的封裝傳輸和接收,當TCP 數據包為 60 字節或更多時,BLE 數據包總共只有 31 字節。最后,要記住的重要一點是,BLE 數據包需要正確構造,然后可以在服務器端和客戶端一致地序列化和反序列化。

BLE 接近傳感器如何工作?

正如我之前所說,接近傳感器可以借助光、電磁波或聲音來檢測物體。之前我們已經制作了一些基于PIR 傳感器和IR 傳感器的項目,如果您想了解更多有關該主題的信息,可以查看這些項目。

poYBAGLyJMCAMWXOAADbniGfCFE846.png

BLE 服務器定期廣播廣告信號,以便客戶端可以搜索并連接到它。這個廣播信號包含一個唯一的 BLE MAC(媒體訪問控制)地址,它與Wi-Fi 中使用的 MAC 地址非常相似,因為我們的 ESP32 模塊內置了藍牙,我們可以很容易地檢測到這個廣播信號并將其與查找表,以檢測已知設備的存在。驗證設備后,我們可以在本地打開燈,也可以使用 Adafruit IO在我們的 android 應用程序上觸發通知。我們之前也用 Adafruit IO 做過項目,如果你想實現 Adafruit IO,可以查看這些項目。

這個項目的要求?

pYYBAGLyJMmAAffoAAU8nukT6As534.png

正如您在上圖中看到的,對這個項目沒有太多要求,一個 esp32 開發板和一個支持 BLE 的設備,這里我使用的是我的 MI Band,就是這樣。

ESP32 BLE 接近傳感器的 Arduino 代碼

在演示中,我們將對 ESP32 控制器進行編程以感應已知的 BLE 信標,一旦已知設備接近,我們將點亮板載 LED??梢栽诒卷摰撞空业綀绦写瞬僮鞯耐暾绦颉4a解釋如下。

我們通過添加所需的頭文件并聲明變量來開始我們的程序。

當我們使用 BLEScan 類時,我們需要包含 BLEScan 的頭文件以及其他 BLE 頭文件。

#include 
#include 
#include 
#include 

接下來,我們將聲明一些變量,首先是我們存儲已知 BLE MAC 地址的數組。接下來,我們將聲明閾值,打破將觸發所需操作的閾值。接下來,我們將定義一個布爾值,如果我們數組中的已知設備與掃描的設備列表匹配,它將設置為 true。接下來,我們聲明另一個變量來清除已掃描的 BLE 設備,如果我們不這樣做,就會出現內存問題。接下來,我們獲取一個指向 BLEScan 類的指針。

字符串 knownBLEAddresses[] = {"aa:bc:cc:dd:ee:ee", "54:2c:7b:87:71:a2"};
int RSSI_THRESHOLD = -55;
bool device_found;
整數掃描時間 = 5;//片刻之間
BLEScan* pBLEScan;

我們必須定義一個回調函數,首先,這個回調函數將每隔幾秒調用一次,以檢查是否有新的 BLE 設備可用。一旦我們進入回調函數,如果我們找到一個 BLE 設備,我們將設置一個標志并中斷循環。最后,我們將打印 BLE 設備信息。

類 MyAdvertisedDeviceCallbacks:公共 BLEAdvertisedDeviceCallbacks {
    無效 onResult(BLEAdvertisedDevice 廣告設備){
      for (int i = 0; i < (sizeof(knownBLEAddresses) / sizeof(knownBLEAddresses[0])); i++)
      {
        //取消注釋以啟用調試信息
        //Serial.println("*************開始**************");
        //Serial.println(sizeof(knownBLEAddresses));
        //Serial.println(sizeof(knownBLEAddresses[0]));
        //Serial.println(sizeof(knownBLEAddresses)/sizeof(knownBLEAddresses[0]));
        //Serial.println(advertisedDevice.getAddress().toString().c_str());
        //Serial.println(knownBLEAddresses[i].c_str());
        //Serial.println("*************結束**************");
        if (strcmp(advertisedDevice.getAddress().toString().c_str(), knownBLEAddresses[i].c_str()) == 0)
                        {
          device_found = true;
                          休息;
                        }
        別的
          device_found = 假;
      }
      Serial.printf("廣告設備:%s \n", AdvertisementdDevice.toString().c_str());
    }
};

接下來是設置部分,我們將LED 引腳聲明為輸出。此外,我們使用BLEDevice::init 方法初始化BLEDevice,之后,我們從 BLEDevice 獲取掃描對象,我們將地址存儲到先前聲明的pBLEScan 指針中。

接下來,我們設置回調函數,這個回調函數會在幾秒鐘內調用一次,檢查是否有新設備可用,接下來我使用SetActiveScan方法將其設置為非活動模式,因為如果我們啟用此功能,BLE 設備將為我們提供非常準確的結果。最后我們設置setInterval和setWindow方法來完成設置。

  序列號.開始(115200);//在ESP32上啟用UART
  Serial.println("正在掃描..."); // 打印掃描
  pinMode(LED_BUILTIN,輸出);//
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //創建新的掃描
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //初始化回調函數
  pBLEScan->setActiveScan(true); //主動掃描消耗更多的能量,但更快地得到結果
  pBLEScan->setInterval(100); // 設置掃描間隔
  pBLEScan->setWindow(99); // 小于或等于 setInterval 值

在循環部分,我們使用start 方法啟動 BLE 設備。scanTime參數定義了 BLE 設備掃描新設備所需的時間。

BLEScanResults foundDevices = pBLEScan->start(scanTime, false);

掃描完成后,我們將其放入名為foundDevices的變量中。

掃描完成后,我們可以使用found devices.getCount()方法獲取掃描儀找到了多少個設備,我們方便地將其放入for 循環中,逐個獲取每個設備的 RSSI 值,然后,我們比較該設備是否與列表中的設備匹配,我們使用一個簡單的if語句來做到這一點。如果我們得到一個已知設備,我們會點亮板載 LED,以表明我們在列表中找到了一個已知設備。否則我們會關閉 LED。

for (int i = 0; i < foundDevices.getCount(); i++)
  {
    BLEAdvertisedDevice device = foundDevices.getDevice(i);
    int rssi = device.getRSSI();
    Serial.print("RSSI:");
    序列號.println(rssi);
    如果(rssi > RSSI_THRESHOLD && device_found == true)
      數字寫入(LED_BUILTIN,高);
    別的
      數字寫入(LED_BUILTIN,低);
  }

最后,我們通過調用 -

clearResults() 方法
pBLEScan->clearResults(); // 從BLEScan緩沖區中刪除結果以釋放內存

上傳代碼后,如果已知設備靠近您的 ESP32 設備,您可以觸發任何操作。完整的工作也可以在此頁面的底部找到。

#include
#include
#include
#include
字符串 knownBLEAddresses[] = {"6E:bc:55:18:cf:7b", "53:3c:cb:56:36:02", "40:99:4b:75:7d:2f", "5c :5b:68:6f:34:96"};
int RSSI_THRESHOLD = -55;
bool device_found;
整數掃描時間 = 5;//片刻之間
BLEScan* pBLEScan;
類 MyAdvertisedDeviceCallbacks:公共 BLEAdvertisedDeviceCallbacks {
無效 onResult(BLEAdvertisedDevice 廣告設備){
for (int i = 0; i < (sizeof(knownBLEAddresses) / sizeof(knownBLEAddresses[0])); i++)
{
//取消注釋以啟用調試信息
//Serial.println("*************開始**************");
//Serial.println(sizeof(knownBLEAddresses));
//Serial.println(sizeof(knownBLEAddresses[0]));
//Serial.println(sizeof(knownBLEAddresses)/sizeof(knownBLEAddresses[0]));
//Serial.println(advertisedDevice.getAddress().toString().c_str());
//Serial.println(knownBLEAddresses[i].c_str());
//Serial.println("*************結束**************");
if (strcmp(advertisedDevice.getAddress().toString().c_str(), knownBLEAddresses[i].c_str()) == 0)
{
device_found = true;
休息;
}
別的
device_found = 假;
}
Serial.printf("廣告設備:%s \n", AdvertisementdDevice.toString().c_str());
}
};
無效設置(){
序列號.開始(115200);//在ESP32上啟用UART
Serial.println("正在掃描..."); // 打印掃描
pinMode(LED_BUILTIN,輸出);//使 BUILTIN_LED 引腳作為輸出
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //創建新的掃描
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //初始化回調函數
pBLEScan->setActiveScan(true); //主動掃描消耗更多的能量,但更快地得到結果
pBLEScan->setInterval(100); // 設置掃描間隔
pBLEScan->setWindow(99); // 小于或等于 setInterval 值
}
無效循環(){
// 把你的主要代碼放在這里,重復運行:
BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
for (int i = 0; i < foundDevices.getCount(); i++)
{
BLEAdvertisedDevice device = foundDevices.getDevice(i);
int rssi = device.getRSSI();
Serial.print("RSSI:");
序列號.println(rssi);
如果(rssi > RSSI_THRESHOLD && device_found == true)
數字寫入(LED_BUILTIN,高);
別的
數字寫入(LED_BUILTIN,低);
}
pBLEScan->clearResults(); // 從BLEScan緩沖區中刪除結果以釋放內存
}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 檢測器
    +關注

    關注

    1

    文章

    887

    瀏覽量

    48432
  • BLE
    BLE
    +關注

    關注

    12

    文章

    694

    瀏覽量

    60403
  • Arduino
    +關注

    關注

    189

    文章

    6492

    瀏覽量

    190151
  • ESP32
    +關注

    關注

    20

    文章

    1008

    瀏覽量

    18855
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    ESP32ESP8266基于Arduino的MQTT收發資料說明

    本文檔的主要內容詳細介紹的是ESP32ESP8266基于Arduino的MQTT收發資料說明。
    發表于 01-24 08:00 ?109次下載
    <b class='flag-5'>ESP32</b>和<b class='flag-5'>ESP</b>8266基于<b class='flag-5'>Arduino</b>的MQTT收發資料說明

    使用Arduino制作檢測PM2.5檢測器的程序詳細資料免費下載

    本文檔的主要內容詳細介紹的是使用Arduino制作檢測PM2.5檢測器的程序詳細資料免費下載。
    發表于 02-26 08:00 ?9次下載
    使用<b class='flag-5'>Arduino</b><b class='flag-5'>制作</b><b class='flag-5'>檢測</b>PM2.5<b class='flag-5'>檢測器</b>的程序詳細資料免費下載

    DIY使用ESP32的手持游戲手柄并通過BLE進行通信的設計

    ?? ? 軟件應用程序和在線服務: Arduino IDE?? ? 手動工具和制造機: 烙鐵(通用) 這是一個使用ESP32微控制制作的DIY手持游戲手柄。您可能之前已經看過這樣的游
    的頭像 發表于 01-27 13:40 ?9390次閱讀

    esp32arduino的區別,esp32能否替代arduino

    很多創客愛好者甚至有些技術工程師在理解esp32arduino的時候總是問一句這兩塊板子哪個更好用?他們可能潛意識中就覺得arduinoesp32是競品的關系,但實際是這樣嗎?今天
    發表于 06-24 17:11 ?2.8w次閱讀

    ESP32 開發之旅② Arduino For ESP32說明

    文章目錄1. Arduino Core For ESP32是什么?2.Arduino core for ESP32庫3.與ESP8266庫類
    發表于 11-13 19:51 ?33次下載
    <b class='flag-5'>ESP32</b> 開發之旅② <b class='flag-5'>Arduino</b> For <b class='flag-5'>ESP32</b>說明

    ESP32-Arduino-開發實例-ESP32的WiFi工作模式

    WiFi-BT-BLE MCU模組,功能強大,用途廣泛,可以用于低功耗傳感網絡和要求極高的任務,例如語音編碼、音頻流和MP3解碼等。此款模組的核心是ESP32芯片,具有可擴展、自適應的特點。兩個CPU核可以被單獨控制或上電。時
    發表于 11-26 17:21 ?82次下載
    <b class='flag-5'>ESP32-Arduino</b>-開發實例-<b class='flag-5'>ESP32</b>的WiFi工作模式

    使用Arduino開發ESP32-01S

    使用Arduino開發ESP32-01S
    發表于 12-03 18:06 ?16次下載
    使用<b class='flag-5'>Arduino</b>開發<b class='flag-5'>ESP32</b>-01S

    arduino / VScode+platformIO搭建esp32/esp8266編譯環境(一篇足矣)

    arduino/VScode+platformIO 搭建esp32/esp8266開發環境(一篇足矣)前言:入門開源硬件開發,在搭建編譯環境的時候碰了一臉灰,特意寫下此博客,以供參考!制作
    發表于 12-05 14:06 ?34次下載
    <b class='flag-5'>arduino</b> / VScode+platformIO搭建<b class='flag-5'>esp32</b>/<b class='flag-5'>esp</b>8266編譯環境(一篇足矣)

    如何使用ESP8266開發板制作光強度檢測器

    本文將介紹如何使用一個ESP8266開發板制作光強度檢測器,并將檢測結果在本地網頁顯示。
    的頭像 發表于 04-08 15:27 ?4777次閱讀
    如何使用<b class='flag-5'>ESP</b>8266開發板<b class='flag-5'>制作</b>光強度<b class='flag-5'>檢測器</b>

    如何使用ESP32構建一個BLE iBeacon

    在本教程中,我們將使用 ESP32 構建一個 BLE iBeacon,其中 ESP32 將充當服務,智能手機將充當客戶端。
    發表于 07-12 16:48 ?7826次閱讀
    如何使用<b class='flag-5'>ESP32</b>構建一個<b class='flag-5'>BLE</b> iBeacon

    Arduino封裝上的ESP32

    電子發燒友網站提供《Arduino封裝上的ESP32板.zip》資料免費下載
    發表于 07-25 14:36 ?6次下載
    <b class='flag-5'>Arduino</b>封裝上的<b class='flag-5'>ESP32</b>板

    ESP32 BT/BLE雙模藍牙共存說明

    電子發燒友網站提供《ESP32 BT/BLE雙模藍牙共存說明.pdf》資料免費下載
    發表于 09-23 10:08 ?2次下載
    <b class='flag-5'>ESP32</b> BT/<b class='flag-5'>BLE</b>雙模藍牙共存說明

    使用ESP32制作ESP RainMaker IoT項目

    電子發燒友網站提供《使用ESP32制作ESP RainMaker IoT項目.zip》資料免費下載
    發表于 10-24 10:54 ?9次下載
    使用<b class='flag-5'>ESP32</b><b class='flag-5'>制作</b><b class='flag-5'>ESP</b> RainMaker IoT項目

    基于ESP32Arduino兼容系統

    電子發燒友網站提供《基于ESP32Arduino兼容系統.zip》資料免費下載
    發表于 12-20 17:53 ?0次下載
    基于<b class='flag-5'>ESP32</b>的<b class='flag-5'>Arduino</b>兼容系統

    如何在Arduino IDE中安裝ESP32開發環境

    要在Arduino IDE中使用ESP32開發板,您需要先安裝相應的開發環境。以下是在Arduino IDE中安裝ESP32開發環境的步驟。
    的頭像 發表于 07-13 16:48 ?2.2w次閱讀
    如何在<b class='flag-5'>Arduino</b> IDE中安裝<b class='flag-5'>ESP32</b>開發環境
    主站蜘蛛池模板: 天天摸日日干 | 五月婷婷开心综合 | 欧美精品一二区 | 激情五月深爱五月 | 性xxxxbbbb在线 | 天天干夜夜夜 | 午夜剧场黄 | 九九热精品在线视频 | 六月丁香婷婷激情 | 海棠高h粗暴调教双性男男 韩国韩宝贝2020vip福利视频 | 天天操视频 夜夜 | 亚洲欧洲一区二区三区在线观看 | 男人的天堂在线免费视频 | 两人性潮高免费视频看 | 中文字幕精品一区二区2021年 | 亚洲国产成人久久一区www | 四虎影视网址 | 日本美女黄色一级片 | 午夜影院免费观看视频 | 老色99久久九九精品尤物 | 亚洲人成网站色在线观看 | 中文在线最新版天堂bt | 国内精品第一页 | fenfencao在线观看免费视频 | 夜夜夜夜夜夜夜工噜噜噜 | 免费色视频网站 | 久久精品国产99国产精品免费看 | 日本v片免费一区二区三区 日本www.色 日本wwwwww | 天天干天天舔天天射 | 日本黄色网址视频 | 欧美亚洲综合图区在线 | 成人a在线观看 | 色批网站 | 国产精品夜色一区二区三区 | 国产精品天天干 | 拍拍免费视频 | 2021韩国理论片ok电影天堂 | 免费黄色在线视频 | 国产热| 四虎影院观看视频 | 手机看片日韩永久福利盒子 |