低功耗藍(lán)牙 (BLE) 是藍(lán)牙的一個(gè)版本,它是經(jīng)典藍(lán)牙的更小、高度優(yōu)化的版本。它也被稱為智能藍(lán)牙。BLE 的設(shè)計(jì)考慮到了最低的功耗,專門針對(duì)低成本、低帶寬、低功耗和低復(fù)雜性。ESP32 具有內(nèi)置的 BLE 功能,但對(duì)于 Arduino 等其他微控制器,可以使用 nRF24L01。該射頻模塊也可以用作 BLE 模塊,將數(shù)據(jù)發(fā)送到其他藍(lán)牙設(shè)備,如智能手機(jī)、電腦等。
在本教程中,我們將演示如何使用 nRF24L01 通過(guò) BLE 發(fā)送任何數(shù)據(jù)。我們將使用 Arduino 和 nRF 模塊通過(guò) BLE 將溫度讀數(shù)從 DHT11 發(fā)送到智能手機(jī)。
低功耗藍(lán)牙 (BLE) 有何不同?
BLE 因其功耗特性而被采用,因?yàn)樗鼉H使用紐扣電池即可長(zhǎng)時(shí)間運(yùn)行。與其他無(wú)線標(biāo)準(zhǔn)相比,BLE 的快速增長(zhǎng)速度更快,因?yàn)樗谥悄苁謾C(jī)、平板電腦和移動(dòng)計(jì)算中的應(yīng)用非常廣泛。
NRF24L01 模塊的 BLE 功能
BLE 使用相同的 2.4 GHz ISM 頻段,波特率從 250Kbps 到 2Mbps,這在許多國(guó)家都是允許的,可應(yīng)用于工業(yè)和醫(yī)療應(yīng)用。頻段從 2400 MHz 到 2483.5 MHz 開始,分為 40 個(gè)頻道。其中三個(gè)通道被稱為“廣告”,設(shè)備使用它們來(lái)發(fā)送包含有關(guān)它們的信息的廣告數(shù)據(jù)包,以便其他 BLE 設(shè)備可以連接。這些頻道最初選擇在頻帶的較低上部和頻帶的中間,以避免可能干擾多個(gè)頻道的干擾。
本教程將解釋如何使用 NRF24L01 模塊作為 BLE 收發(fā)器。NRF24L01 作為 RF 模塊的教程已經(jīng)在nRF24L01 與 Arduino 接口教程中進(jìn)行了解釋。今天將通過(guò)向智能手機(jī)發(fā)送傳感器數(shù)據(jù)來(lái)解釋該模塊的 BLE 功能。在這里,這個(gè) nRF24L01 模塊將與 Arduino 微控制器連接,DHT11 傳感器溫度數(shù)據(jù)將發(fā)送到官方 Nordic BLE android 應(yīng)用程序。
所需組件
硬件:
Arduino UNO
nRF24L01 BLE模塊
DHT11溫濕度傳感器
跳線
軟件:
Arduino IDE
Nordic BLE Android 應(yīng)用程序(nRF Temp 2.0 for BLE或nRF Connect for Mobile)
從 nRF24L01 模塊開始
nRF24L01 模塊是收發(fā)器模塊,這意味著每個(gè)模塊都可以發(fā)送和接收數(shù)據(jù),但由于它們是半雙工的,因此它們可以一次發(fā)送或接收數(shù)據(jù)。該模塊具有來(lái)自 Nordic Semiconductors 的通用 nRF24L01 IC,負(fù)責(zé)數(shù)據(jù)的傳輸和接收。該 IC 使用 SPI 協(xié)議進(jìn)行通信,因此可以輕松與任何微控制器連接。由于庫(kù)很容易獲得,因此使用 Arduino 會(huì)容易得多。
標(biāo)準(zhǔn) nRF24L01 模塊的引腳排列如下所示:
該模塊的工作電壓為 1.9V 至 3.6V(通常為 3.3V),在正常工作期間消耗的電流非常少,僅為 12mA,這使其電池高效,因此甚至可以在紐扣電池上運(yùn)行。盡管工作電壓為 3.3V,但大多數(shù)引腳都可以承受 5V,因此可以直接與 Arduino 等 5V 微控制器連接。使用這些模塊的另一個(gè)好處是,每個(gè)模塊有 6 個(gè)管道。意思是,每個(gè)模塊可以與其他 6 個(gè)模塊通信以傳輸或接收數(shù)據(jù)。這使得該模塊適用于在物聯(lián)網(wǎng)應(yīng)用中創(chuàng)建星形或網(wǎng)狀網(wǎng)絡(luò)。它們還具有 125 個(gè)唯一 ID 的廣泛地址范圍,因此在封閉區(qū)域中,我們可以使用 125 個(gè)這些模塊而不會(huì)相互干擾。
Arduino NRF24L01模塊 電路圖
將 nRF24L01 與 Arduino 連接以進(jìn)行 BLE 通信
nRF24L01 在 SPI 上工作,因此接口將使用 SPI 協(xié)議。完整的代碼和視頻將附在本教程的最后。視頻中還解釋了 Android 應(yīng)用指南。這里使用 nRF24L01 模塊與Nordic 的 Smartphone App進(jìn)行通信。
首先包括所需的庫(kù)。該庫(kù)包括用于訪問(wèn) nRF24L01 命令的 RF24、用于訪問(wèn) DHT11 命令的 DHT11 庫(kù)和用于使用 BLE 功能的BTLE 庫(kù)。
?
#include#include #include #include
?
定義和初始化 DHT11 和 BLE 模塊的引腳和功能。由于我們使用的是 DHT11,因此 DHT 類型被初始化為 DHT11。DHT 連接到 GPIO 引腳 4,nRF 模塊的 CE 和 CSN 引腳分別連接到引腳 9 和 10。
?
#define DHTPIN #define DHTTYPE DHT11 DHT22 DHT dht(DHTPIN, DHTTYPE); RF24 收音機(jī)(9、10); BTLE btle(&radio);
?
在9600啟動(dòng)串口,可以選擇任意端口。然后啟動(dòng) DHT 傳感器,并以最多 8 個(gè)字符的藍(lán)牙本地名稱開始 BTLE 。
?
序列號(hào).開始(9600); dht.begin(); btle.begin("CD 溫度");
?
讀取循環(huán)中的溫度并將其保存到浮點(diǎn)變量temp。如果 DHT 斷電或發(fā)生任何意外情況,添加調(diào)試行以顯示錯(cuò)誤消息。
?
浮動(dòng)溫度 = dht.readTemperature(); //讀取溫度數(shù)據(jù) if (isnan(h) || isnan(t)) { Serial.println(F("讀取 DHT 傳感器失??!")); 返回; }
?
將值保存到 Buffer 并解析到 BLE 模塊。還將溫度值發(fā)送到 BLE 模塊。BLE 模塊將公布溫度數(shù)據(jù)。安卓應(yīng)用可以搜索BLE模塊并接收傳感器數(shù)據(jù)。
?
nrf_service_data 緩沖區(qū); buf.service_uuid = NRF_TEMPERATURE_SERVICE_UUID; buf.value = BTLE::to_nRF_Float(temp); if (!btle.advertise(0x16, &buf, sizeof(buf))) { Serial.println("BTLE 廣告失敗..!"); }
?
完成后,只需跳到下一個(gè)頻道。
?
btle.hopChannel();
?
由于 DHT 傳感器文檔建議在一次讀數(shù)后保持至少 2 秒的延遲,因此添加 2 秒的延遲。
?
延遲(2000);
?
上傳智能手機(jī)并將其與 nRF 模塊配對(duì)后,您將開始獲取BLE android 應(yīng)用程序的 nRF Temp 2.0 上的值,如下所示。視頻中還解釋了在android應(yīng)用程序上配對(duì)和獲取數(shù)據(jù)的完整過(guò)程:
這完成了使用 BLE nRF24L01 將傳感器數(shù)據(jù)廣播到 Nordic Android 應(yīng)用程序的完整教程。
/* CircuitDigest ( www.circuitdigest.com )將傳感器數(shù)據(jù)發(fā)送到 Nordic BLE android 應(yīng)用程序
與 nRF24L01 一起使用。Nordic 的作品
它從 DHT11 讀取溫度并通過(guò) BTLE 發(fā)送。
適用于 Nordic Semiconductor 應(yīng)用程序,例如
“nRF Connect for Mobile”和“nRF Temp 2.0 for BLE”
引腳映射:
GND -> Arduino
VCC 上的 GND -> Arduino CE 上的 3.3v -> Arduino
CSN
上的 PIN 9 ->
Arduino
SCK 上的 PIN 10 -> Arduino Uno
MOSI 上的 PIN 13 -> Arduino Uno
MISO 上的 PIN 11 -> Arduino Uno
IRQ 上的 PIN 12 -> 未使用
*/
#include
#include
#include
#include
#define DHTPIN 4 // 我們連接的數(shù)字引腳
#define DHTTYPE DHT11 // 選擇 dht 類型為 DHT 11 或 DHT22
DHT dht(DHTPIN, DHTTYPE);
RF24 收音機(jī)(9、10);// CE, CSN
BTLE btle(&radio);
無(wú)效設(shè)置(){
序列.開始(9600);
延遲(1000);
Serial.print("BLE 和 DHT 開始...");
Serial.println("通過(guò) BTLE 發(fā)送溫度數(shù)據(jù)");
dht.begin(); // 初始化 DHT11 傳感器
btle.begin("CD Temp"); // 最多 8 個(gè)字符
Serial.println("Successfully Started");
}
無(wú)效循環(huán)(){
浮動(dòng)溫度=dht.readTemperature();//讀取溫度數(shù)據(jù)
if (isnan(h) || isnan(t)) { // 檢查是否有任何讀取失敗并提前退出(重試)。
Serial.println(F("讀取 DHT 傳感器失??!"));
返回;
}
Serial.print("溫度:"); 序列號(hào).print(t); Serial.println("°C");
nrf_service_data 緩沖區(qū);
buf.service_uuid = NRF_TEMPERATURE_SERVICE_UUID;
buf.value = BTLE::to_nRF_Float(temp);
if (!btle.advertise(0x16, &buf, sizeof(buf))) {
Serial.println("BTLE 廣告失敗..!");
}
btle.hopChannel();
延遲(2000);
}
?
評(píng)論