Skip to main content

基于 Seeed nRF52 mbed-enabled 的蓝牙使用

Seeed Studio XIAO nRF52840Seeed Studio XIAO nRF52840 Sense都支持蓝牙连接。本wiki将介绍基本的蓝牙功能,并提供一个24GHz呼吸睡眠检测模块的演示,由“Seeed nrf52 mbed-enabled Boards Library”使用。

开始

硬件装备

软件准备

Arduino库概述

tip

如果这是您第一次使用Arduino,我们强烈建议您参考 Getting Started with Arduino.

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

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

功能

有关ArduinoBLE代码库的功能和使用介绍,请参阅Arduino website.

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

安装

  • 方法一 (该方法在上述两个代码库中都可用)

如果你已经下载了zip库,那么打开你的Arduino IDE,点击Sketch > Include Library > Add . zip Library。选择你刚下载的zip文件,如果库安装正确,你将在通知窗口中看到库被添加到你的库中。这意味着库安装成功

  • 方法二 (只能安装ArduinoBLE库)

从Arduino IDE 1.5及以上版本(1.6.x)开始添加库管理器。它可以在Sketch菜单下的Include Library Manage Libraries…中找到。

当你打开库管理器时,你会发现一个一键安装的库列表。要为你的产品找到一个库,搜索产品名称或关键字,如k typedigitizer,你想要的库应该会显示出来。点击所需的库,Install按钮就会出现。单击该按钮,库应该会自动安装。安装完成后,关闭库管理器。

应用实例

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

Step 1. 启动Arduino应用程序。

Step 2. 选择您的开发板模型并将其添加到Arduino IDE中。在这里,我们使用“Seeed nrf52 mbed-enabled Boards Library”。

有关板库的安装,请参阅 本教程 完成安装。

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"); // Bluetooth® Low Energy LED Service

// Bluetooth® Low Energy LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin = LED_BUILTIN; // pin to use for the LED

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

// set LED pin to output mode
pinMode(ledPin, OUTPUT);

// begin initialization
if (!BLE.begin()) {
Serial.println("starting Bluetooth® Low Energy module failed!");

while (1);
}

// set advertised local name and service UUID:
BLE.setLocalName("LED");
BLE.setAdvertisedService(ledService);

// add the characteristic to the service
ledService.addCharacteristic(switchCharacteristic);

// add service
BLE.addService(ledService);

// set the initial value for the characeristic:
switchCharacteristic.writeValue(0);

// start advertising
BLE.advertise();

Serial.println("BLE LED Peripheral");
}

void loop() {
// listen for Bluetooth® Low Energy peripherals to connect:
BLEDevice central = BLE.central();

// if a central is connected to peripheral:
if (central) {
Serial.print("Connected to central: ");
// print the central's MAC address:
Serial.println(central.address());

// while the central is still connected to peripheral:
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
}
}
}

// when the central disconnects, print it out:
Serial.print(F("Disconnected from central: "));
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
}
}
}

当看到Studio XIAO nRF52840通过蓝牙设备central.connected()连接并从蓝牙设备 switchcharacteristics .written()接收内容时,此代码的目的是输入判断。如果判断值是非零的 switchcharacteristics .value(),则灯亮,如果判断值为0,则灯亮。

打开串行显示器到9600波特率和led应打开或关闭。输出应该如下图所示。

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

iPhoneAndroidDescription
打开软件,搜索一个蓝牙设备叫 LED 然后点击连接。有些设备可能显示为 Arduino.
进入Seeed Studio XIAO nRF52840蓝牙接口,点击设备即可显示设备详细信息.
填写要发送到Seeed Studio XIAO nRF52840的数据,发送1开灯,发送0关灯.
回到蓝牙控制界面,您可以看到该值已更改,Seeed Studio XIAO nRF52840红灯亮(或关).

2 使用小BLE通过BLE获取24GHz睡眠检测模块的数据

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

按照下图连接seed Studio XIAO nRF52840板和24GHz呼吸睡眠检测模块。想了解更多信息,请点击 这里.

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

//Radar_with_XIAOBLE_example

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

SleepBreathingRadarBLE radar;
BLEService radarService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Low Energy LED Service

// Bluetooth® Low Energy LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEStringCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify, 20);

int last_val = 0;

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

// begin initialization
if (!BLE.begin()) {
Serial.println("starting Seeed Studio XIAO nRF52840 with 60GHz radar sensor demo failed!");
while (1);
}

// set advertised local name and service UUID:
BLE.setLocalName("Seeed Studio XIAO nRF52840");
BLE.setAdvertisedService(radarService);

// add the characteristic to the service
radarService.addCharacteristic(switchCharacteristic);

// add service
BLE.addService(radarService);

// start advertising
BLE.advertise();

Serial.println("Seeed Studio XIAO nRF52840 active, waiting for connections...");
}

void loop() {
// listen for Bluetooth® Low Energy peripherals to connect:
BLEDevice central = BLE.central();

// if a central is connected to peripheral:
if (central) {
Serial.print("Connected to central: ");
// print the central's MAC address:
Serial.println(central.address());

// while the central is still connected to peripheral:
while (central.connected()){
radar.recvRadarBytes(); //Receive radar data and start processing
if (radar.newData == true) { //The data is received and transferred to the new list dataMsg[]
byte dataMsg[radar.dataLen+3] = {0x00};
dataMsg[0] = 0x53; //Add the header frame as the first element of the array
for (byte n = 0; n < radar.dataLen; n++)dataMsg[n+1] = radar.Msg[n]; //Frame-by-frame transfer
dataMsg[radar.dataLen+1] = 0x54;
dataMsg[radar.dataLen+2] = 0x43;
radar.newData = false; //A complete set of data frames is saved
int new_val = radar.Sleep_inf(dataMsg); //Use radar built-in algorithm to output human motion status
if(new_val != last_val){
radar.OutputAssignment(new_val);
switchCharacteristic.setValue(radar.str);
last_val = new_val;
}
}
}

// when the central disconnects, print it out:
Serial.print(F("Disconnected from central: "));
Serial.println(central.address());
}
}

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

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

打开串行显示器,将波特率调到9600,应该可以显示传感器和它指向的物体之间的距离,单位是毫米和英尺。输出应该如下图所示。

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

iPhoneAndroidDescription
打开软件,搜索一个蓝牙设备叫 Seeed Studio XIAO nRF52840 然后点击连接。有些设备可能显示为 Arduino.
=进入Seeed Studio XIAO nRF52840蓝牙接口,点击设备即可显示设备详细信息.
打开软件的实时更新数据.
接下来,只要雷达检测到睡眠信息,它就会通过Seeed Studio XIAO nRF52840的蓝牙发送到手机.

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

在本例中,我们将使用2个XIAO nRF52840,利用它们的蓝牙功能进行通信。其中1个连接到XIAO Expansion board上,通过Expansion board上的按钮发送控制命令。另一个充当从动装置。

在开始之前,请做好以下准备。

Seeed Studio XIAO Expansion board2 x Seeed XIAO BLE nRF52840 Sense

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

#include <ArduinoBLE.h>

BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Low Energy LED Service

// Bluetooth® Low Energy LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin = LED_BUILTIN; // pin to use for the LED

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

// set LED pin to output mode
pinMode(ledPin, OUTPUT);

// begin initialization
if (!BLE.begin()) {
Serial.println("starting Bluetooth® Low Energy module failed!");

while (1);
}

// set advertised local name and service UUID:
BLE.setLocalName("XIAO");
BLE.setAdvertisedService(ledService);

// add the characteristic to the service
ledService.addCharacteristic(switchCharacteristic);

// add service
BLE.addService(ledService);

// set the initial value for the characeristic:
switchCharacteristic.writeValue(0);

// start advertising
BLE.advertise();

// print address
Serial.print("Address: ");
Serial.println(BLE.address());

Serial.println("XIAO nRF52840 Peripheral");
}

void loop() {
// listen for Bluetooth® Low Energy peripherals to connect:
BLEDevice central = BLE.central();

// if a central is connected to peripheral:
if (central) {
Serial.print("Connected to central: ");
// print the central's MAC address:
Serial.println(central.address());

// while the central is still connected to peripheral:
while (central.connected()) {
// if the remote device wrote to the characteristic,
// use the value to control the LED:
if (switchCharacteristic.written()) {
if (switchCharacteristic.value()) { // any value other than 0
Serial.println("LED on");
digitalWrite(ledPin, HIGH); // will turn the LED on
} else { // a 0 value
Serial.println(F("LED off"));
digitalWrite(ledPin, LOW); // will turn the LED off
}
}
}

// when the central disconnects, print it out:
Serial.print(F("Disconnected from central: "));
Serial.println(central.address());
}
}

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

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

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

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

// variables for button
const int buttonPin = D1;
int oldButtonState = LOW;

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

// configure the button pin as input
pinMode(buttonPin, INPUT_PULLUP);

// initialize the Bluetooth® Low Energy hardware
BLE.begin();

Serial.println("Bluetooth® Low Energy Central - LED control");

// start scanning for peripherals
BLE.scanForName("XIAO");
}

void loop() {
// check if a peripheral has been discovered
BLEDevice peripheral = BLE.available();
if (peripheral) {
// discovered a peripheral, print out address, local name, and advertised service
Serial.print("Found ");
Serial.print(peripheral.address());
Serial.print(" '");
Serial.print(peripheral.localName());
Serial.print("' ");
Serial.print(peripheral.advertisedServiceUuid());
Serial.println();

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

// stop scanning
BLE.stopScan();

system_control(peripheral);

// peripheral disconnected, start scanning again
BLE.scanForName("XIAO");
}
delay(100);
}

void system_control(BLEDevice peripheral) {
// connect to the peripheral
Serial.println("Connecting ...");

if (peripheral.connect()) {
Serial.println("Connected");
} else {
Serial.println("Failed to connect!");
return;
}

// discover peripheral attributes
Serial.println("Discovering attributes ...");
if (peripheral.discoverAttributes()) {
Serial.println("Attributes discovered");
} else {
Serial.println("Attribute discovery failed!");
peripheral.disconnect();
return;
}

// retrieve the LED characteristic
BLECharacteristic ledCharacteristic = peripheral.characteristic("19b10001-e8f2-537e-4f6c-d104768a1214");

if (!ledCharacteristic) {
Serial.println("Peripheral does not have LED characteristic!");
peripheral.disconnect();
return;
} else if (!ledCharacteristic.canWrite()) {
Serial.println("Peripheral does not have a writable LED characteristic!");
peripheral.disconnect();
return;
}

while (peripheral.connected()) {
// while the peripheral is connected
// read the button pin
int buttonState = digitalRead(buttonPin);

if (oldButtonState != buttonState) {
// button changed
oldButtonState = buttonState;

if (buttonState) {
Serial.println("button pressed");

// button is pressed, write 0x01 to turn the LED on
ledCharacteristic.writeValue((byte)0x01);
} else {
Serial.println("button released");

// button is released, write 0x00 to turn the LED off
ledCharacteristic.writeValue((byte)0x00);
}
}
}

Serial.println("Peripheral disconnected");
}

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

当串口显示器显示连接成功的消息后,通过级联板D1键控制另一侧肖nRF52840 LED的切换。

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

另外

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

技术支持和产品讨论

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

Loading Comments...