一、硬件介绍
1、产品特点
Arduino Nano 33 BLE Rev2,利用了nRF52840微控制器的先进功能。这款32位Arm® Cortex®-M4 CPU 64 MHz与MicroPython的兼容性增强了板子的灵活性,该开发板的突出特点是其蓝牙低功耗(BLE)功能,使其能够轻松与其他蓝牙低功耗设备进行通信。Nano 33 BLE Rev2设计具备多功能性,配备了内置的9轴惯性测量单元、提供位置、方向和加速度的精确测量等。
2、功能引脚示意图 / 原理图
板载LED灯
> IO13 引脚控制
原理图:
> 5V引脚仅在满足以下两个条件时可用:标记为VUSB的两个焊盘上制作焊接桥 / 通过USB端口为 Nano 33 BLE Sense Rev2 供电。
> 如果从VIN引脚给电路板供电,不会得到任何稳定的5V,即使你做焊接桥,5V引脚也不会输出。
二、板载传感器使用方法
1、9轴IMU (BMI270 + BMM150)
BMI270(三轴加速度计+三轴陀螺仪)
> 16位三轴陀螺仪(0.004 dps/LSB) :±125 dps (262.1 LSB/dps) ~ ±2000 dps (16.4 LSB/dps)
> 16位三轴加速度计(0.06 mg/LSB):±2 g (16384 LSB/g) ~ ±16 g (2048 LSB/g)
BMM150(三轴数字地磁传感器)
> 分辨率: 0.3μT、零点漂移: ±40μT(25℃)
> 测量范围: ±1300μT (x,y-axis),±2500μT (z-axis)
> 数据输出速率: 10Hz(nomal mode:Regular preset)
图示如下:
原理图如下:
使用方法:
1、安装 BMI270_BMM150 库
> [BMI270手册](https://docs.arduino.cc/resources/datasheets/bst-bmi270-ds000.pdf)
> [BMM150手册](https://docs.arduino.cc/resources/datasheets/bst-bmm150-ds001.pdf)
该库初始化传感器为以下默认值:
- 加速度计范围设定为[-4,+4]g -/+0.122 mg。
- 陀螺仪**范围设置为[-2000,+2000] dps +/-70 mdps。
- 磁力计范围设置为[-400,+400] uT +/-0.014 uT。
- 加速度计输出数据速率固定为 104 Hz。
- 陀螺仪输出数据速率固定为 104 Hz。
- 磁力计输出数据速率固定为 20 Hz。
2、加速度计使用方法(计算倾斜的角度与方向)
文件->示例->Arduino_BMI270_BMM150->SimpleAccelerometer
修改为以下代码
#include "Arduino_BMI270_BMM150.h" float x, y, z; int degreesX = 0; int degreesY = 0; void setup() { Serial.begin(9600); while (!Serial); Serial.println("Started"); if (!IMU.begin()) { Serial.println("Failed to initialize IMU!"); while (1); } Serial.print("Accelerometer sample rate = "); Serial.print(IMU.accelerationSampleRate()); Serial.println(" Hz"); } void loop() { float x, y, z; if (IMU.accelerationAvailable()) { IMU.readAcceleration(x, y, z); if(x > 0.1){ x = 100*x; degreesX = map(x, 0, 97, 0, 90); Serial.print("Tilting up "); Serial.print(degreesX); Serial.println(" degrees"); } if(x < -0.1){ x = 100*x; degreesX = map(x, 0, -100, 0, 90); Serial.print("Tilting down "); Serial.print(degreesX); Serial.println(" degrees"); } if(y > 0.1){ y = 100*y; degreesY = map(y, 0, 97, 0, 90); Serial.print("Tilting left "); Serial.print(degreesY); Serial.println(" degrees"); } if(y < -0.1){ y = 100*y; degreesY = map(y, 0, -100, 0, 90); Serial.print("Tilting right "); Serial.print(degreesY); Serial.println(" degrees"); } } }
3、陀螺仪使用方法(检测设备的碰撞方向(前、后、左、右),并通过串口打印信息)
文件->示例->Arduino_BMI270_BMM150->**SimpleGyroscope
修改为以下代码
当角速度超过这些阈值时,认为发生了碰撞,并通过串口打印出碰撞信息
#include "Arduino_BMI270_BMM150.h" float x, y, z; int plusThreshold = 30, minusThreshold = -30; //设定的阈值 30°/s -30°/s void setup() { Serial.begin(9600); while (!Serial); Serial.println("Started"); if (!IMU.begin()) { Serial.println("Failed to initialize IMU!"); while (1); } Serial.print("Gyroscope sample rate = "); Serial.print(IMU.gyroscopeSampleRate()); Serial.println(" Hz"); Serial.println(); Serial.println("Gyroscope in degrees/second"); } void loop() { if (IMU.gyroscopeAvailable()) { IMU.readGyroscope(x, y, z); if(y > plusThreshold) { Serial.println("Collision front"); delay(500); } if(y < minusThreshold) { Serial.println("Collision back"); delay(500); } if(x < minusThreshold) { Serial.println("Collision right"); delay(500); } if(x > plusThreshold) { Serial.println("Collision left"); delay(500); } } }
4、磁力计使用方法(通过磁场的强弱调整板载 LED 的亮度)
文件->示例->Arduino_BMI270_BMM150->SimpleMagnetometer
修改为以下代码
根据磁场强度调整 LED 亮度(PWM 输出)
#include "Arduino_BMI270_BMM150.h" float x,y,z, ledvalue; void setup() { if (!IMU.begin()) { Serial.println("Failed to initialize IMU!"); while (1); } } void loop() { IMU.readMagneticField(x, y, z); if(x < 0) { ledvalue = -(x); } else{ ledvalue = x; } analogWrite(LED_BUILTIN, ledvalue); delay(500); }
2、全向麦克风(MP34DT06JTR)
MP34DT06JTR 传感器是一个超紧凑型麦克风,使用 PDM(脉冲密度调制);低失真数字麦克风。
> 信噪比:64dB
> 灵敏度:-26dBFS ± 3dB
> 温度范围:-40 至 85 ° C
图示如下:
原理图:
1、声音强度采集使用方法:
导入PDM 库(#include <PDM.h>)
> [MP34DT06J数据手册](https://docs.arduino.cc/resources/datasheets/MP34DT06JTR.pdf)
> [PDM.h 库手册](https://docs.arduino.cc/learn/built-in-libraries/pdm/)
通过麦克风采集声音信号,并根据声音强度控制 RGB_LED 的颜色变化,并通过串口打印数据
高音量(≥500):红色 LED 亮;
中音量(250~500):蓝色 LED 亮;
低音量(0~250):绿色 LED 亮;
代码如下
#include <PDM.h> // 存储 16 位音频样本的缓冲区 short sampleBuffer[256]; // 记录当前读取的样本数 volatile int samplesRead; void setup() { Serial.begin(9600); while (!Serial); // 回调函数 PDM.onReceive(onPDMdata); // 默认增益 20 dB,可通过 PDM.setGain(30) 调整。 // PDM.setGain(30); // 采样率:16 kHz;1 为单声道,2 为立体声 if (!PDM.begin(1, 16000)) { Serial.println("Failed to start PDM!"); while (1); } } void loop() { // 检测是否有新数据 if (samplesRead) { // 遍历样本缓冲区,根据声音强度控制 LED for (int i = 0; i < samplesRead; i++) { Serial.println(sampleBuffer[i]); if (sampleBuffer[i]>=500){ digitalWrite(LEDR,LOW); digitalWrite(LEDG,HIGH); digitalWrite(LEDB,HIGH); } if (sampleBuffer[i]>=250 && sampleBuffer[i] < 500){ digitalWrite(LEDB,LOW); digitalWrite(LEDR,HIGH); digitalWrite(LEDG,HIGH); } if (sampleBuffer[i]>=0 && sampleBuffer[i] < 250){ digitalWrite(LEDG,LOW); digitalWrite(LEDR,HIGH); digitalWrite(LEDB,HIGH); } } // 清除 samplesRead = 0; } } //回调函数 void onPDMdata() { int bytesAvailable = PDM.available(); PDM.read(sampleBuffer, bytesAvailable); samplesRead = bytesAvailable / 2; }
2、语音识别使用方法
语音识别是一个捕捉、解释和计算语音并将其转换为文本(TTS)的技术领域。一旦语音被转换成文本,它就可以应用于不同的应用,从语音听写到命令语音控制器、健康监测、机器人技术和人工智能或无障碍环境等。
1.安装 Cyberon_DSPotterSDK_Maker_33BLE库
2.激活免费试用许可证
> 每次识别最多50次 (超出需重启)
> 每次切换时需等待20s延迟时间
> 自定义指令最多20条
工具->获取开发板信息;查看SN序列号
获得序列号后,打开:[Get the Demo License](https://tool.cyberon.com.tw/ArduinoDSpotterAuth/FDMain.php)
> Board type:Arduino Nano 33 BLE
> Board serial number:SN序列号
提交后,得到数字的许可证
3、使用语音识别Demo例程
打开 文件 -> 示例 -> DSpotterSDK_Maker_33BLE -> VoiceRecognition
> [Cyberon_SDK使用手册](https://tool.cyberon.com.tw/ArduinoDSpotterAuth/Document/Cyberon_DSpotterSDK_Maker_User_Guide_Arduino_Platform.pdf)
将许可证粘贴在括号之间,如下所示:
打开串口监视器,可以看到 CyberonSDK 识别的可用命令。
识别到相关语音指令时,串口将输出相关信息;
自定义命令使用方法
使用 [Cyberon 模型配置](https://tool.cyberon.com.tw/ArduinoDSpotterAuth/CTMain.php) 来创建自定义语音命令
选择所需识别的语言,设置后 “创建 ”
创建命令词 ,例如“Hi Arduino”;触发设备
创建指令词列表 ,最多20条;
生成的文件,将发送至注册的邮箱上,然后下载生成的文件
在 VoiceRecognition 项目的基础上
1、将下载好的文件导入至与ino项目同目录下
2、进行头文件的替换;
... #include "CybLicense.h" -> #include "CybLicense_<id>.h" (#include "Model_1749390083.h") ... #include "Model_L1.h" -> #include "Model_<id>.h" (#include "Model_1749390083.h") ... #include "Model_L0.h" -> #include "Model_<id>.h" (#include "Model_1749390083.h")
3、实现效果
以命令语音 “Hi Arduino”启动;
启动后,当命令词为 “打开红灯”,打开RGB红色;
当命令词为 “关闭红灯”,关闭RGB红色;
…
当命令词为 “打开LED灯”,打开板载LED灯(LED_BUILTIN);
当命令词为 “关闭LED灯”,关闭板载LED灯(LED_BUILTIN);
语音命令 / 指令如下:
Trigger:
100 Hi Arduino
Command:
10000 打开红灯
10001 关闭红灯
10002 打开绿灯
10003 关闭绿灯
10004 打开蓝灯
10005 关闭蓝灯
10006 打开LED灯
10007 关闭LED灯
void VRCallback(int nFlag, int nID, int nScore, int nSG, int nEnergy)
参数说明:
> `nFlag`:事件类型(如初始化成功、识别结果、错误等)
> `nID`:具体的事件子类型或命令ID(如触发的语音指令ID)
> `nScore`:语音匹配得分(越高表示匹配度越好)
> `nSG`:语音与非命令(静音/杂音)的差异得分(越高表示越可能是有效指令)
> `nEnergy`:语音能量(音量大小)
代码如下
#include <Arduino.h> #include <DSpotterSDK_MakerHL.h> #include "CybLicense_1749390083.h" #define DSPOTTER_LICENSE g_lpdwLicense #if defined(TARGET_ARDUINO_NANO33BLE) || defined(TARGET_PORTENTA_H7) || defined(TARGET_NICLA_VISION) #include "Model_1749390083.h" #endif #define DSPOTTER_MODEL g_lpdwModel static DSpotterSDKHL g_oDSpotterSDKHL; //初始化板载LED、RGB 熄灭状态 void LED_Init(){ pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDB, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); digitalWrite(LED_BUILTIN, LOW); } void LED_ALL_Off(){ digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); digitalWrite(LED_BUILTIN, LOW); } // 回调处理函数 void VRCallback(int nFlag, int nID, int nScore, int nSG, int nEnergy) { if (nFlag==DSpotterSDKHL::InitSuccess) // 初始化成功 { //ToDo } else if (nFlag==DSpotterSDKHL::GetResult) // 获取识别结果 { //ToDo 处理代码 switch(nID) { case 100: Serial.println(F("Arduino 已唤醒!")); // Add your own code here break; case 10000: Serial.println(F("红灯已打开")); digitalWrite(LEDR, LOW); break; case 10001: Serial.println(F("红灯已关闭")); digitalWrite(LEDR, HIGH); break; case 10002: Serial.println(F("绿灯已打开")); digitalWrite(LEDG, LOW); break; case 10003: Serial.println(F("绿灯已关闭")); digitalWrite(LEDG, HIGH); break; case 10004: Serial.println(F("蓝灯已打开")); digitalWrite(LEDB, LOW); break; case 10005: Serial.println(F("蓝灯已关闭")); digitalWrite(LEDB, HIGH); break; case 10006: Serial.println(F("板载LED已打开")); digitalWrite(LED_BUILTIN, HIGH); break; case 10007: Serial.println(F("板载LED已关闭")); digitalWrite(LED_BUILTIN, LOW); break; default: break; } } else if (nFlag==DSpotterSDKHL::ChangeStage) // 命令 / 指令状态切换 { switch(nID) { case DSpotterSDKHL::TriggerStage: //唤醒词 //To Do LED_ALL_Off(); break; case DSpotterSDKHL::CommandStage: //指令词 //To Do break; default: break; } } else if (nFlag==DSpotterSDKHL::GetError) //错误处理 { if (nID == DSpotterSDKHL::LicenseFailed) { //Serial.print("DSpotter license failed! The serial number of your device is "); //Serial.println(DSpotterSDKHL::GetSerialNumber()); } g_oDSpotterSDKHL.Release();// 释放SDK资源 while(1); } else if (nFlag == DSpotterSDKHL::LostRecordFrame) //录音帧丢失处理 { //ToDo } } void setup() { LED_Init(); Serial.begin(9600); while(!Serial); DSpotterSDKHL::ShowDebugInfo(true); if (g_oDSpotterSDKHL.Init(DSPOTTER_LICENSE, sizeof(DSPOTTER_LICENSE), DSPOTTER_MODEL, VRCallback) != DSpotterSDKHL::Success) return; } void loop() { g_oDSpotterSDKHL.DoVR(); }
3、接近、环境光RGB 和手势检测(APDS9960)
APDS9960传感器具有先进的手势检测、接近检测、数字环境光感测(ALS)和颜色感测(RGBC)功能。
> 手势检测利用四个定向光电二极管来感测反射的 IR 能量(由集成 LED 提供),将物理运动信息(即速度、方向和距离)转换为数字信号。
图示如下:
原理图:
使用方法:
1、安装 APDS9960 库
> [APDS9960手册](https://content.arduino.cc/assets/Nano_BLE_Sense_av02-4191en_ds_apds-9960.pdf)
2、接近检测使用方法
文件->示例->Arduino_APDS9960->ProximitySensor
根据物体的接近程度,控制不同颜色的 LED 以不同的频率闪烁,并且串口打印 proximity值
> 150 | 绿色 LED 闪烁 | 1000ms(慢) | 物体较远
50 < proximity <= 150 | 蓝色 LED 闪烁 | 500ms(中) | 物体中等距离
<= 50 | 红色 LED 闪烁 | 100ms(快) | 物体非常近
修改为以下代码
#include <Arduino_APDS9960.h> int ledState = LOW; unsigned long previousMillis = 0; const long intervalLong = 1000; const long intervalMed = 500; const long intervalShort = 100; void setup() { Serial.begin(9600); while (!Serial); if (!APDS.begin()) { Serial.println("Error initializing APDS9960 sensor!"); } pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDB, OUTPUT); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); } void loop() { unsigned long currentMillis = millis(); if (APDS.proximityAvailable()) { int proximity = APDS.readProximity(); if (proximity > 150) { if (currentMillis - previousMillis >= intervalLong) { previousMillis = currentMillis; ledState = !ledState; digitalWrite(LEDG, ledState); digitalWrite(LEDR, HIGH); digitalWrite(LEDB, HIGH); } } else if(proximity > 50 && proximity <= 150){ if (currentMillis - previousMillis >= intervalMed) { previousMillis = currentMillis; ledState = !ledState; digitalWrite(LEDB, ledState); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); } } else { if (currentMillis - previousMillis >= intervalShort) { previousMillis = currentMillis; ledState = !ledState; digitalWrite(LEDR, ledState); digitalWrite(LEDB, HIGH); digitalWrite(LEDG, HIGH); } } Serial.println(proximity); } }
3、RGB颜色检测使用方法
颜色传感器分为四个不同的通道(红色、绿色、蓝色和透明光强度);每一个都有一个紫外线和红外线阻挡过滤器和一个专用的数据转换器来同时读取数据。四个不同的通道,不同的颜色数据,能够同时生成16位数据;
文件->示例->Arduino_APDS9960->ColorSensor
检测环境颜色(RGB 值),并点亮对应颜色的 LED 反馈当前的主色调,同时将 RGB 数据输出到串口上
红色为主 | 红灯亮,其他灭 | 输出 r, g, b值 |
绿色为主 | 绿灯亮,其他灭 | 输出 r, g, b值 |
蓝色为主 | 蓝灯亮,其他灭 | 输出 r, g, b值 |
无明确主色调 | 所有 LED 熄灭 | 输出 r, g, b值 |
修改为以下代码
#include <Arduino_APDS9960.h> void setup() { Serial.begin(9600); while (!Serial); if (!APDS.begin()) { Serial.println("Error initializing APDS9960 sensor."); } } void loop() { while (! APDS.colorAvailable()) { delay(5); } int r, g, b; APDS.readColor(r, g, b); if (r > g & r > b) { digitalWrite(LEDR, LOW); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); } else if (g > r & g > b) { digitalWrite(LEDG, LOW); digitalWrite(LEDR, HIGH); digitalWrite(LEDB, HIGH); } else if (b > g & b > r) { digitalWrite(LEDB, LOW); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); } else { digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); } Serial.print("Red light = "); Serial.println(r); Serial.print("Green light = "); Serial.println(g); Serial.print("Blue light = "); Serial.println(b); Serial.println(); delay(500); }
4、手势检测使用方法
传感器的手势检测利用四个定向光电二极管来感测反射的 IR 能量(由集成 LED 提供),从而将物理运动信息(即速度、方向和距离)转换为数字信息。
如果检测到手势,读取手势类型,并通过串口打印对应的手势方向(上、下、左、右)。
根据手势方向点亮不同的LED:
> UP(上):点亮红色LED 1s后熄灭。
> DOWN(下):点亮绿色LED 1s后熄灭。
> LEFT(左):点亮蓝色LED 1s后熄灭。
> RIGHT(右):点亮板载内置LED 1s后熄灭。
手势方向定义:
> UP:从USB接口朝向天线方向。
> DOWN:从天线朝向USB接口方向。
> LEFT:从模拟引脚侧朝向数字引脚侧。
> RIGHT:从数字引脚侧朝向模拟引脚侧。
文件->示例->Arduino_APDS9960->GestureSensor
修改代码如下
#include <Arduino_APDS9960.h> void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDB, OUTPUT); while (!Serial); if (!APDS.begin()) { Serial.println("Error initializing APDS9960 sensor!"); } Serial.println("Detecting gestures ..."); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); } void loop() { if (APDS.gestureAvailable()) { // 读取手势 int gesture = APDS.readGesture(); switch (gesture) { case GESTURE_UP: Serial.println("Detected UP gesture"); digitalWrite(LEDR, LOW); delay(1000); digitalWrite(LEDR, HIGH); break; case GESTURE_DOWN: Serial.println("Detected DOWN gesture"); digitalWrite(LEDG, LOW); delay(1000); digitalWrite(LEDG, HIGH); break; case GESTURE_LEFT: Serial.println("Detected LEFT gesture"); digitalWrite(LEDB, LOW); delay(1000); digitalWrite(LEDB, HIGH); break; case GESTURE_RIGHT: Serial.println("Detected RIGHT gesture"); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); break; default: break; } } }
4、气压传感器(LPS22HB)
LPS22HB 是一款超紧凑型压阻式绝对压力传感器,可用作数字输出气压计。该器件包括一个传感元件和一个 IC 接口,该接口通过 I2C 或 SPI 进行通信。
> 检测绝对压力的传感元件由悬浮硅膜组成,工作温度范围为 -40 °C 至+85 °C。
气压传感器,包含一个通过与大气接触的电阻板形成的隔膜;
大气压力是根据隔膜由于压力的变形程度来检测的;压力越高,隔膜移动的越多,气压计示数越高。
根据气压力传感器获得的值,使用以下数学公式来计算环境的近似高度(以米为单位):
Barometric 公式
H = 44330 * 【1-(P / P0)^(1 /5.255 )】
> 其中,“H“代表海拔高度,“P“代表传感器测得的压力(kPa),“P0“代表海平面参考压力(101.325 kPa)。
大气压和海拔高度之间的数学关系如下
图示如下:
原理图:
使用方法:
1、安装 LPS22HB 库
> [LPS22HB手册](https://www.st.com/resource/en/datasheet/lps22hb.pdf)
2、气压传感器使用方法
文件->示例->Arduino_LPS22HB->ReadPressure
通过板载的气压传感器测量大气压力值,并转换为当前的海拔高度值,最后通过串口输出结果;
修改代码如下
#include <Arduino_LPS22HB.h> void setup() { Serial.begin(9600); while (!Serial); if (!BARO.begin()) { Serial.println("Failed to initialize pressure sensor!"); while (1); } } void loop() { float pressure = BARO.readPressure(); float altitude = 44330 * ( 1 - pow(pressure/101.325, 1/5.255) ); Serial.print("当前大气压 = "); Serial.print(pressure); Serial.println(" Kpa"); Serial.print("当前海拔高度 = "); Serial.print(altitude); Serial.println(" m"); Serial.println(); delay(1000); }
5、温湿度传感器(HS3003)
温度传感器是将物理温度转换为数字数据的组件。同样,湿度传感器能够测量大气湿度并将其转换为电信号;
HS3003 是一款超紧凑型相对湿度和温度传感器,使用 I2C 协议与传感器通信并从中获取数据。
> 湿度精度:± 3.5% rH,20 ~ +80% rH
> 湿度范围:0 ~ 100%
> 温度精度:± 0.5 °C,15 ~ +40 °C
> 温度范围:-40 ~ 120°C
图示如下:
原理图:
使用方法:
1、安装 HS3003 库
> [HS3003手册](https://docs.arduino.cc/resources/datasheets/REN_HS300x-Datasheet_DST.pdf)
2、温湿度传感器使用方法
文件->示例->Ardunio_HS300x->ReadSensors
读取HS3003温湿度传感器数据,并通过串口打印温度和湿度值;
只有当 温度变化 ≥ 0.5°C 或 湿度变化 ≥ 1% 时,才会打印新数据。
修改代码如下
#include <Arduino_HS300x.h> float old_temp = 0; float old_hum = 0; void setup() { Serial.begin(9600); while (!Serial); if (!HS300x.begin()) { Serial.println("Failed to initialize humidity temperature sensor!"); while (1); } } void loop() { float temperature = HS300x.readTemperature(); float humidity = HS300x.readHumidity(); if (abs(old_temp - temperature) >= 0.5 || abs(old_hum - humidity) >= 1 ) { Serial.print("温度 = "); Serial.print(temperature); Serial.println(" °C"); Serial.print("湿度 = "); Serial.print(humidity); Serial.println(" %"); Serial.println(); delay(1000); } }
6、蓝牙功能(nRF52840)
nRF52840 SoC,可以满足需要协议并发性、丰富外围设备和复杂应用所面临的挑战。它为闪存和RAM提供了充足的内存,nRF52840是具有完全协议并发能力的多协议SoC。
它支持低功耗蓝牙、蓝牙Mesh、Thread、Zigbee、802.15.4、ANT和2.4 GHz专有协议栈。
> 64 MHz Arm Cortex-M4 带FPU
> 1 MB闪存 + 256 KB RAM
> 低功耗蓝牙,蓝牙mesh
图示如下:
使用方法:
1、安装 ArduinoBLE 库
> [nRF52840手册](https://docs.nordicsemi.com/category/nrf52840-category)
> [ArduinoBLE.h手册](https://docs.arduino.cc/libraries/arduinoble/)
2、安装蓝牙APP【nRF Connect for Mobile / LightBlue】等
3、蓝牙BLE使用方法
文件->示例->ArdunioBLE->Peripheral->LED
使用手机APP连接开发板的蓝牙,发送不同指令值(1,2,3)分别点亮红、绿、蓝色LED,当中央设备(如手机)连接时点亮板载LED;
断开连接时关闭所有LED。
修改代码如下
#include <ArduinoBLE.h> BLEService ledService("180A"); // 设备信息 BLEByteCharacteristic switchCharacteristic("2A57", BLERead | BLEWrite);//数字输出 void setup() { Serial.begin(9600); while (!Serial); //LED初始化 关闭 pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDB, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); if (!BLE.begin()) { Serial.println("蓝牙启动失败!"); while (1); } // 蓝牙设备名称 BLE.setLocalName("Nano 33 BLE Sense"); BLE.setAdvertisedService(ledService); ledService.addCharacteristic(switchCharacteristic); BLE.addService(ledService); // 初始值 switchCharacteristic.writeValue(0); BLE.advertise(); Serial.println("BLE LED Peripheral"); } void loop() { BLEDevice central = BLE.central(); // 连接成功 if (central) { Serial.print("Connected to central: "); // 输出 central's MAC address: Serial.println(central.address()); digitalWrite(LED_BUILTIN, HIGH); //打开板载LED while (central.connected()) { // 根据蓝牙发送不同的值,控制不同LED的颜色 if (switchCharacteristic.written()) { switch (switchCharacteristic.value()) { case 1: Serial.println("Red LED on"); digitalWrite(LEDR, LOW); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); break; case 2: Serial.println("Green LED on"); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, LOW); digitalWrite(LEDB, HIGH); break; case 3: Serial.println("Blue LED on"); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, LOW); break; default: Serial.println(F("LEDs off")); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); break; } } } //断开连接时 关闭LED Serial.print(F("Disconnected from central: ")); Serial.println(central.address()); digitalWrite(LED_BUILTIN, LOW); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); } }
三、总结
以上为板载的外设功能使用方法,包括IMU、麦克风、手势检测、气压、温湿度、蓝牙功能等;通过使用不同的外设功能,掌握了相关的理论以及相关外设相关的知识。开发板还具有相关机器学习(TinyML、TensorFlow Lite)等功能,可以在音频分类、对象检测、姿势估计、语音和手势识别上有相关的应用等;