Skip to main content

蓝牙使用方法(Seeed nrf52 mbed-enabled 开发板库)

Seeed Studio XIAO nRF52840Seeed Studio XIAO nRF52840 Sense 都支持蓝牙连接。本教程将介绍基本的蓝牙功能,并提供一个与 24GHz 呼吸睡眠检测模块的演示,使用"Seeed nrf52 mbed-enabled 开发板库"。

入门指南

所需硬件

所需软件

Arduino 库概述

tip

如果这是您第一次使用 Arduino,我们强烈建议您参考Arduino 入门指南

要使用 Seeed Studio XIAO nRF52840 的蓝牙功能,我们需要使用官方的 Arduino BLE 库。

如果您想应用 24GHz 睡眠呼吸雷达的演示,您可能还需要下载支持的库。

功能

有关 ArduinoBLE 代码库的功能和使用介绍,请参考 Arduino 网站

有关 Seeed 24GHz 睡眠呼吸雷达 BLE 代码库的功能和使用介绍,请参考 Wiki

安装

  • 方法一(此方法适用于上述两个代码库。)

由于您已经下载了 zip 库文件,打开您的 Arduino IDE,点击 Sketch > Include Library > Add .ZIP Library。选择您刚刚下载的 zip 文件,如果库安装正确,您将在通知窗口中看到 Library added to your libraries。这意味着库已成功安装。

  • 方法二(仅可安装 ArduinoBLE 库。)

库管理器是从 Arduino IDE 版本 1.5 及更高版本(1.6.x)开始添加的。它位于"Sketch"菜单下的"Include Library"、"Manage Libraries..."中。

当您打开库管理器时,您会发现一个可以一键安装的大型库列表。要为您的产品找到库,请搜索产品名称或关键词,如"k type"或"digitizer",您想要的库应该会显示出来。点击所需的库,"Install"按钮将出现。点击该按钮,库应该会自动安装。安装完成后,关闭库管理器。

应用示例

现在我们已经安装了库并了解了基本功能,让我们为 Seeed Studio XIAO nRF52840 运行一些示例,看看它的表现如何。

步骤 1. 启动 Arduino 应用程序。

步骤 2. 选择您的开发板型号并将其添加到 Arduino IDE。这里我们使用"Seeed nrf52 mbed-enabled 开发板库"。

有关开发板库的安装,请参考此教程完成安装。

演示 1 使用智能手机控制内置 LED

在此示例中,我们将使用蓝牙连接 Seeed Studio XIAO nF52840 (Sense) 和智能手机,并从手机发送消息来开启/关闭 Seeed Studio XIAO nRF52840 (Sense) 上的内置红色 LED。

请将下面的代码粘贴到 Arduino IDE 中并上传到 Seeed Studio XIAO nRF52840。

#include <ArduinoBLE.h>

BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // 蓝牙® 低功耗 LED 服务

// 蓝牙® 低功耗 LED 开关特征 - 自定义 128 位 UUID,可被中心设备读取和写入
BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin = LED_BUILTIN; // 用于 LED 的引脚

void setup() {
Serial.begin(9600);
while (!Serial);

// 将 LED 引脚设置为输出模式
pinMode(ledPin, OUTPUT);

// 开始初始化
if (!BLE.begin()) {
Serial.println("启动蓝牙® 低功耗模块失败!");

while (1);
}

// 设置广播的本地名称和服务 UUID:
BLE.setLocalName("LED");
BLE.setAdvertisedService(ledService);

// 将特征添加到服务中
ledService.addCharacteristic(switchCharacteristic);

// 添加服务
BLE.addService(ledService);

// 设置特征的初始值:
switchCharacteristic.writeValue(0);

// 开始广播
BLE.advertise();

Serial.println("BLE LED 外围设备");
}

void loop() {
// 监听蓝牙® 低功耗外围设备连接:
BLEDevice central = BLE.central();

// 如果中心设备连接到外围设备:
if (central) {
Serial.print("已连接到中心设备:");
// 打印中心设备的 MAC 地址:
Serial.println(central.address());

// 当中心设备仍连接到外围设备时:
while (central.connected()) {
if (switchCharacteristic.written()) {
if (switchCharacteristic.value()) {
Serial.println("LED 开启");
digitalWrite(ledPin, LOW); // 从 HIGH 改为 LOW
} else {
Serial.println(F("LED 关闭"));
digitalWrite(ledPin, HIGH); // 从 LOW 改为 HIGH
}
}
}

// 当中心设备断开连接时,打印出来:
Serial.print(F("与中心设备断开连接:"));
Serial.println(central.address());
}
}

这个示例实现的关键是以下段落。

  while (central.connected()) {
if (switchCharacteristic.written()) {
if (switchCharacteristic.value()) {
Serial.println("LED on");
digitalWrite(ledPin, LOW); // changed from HIGH to LOW
} else {
Serial.println(F("LED off"));
digitalWrite(ledPin, HIGH); // changed from LOW to HIGH
}
}
}

这段代码的目的是在Seeed Studio XIAO nRF52840被蓝牙设备连接时central.connected()并从蓝牙设备接收内容时switchCharacteristic.written()进行判断。如果判断值为非零switchCharacteristic.value(),则灯亮,如果判断值为0则灯灭。

打开串口监视器,波特率设置为9600,LED应该会亮或灭。输出应该类似下面的图像。

此时,可以通过手机应用程序通过蓝牙完成对Seeed Studio XIAO nRF52840灯光的控制,如下所述。


iPhone Android 描述
打开软件,搜索名为LED的蓝牙设备并点击连接。某些设备可能显示为Arduino
进入Seeed Studio XIAO nRF52840蓝牙界面,点击设备显示设备详情。
填入要发送给Seeed Studio XIAO nRF52840的数据,发送1开灯,发送0关灯。
回到蓝牙控制界面,可以看到数值已经改变,Seeed Studio XIAO nRF52840红灯亮起(或熄灭)。

演示2 使用XIAO BLE通过BLE获取24GHz睡眠检测模块数据

在这个示例中,我们将描述如何获取传感器的数值,并使用Seeed Studio XIAO nRF52840通过蓝牙将传感器检测到的数据信息发送到移动设备。

按照下图连接Seeed Studio XIAO nRF52840开发板和24GHz呼吸睡眠检测模块。更多信息,您可以点击这里

请在库中打开示例代码并上传到Seeed Studio XIAO nRF52840。

//雷达与XIAOBLE示例

#include <ArduinoBLE.h>
#include <sleepbreathingradarBLE.h>

SleepBreathingRadarBLE radar;
BLEService radarService("19B10000-E8F2-537E-4F6C-D104768A1214"); // 蓝牙低功耗LED服务

// 蓝牙低功耗LED开关特征 - 自定义128位UUID,可由中央设备读取和写入
BLEStringCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify, 20);

int last_val = 0;

void setup() {
Serial.begin(9600);
radar.SerialInit();
while (!Serial);

// 开始初始化
if (!BLE.begin()) {
Serial.println("启动Seeed Studio XIAO nRF52840与60GHz雷达传感器演示失败!");
while (1);
}

// 设置广播的本地名称和服务UUID:
BLE.setLocalName("Seeed Studio XIAO nRF52840");
BLE.setAdvertisedService(radarService);

// 将特征添加到服务
radarService.addCharacteristic(switchCharacteristic);

// 添加服务
BLE.addService(radarService);

// 开始广播
BLE.advertise();

Serial.println("Seeed Studio XIAO nRF52840已激活,等待连接...");
}

void loop() {
// 监听蓝牙低功耗外围设备连接:
BLEDevice central = BLE.central();

// 如果中央设备连接到外围设备:
if (central) {
Serial.print("已连接到中央设备:");
// 打印中央设备的MAC地址:
Serial.println(central.address());

// 当中央设备仍连接到外围设备时:
while (central.connected()){
radar.recvRadarBytes(); //接收雷达数据并开始处理
if (radar.newData == true) { //数据已接收并传输到新列表dataMsg[]
byte dataMsg[radar.dataLen+3] = {0x00};
dataMsg[0] = 0x53; //添加头帧作为数组的第一个元素
for (byte n = 0; n < radar.dataLen; n++)dataMsg[n+1] = radar.Msg[n]; //逐帧传输
dataMsg[radar.dataLen+1] = 0x54;
dataMsg[radar.dataLen+2] = 0x43;
radar.newData = false; //保存完整的数据帧集
int new_val = radar.Sleep_inf(dataMsg); //使用雷达内置算法输出人体运动状态
if(new_val != last_val){
radar.OutputAssignment(new_val);
switchCharacteristic.setValue(radar.str);
last_val = new_val;
}
}
}

// 当中央设备断开连接时,打印出来:
Serial.print(F("与中央设备断开连接:"));
Serial.println(central.address());
}
}

在这个例子中,向移动设备发送数据的函数是 setValue()。如果你想要实时显示数据,需要在下面的代码中添加 BLENotify。最后一个参数 20 表示你可以发送的数据的最大长度。

BLEStringCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify, 20);

将串口监视器打开到波特率9600,应该会显示传感器与其指向物体之间的距离,单位为毫米和英尺。输出应该类似于下面的图像。

接下来,我们可以通过以下步骤获取通过蓝牙发送的实时数据。


iPhone Android 描述
打开软件,搜索名为Seeed Studio XIAO nRF52840的蓝牙设备并点击连接。某些设备可能显示为Arduino
=进入Seeed Studio XIAO nRF52840蓝牙界面,点击设备以显示设备详细信息。
打开软件的实时更新数据。
接下来,每当雷达检测到睡眠消息时,它会通过Seeed Studio XIAO nRF52840的蓝牙发送到手机。

演示3 两个XIAO nRF52840通过蓝牙通信控制LED

在这个示例中,我们将使用两个XIAO nRF52840,利用它们的蓝牙功能进行通信。其中一个XIAO作为主机,连接到XIAO扩展板,通过扩展板的按钮发送控制命令。另一个XIAO作为从机。

在开始之前,请准备以下物品。

Seeed Studio XIAO扩展板2 x Seeed XIAO BLE nRF52840 Sense

请选择其中一个XIAO nRF52840,它不需要连接任何设备,直接上传下面的程序。

#include <ArduinoBLE.h>

BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // 蓝牙® 低功耗 LED 服务

// 蓝牙® 低功耗 LED 开关特征 - 自定义 128 位 UUID,可被中央设备读取和写入
BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin = LED_BUILTIN; // 用于 LED 的引脚

void setup() {
Serial.begin(9600);
while (!Serial);

// 将 LED 引脚设置为输出模式
pinMode(ledPin, OUTPUT);

// 开始初始化
if (!BLE.begin()) {
Serial.println("启动蓝牙® 低功耗模块失败!");

while (1);
}

// 设置广播的本地名称和服务 UUID:
BLE.setLocalName("XIAO");
BLE.setAdvertisedService(ledService);

// 将特征添加到服务中
ledService.addCharacteristic(switchCharacteristic);

// 添加服务
BLE.addService(ledService);

// 为特征设置初始值:
switchCharacteristic.writeValue(0);

// 开始广播
BLE.advertise();

// 打印地址
Serial.print("地址: ");
Serial.println(BLE.address());

Serial.println("XIAO nRF52840 外围设备");
}

void loop() {
// 监听要连接的蓝牙® 低功耗外围设备:
BLEDevice central = BLE.central();

// 如果中央设备已连接到外围设备:
if (central) {
Serial.print("已连接到中央设备: ");
// 打印中央设备的 MAC 地址:
Serial.println(central.address());

// 当中央设备仍连接到外围设备时:
while (central.connected()) {
// 如果远程设备写入了特征,
// 使用该值来控制 LED:
if (switchCharacteristic.written()) {
if (switchCharacteristic.value()) { // 除 0 以外的任何值
Serial.println("LED 开启");
digitalWrite(ledPin, HIGH); // 将点亮 LED
} else { // 值为 0
Serial.println(F("LED 关闭"));
digitalWrite(ledPin, LOW); // 将关闭 LED
}
}
}

// 当中央设备断开连接时,打印出来:
Serial.print(F("与中央设备断开连接: "));
Serial.println(central.address());
}
}

这个程序的主要目的是让XIAO成为一个名为"XIAO"的蓝牙设备,可以被其他蓝牙设备搜索和连接。连接后,您可以通过发送0或1来控制XIAO上的LED,分别用于关闭或打开LED。

将Seeed Studio XIAO nRF52840放在扩展板上。

为此目的,连接了扩展板的XIAO上传以下程序。

#include <ArduinoBLE.h>
#include <U8x8lib.h>
#include <Wire.h>

// 按钮变量
const int buttonPin = D1;
int oldButtonState = LOW;

void setup() {
Serial.begin(9600);
while (!Serial);

// 将按钮引脚配置为输入
pinMode(buttonPin, INPUT_PULLUP);

// 初始化蓝牙® 低功耗硬件
BLE.begin();

Serial.println("蓝牙® 低功耗中央设备 - LED控制");

// 开始扫描外围设备
BLE.scanForName("XIAO");
}

void loop() {
// 检查是否发现了外围设备
BLEDevice peripheral = BLE.available();
if (peripheral) {
// 发现了外围设备,打印地址、本地名称和广播的服务
Serial.print("发现 ");
Serial.print(peripheral.address());
Serial.print(" '");
Serial.print(peripheral.localName());
Serial.print("' ");
Serial.print(peripheral.advertisedServiceUuid());
Serial.println();

if (peripheral.localName() != "XIAO") {
return;
}

// 停止扫描
BLE.stopScan();

system_control(peripheral);

// 外围设备断开连接,重新开始扫描
BLE.scanForName("XIAO");
}
delay(100);
}

void system_control(BLEDevice peripheral) {
// 连接到外围设备
Serial.println("正在连接...");

if (peripheral.connect()) {
Serial.println("已连接");
} else {
Serial.println("连接失败!");
return;
}

// 发现外围设备属性
Serial.println("正在发现属性...");
if (peripheral.discoverAttributes()) {
Serial.println("属性已发现");
} else {
Serial.println("属性发现失败!");
peripheral.disconnect();
return;
}

// 检索LED特征
BLECharacteristic ledCharacteristic = peripheral.characteristic("19b10001-e8f2-537e-4f6c-d104768a1214");

if (!ledCharacteristic) {
Serial.println("外围设备没有LED特征!");
peripheral.disconnect();
return;
} else if (!ledCharacteristic.canWrite()) {
Serial.println("外围设备没有可写的LED特征!");
peripheral.disconnect();
return;
}

while (peripheral.connected()) {
// 当外围设备连接时
// 读取按钮引脚
int buttonState = digitalRead(buttonPin);

if (oldButtonState != buttonState) {
// 按钮状态改变
oldButtonState = buttonState;

if (buttonState) {
Serial.println("按钮按下");

// 按钮被按下,写入0x01来打开LED
ledCharacteristic.writeValue((byte)0x01);
} else {
Serial.println("按钮释放");

// 按钮被释放,写入0x00来关闭LED
ledCharacteristic.writeValue((byte)0x00);
}
}
}

Serial.println("外围设备已断开连接");
}

上传程序后,打开串口监视器,程序将开始搜索附近本地名称为"XIAO"的蓝牙设备并连接到它(您需要等待1到3分钟)。

一旦串口监视器中显示成功连接消息,您就可以通过扩展板的按键D1来控制另一个XIAO nRF52840 LED的开关。

当然,如果您没有扩展板,您也可以使用自己的按钮或其他设备。

更多内容?

如果您想尝试更多示例,可以导航到 File > Examples > INCOMPATIBLE > ArduinoBLE 并查看 ArduinoBLE 下的所有示例

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...