将nRF24L01与Arduino连接进行BLE通信

RF/无线

1818人已加入

描述

  低功耗蓝牙 (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 设备可以连接。这些频道最初选择在频带的较低上部和频带的中间,以避免可能干扰多个频道的干扰。

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 模块的引脚排列如下所示:

BLE

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

  Arduino NRF24L01模块 电路图

BLE

BLE

将 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

  这完成了使用 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);

}
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分