将nRF24L01与Arduino连接进行BLE通信

将nRF24L01与Arduino连接进行BLE通信,第1张

  低功耗蓝牙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与Arduino连接进行BLE通信,pYYBAGMF0geAG72mAAHE1FlIKVk760.png,第2张

  本教程将解释如何使用 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 模块的引脚排列如下所示:

将nRF24L01与Arduino连接进行BLE通信,poYBAGMF0gGAJTsCAAHYDVSuisQ892.png,第3张

  该模块的工作电压为 1.9V 至 3.6V(通常为 3.3V),在正常工作期间消耗的电流非常少,仅为 12mA,这使其电池高效,因此甚至可以在纽扣电池上运行。尽管工作电压为 3.3V,但大多数引脚都可以承受 5V,因此可以直接与 Arduino 等 5V 微控制器连接。使用这些模块的另一个好处是,每个模块有 6 个管道。意思是,每个模块可以与其他 6 个模块通信以传输或接收数据。这使得该模块适用于在物联网应用中创建星形或网状网络。它们还具有 125 个唯一 ID 的广泛地址范围,因此在封闭区域中,我们可以使用 125 个这些模块而不会相互干扰。

  Arduino NRF24L01模块 电路

将nRF24L01与Arduino连接进行BLE通信,pYYBAGMF0f6ANkJMAAEbfPQ_KF0245.png,第4张

将nRF24L01与Arduino连接进行BLE通信,poYBAGMF0fqANxxPAAUOcH9HXZk778.png,第5张

将 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应用程序上配对和获取数据的完整过程:

将nRF24L01与Arduino连接进行BLE通信,pYYBAGMF0fKAUWczAAHAusSAmAA746.png,第6张

  这完成了使用 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 //dht11温湿度传感器库


#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);

}
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2998941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-26
下一篇 2022-09-26

发表评论

登录后才能评论

评论列表(0条)

保存