低功耗蓝牙 (BLE) 是蓝牙的一个版本,它是经典蓝牙的更小、高度优化的版本。它也被称为智能蓝牙。BLE 的设计考虑到了最低的功耗,专门针对低成本、低带宽、低功耗和低复杂性。ESP32 具有内置的 BLE 功能,但对于 Arduino 等其他微控制器,可以使用 nRF24L01。该射频模块也可以用作 BLE 模块,将数据发送到其他蓝牙设备,如智能手机、电脑等。
在本教程中,我们将演示如何使用 nRF24L01 通过 BLE 发送任何数据。我们将使用 Arduino 和 nRF 模块通过 BLE 将温度读数从 DHT11 发送到智能手机。
低功耗蓝牙 (BLE) 有何不同?
BLE 因其功耗特性而被采用,因为它仅使用纽扣电池即可长时间运行。与其他无线标准相比,BLE 的快速增长速度更快,因为它在智能手机、平板电脑和移动计算中的应用非常广泛。
NRF24L01 模块的 BLE 功能
BLE 使用相同的 2.4 GHz ISM 频段,波特率从 250Kbps 到 2Mbps,这在许多国家都是允许的,可应用于工业和医疗应用。频段从 2400 MHz 到 2483.5 MHz 开始,分为 40 个频道。其中三个通道被称为“广告”,设备使用它们来发送包含有关它们的信息的广告数据包,以便其他 BLE 设备可以连接。这些频道最初选择在频带的较低上部和频带的中间,以避免可能干扰多个频道的干扰。
本教程将解释如何使用 NRF24L01 模块作为 BLE 收发器。NRF24L01 作为 RF 模块的教程已经在nRF24L01 与 Arduino 接口教程中进行了解释。今天将通过向智能手机发送传感器数据来解释该模块的 BLE 功能。在这里,这个 nRF24L01 模块将与 Arduino 微控制器连接,DHT11 传感器温度数据将发送到官方 Nordic BLE android 应用程序。
所需组件
硬件:
Arduino UNO
nRF24L01 BLE模块
DHT11温湿度传感器
跳线
软件:
Arduino IDE
Nordic BLE Android 应用程序(nRF Temp 2.0 for BLE或nRF Connect for Mobile)
从 nRF24L01 模块开始
nRF24L01 模块是收发器模块,这意味着每个模块都可以发送和接收数据,但由于它们是半双工的,因此它们可以一次发送或接收数据。该模块具有来自 Nordic Semiconductors 的通用 nRF24L01 IC,负责数据的传输和接收。该 IC 使用 SPI 协议进行通信,因此可以轻松与任何微控制器连接。由于库很容易获得,因此使用 Arduino 会容易得多。
标准 nRF24L01 模块的引脚排列如下所示:
该模块的工作电压为 1.9V 至 3.6V(通常为 3.3V),在正常工作期间消耗的电流非常少,仅为 12mA,这使其电池高效,因此甚至可以在纽扣电池上运行。尽管工作电压为 3.3V,但大多数引脚都可以承受 5V,因此可以直接与 Arduino 等 5V 微控制器连接。使用这些模块的另一个好处是,每个模块有 6 个管道。意思是,每个模块可以与其他 6 个模块通信以传输或接收数据。这使得该模块适用于在物联网应用中创建星形或网状网络。它们还具有 125 个唯一 ID 的广泛地址范围,因此在封闭区域中,我们可以使用 125 个这些模块而不会相互干扰。
Arduino NRF24L01模块 电路图
将 nRF24L01 与 Arduino 连接以进行 BLE 通信
nRF24L01 在 SPI 上工作,因此接口将使用 SPI 协议。完整的代码和视频将附在本教程的最后。视频中还解释了 Android 应用指南。这里使用 nRF24L01 模块与Nordic 的 Smartphone App进行通信。
首先包括所需的库。该库包括用于访问 nRF24L01 命令的 RF24、用于访问 DHT11 命令的 DHT11 库和用于使用 BLE 功能的BTLE 库。
#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 收音机(9、10); BTLE btle(&radio);
在9600启动串口,可以选择任意端口。然后启动 DHT 传感器,并以最多 8 个字符的蓝牙本地名称开始 BTLE 。
序列号.开始(9600); dht.begin(); btle.begin("CD 温度");
读取循环中的温度并将其保存到浮点变量temp。如果 DHT 断电或发生任何意外情况,添加调试行以显示错误消息。
浮动温度 = dht.readTemperature(); //读取温度数据 if (isnan(h) || isnan(t)) { Serial.println(F("读取 DHT 传感器失败!")); 返回; }
将值保存到 Buffer 并解析到 BLE 模块。还将温度值发送到 BLE 模块。BLE 模块将公布温度数据。安卓应用可以搜索BLE模块并接收传感器数据。
nrf_service_data 缓冲区; 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();
由于 DHT 传感器文档建议在一次读数后保持至少 2 秒的延迟,因此添加 2 秒的延迟。
延迟(2000);
上传智能手机并将其与 nRF 模块配对后,您将开始获取BLE android 应用程序的 nRF Temp 2.0 上的值,如下所示。视频中还解释了在android应用程序上配对和获取数据的完整过程:
这完成了使用 BLE nRF24L01 将传感器数据广播到 Nordic Android 应用程序的完整教程。
/* CircuitDigest ( www.circuitdigest.com )将传感器数据发送到 Nordic BLE android 应用程序
与 nRF24L01 一起使用。Nordic 的作品
它从 DHT11 读取温度并通过 BTLE 发送。
适用于 Nordic Semiconductor 应用程序,例如
“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 // 我们连接的数字引脚
#define DHTTYPE DHT11 // 选择 dht 类型为 DHT 11 或 DHT22
DHT dht(DHTPIN, DHTTYPE);
RF24 收音机(9、10);// CE, CSN
BTLE btle(&radio);
无效设置(){
序列.开始(9600);
延迟(1000);
Serial.print("BLE 和 DHT 开始...");
Serial.println("通过 BTLE 发送温度数据");
dht.begin(); // 初始化 DHT11 传感器
btle.begin("CD Temp"); // 最多 8 个字符
Serial.println("Successfully Started");
}
无效循环(){
浮动温度=dht.readTemperature();//读取温度数据
if (isnan(h) || isnan(t)) { // 检查是否有任何读取失败并提前退出(重试)。
Serial.println(F("读取 DHT 传感器失败!"));
返回;
}
Serial.print("温度:"); 序列号.print(t); Serial.println("°C");
nrf_service_data 缓冲区;
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);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)