色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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。可以在本頁底部找到執行此操作的完整程序。代碼解釋如下。

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

當我們使用 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

    文章

    869

    瀏覽量

    47779
  • BLE
    BLE
    +關注

    關注

    12

    文章

    670

    瀏覽量

    59555
  • Arduino
    +關注

    關注

    188

    文章

    6477

    瀏覽量

    187748
  • ESP32
    +關注

    關注

    18

    文章

    977

    瀏覽量

    17504
收藏 人收藏

    評論

    相關推薦

    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 ?8714次閱讀

    esp32arduino的區別,esp32能否替代arduino

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

    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 ?33次下載
    <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 ?4355次閱讀
    如何使用<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 ?7161次閱讀
    如何使用<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 ?1.9w次閱讀
    如何在<b class='flag-5'>Arduino</b> IDE中安裝<b class='flag-5'>ESP32</b>開發環境
    主站蜘蛛池模板: 免费精品国产人妻国语麻豆 | 久久久久久91香蕉国产 | 嗯啊…嗯np男男双性总受 | 亚洲AV久久无码精品九九软件 | 男人到天堂a在538线 | 男人被绑着强行摸j | 中文字幕日本在线mv视频精品 | 亚洲 日韩经典 中文字幕 | 看 视频一一级毛片 | 99久久久精品免费观看国产 | 亚洲一卡二卡三卡四卡无卡麻豆 | 四虎影视库永久免费 | 公交车轮C关老师 | 理论片午午伦夜理片久久 | 55夜色66夜亚洲精品播放 | 国产偷抇久久精品A片蜜臀AV | 伊人青青操| 动漫美女被到爽了流 | 漂亮的av女演员 | 无码爽死成人777在线观看网站 | 日本十八禁无遮无挡漫画 | 日本xxx在线观看免费播放 | 123超碰在线视频 | 99免费精品 | 最近的2019中文字幕国语完整版 | 无毒成人社区 | 一级做a爰片久久毛片免费 一级做a爰片久久毛片潮喷动漫 | 亚洲国产精品特色大片观看 | 99视频这里只有精品 | 97人妻中文字幕免费视频 | 被老总按在办公桌吸奶头 | 国产精品网红女主播久久久 | 日韩在线 无码 精品 | 黄色网址在线免费观看 | 手机在线播放成人亚洲影院电影 | 国产午夜福利伦理300 | 入禽太深在线观看免费高清 | 青青伊人久久 | 在线二区 中文 无码 | 中文字幕中文字幕永久免费 | 强开少妇嫩苞又嫩又紧九色 |