Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【外设开发】

发布于:2025-06-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、硬件介绍

1、产品特点

Arduino Nano 33 BLE Rev2,利用了nRF52840微控制器的先进功能。这款32位Arm® Cortex®-M4 CPU 64 MHz与MicroPython的兼容性增强了板子的灵活性,该开发板的突出特点是其蓝牙低功耗(BLE)功能,使其能够轻松与其他蓝牙低功耗设备进行通信;Nano 33 BLE Rev2设计具备多功能性,配备了内置的9轴惯性测量单元、提供位置、方向和加速度的精确测量等。

在这里插入图片描述
在这里插入图片描述

微控制器 nRF52840 -
USB连接器 Micro USB -
管脚 LED引脚 IO13
- 通用数字I/O 引脚 14个
- 模拟输入引脚 8个
- PWM 引脚 所有数字I/O 引脚 (4 at once)
- 外部中断 所有数字I/O 引脚
连接 Bluetooth® u-blox® NINA-B306
传感器 IMU BMI270 (三轴加速度计+三轴陀螺仪) BMM150 (三轴磁力计)
麦克风 MP34DT06JTR
手势检测、接近检测、数字环境光感(ALS)和色感(RGBC) APDS9960
气压 LPS22HB
温湿度 HS3003
通信 UART RX/TX
- I2C A4 (SDA), A5 (SCL)
- SPI D11 (COPI), D12 (CIPO), D13 (SCK). Use any GPIO for Chip Select (CS)
供电 输入 / 输出电压 3.3 V
- 输入电压(标准) 5-18 V
- 每个I/O引脚的电流 10 mA
nRF52840 时钟速度 64 MHz
- 存储 256 KB SRAM、1 MB flash
尺寸 重量 0.32g
- 宽度 18 mm
- 长度 45 mm

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)

图示如下:

在这里插入图片描述

原理图如下:

在这里插入图片描述
在这里插入图片描述

使用方法:

安装 BMI270_BMM150 库

BMI270手册

BMM150手册

该库初始化传感器为以下默认值:

  • 加速度计范围设定为 [-4,+4]g -/+0.122 mg。
  • 陀螺仪范围设置为 [-2000,+2000] dps +/-70 mdps。
  • 磁力计范围设置为 [-400,+400] uT +/-0.014 uT。
  • 加速度计输出数据速率固定为 104 Hz。
  • 陀螺仪输出数据速率固定为 104 Hz。
  • 磁力计输出数据速率固定为 20 Hz。
    在这里插入图片描述

1.1、加速度计使用方法 (计算倾斜的角度与方向)

文件->示例->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");
    }
  }
}

在这里插入图片描述

1.2、陀螺仪使用方法(检测设备的碰撞方向,并通过串口打印出碰撞信息)

文件->示例->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);
  }
  }
}

在这里插入图片描述

1.3、磁力计使用方法(通过磁场的强弱调整板载 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

图示如下:

在这里插入图片描述

原理图:

在这里插入图片描述

2.1、声音强度采集使用方法

导入PDM 库(#include <PDM.h>)

MP34DT06J数据手册

PDM.h 库手册

通过麦克风采集声音信号,并根据声音强度控制 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.2、语音识别使用方法

语音识别是一个捕捉、解释和计算语音并将其转换为文本(TTS)的技术领域。一旦语音被转换成文本,它就可以应用于不同的应用,从语音听写到命令语音控制器、健康监测、机器人技术和人工智能或无障碍环境等。

1.安装 Cyberon_DSPotterSDK_Maker_33BLE

在这里插入图片描述

2.激活免费试用许可证

每次识别最多50次 (超出需重启)

每次切换时需等待20s延迟时间

自定义指令最多20条

在这里插入图片描述

工具->获取开发板信息;查看SN序列号

在这里插入图片描述

获得序列号后,打开:Get the Demo License

Board type:Arduino Nano 33 BLE

Board serial number:SN序列号

提交后,得到数字的许可证

在这里插入图片描述

2.3、使用语音识别Demo例程

打开 文件 -> 示例 -> DSpotterSDK_Maker_33BLE -> VoiceRecognition

Cyberon_SDK使用手册

将许可证粘贴在括号之间,如下所示:

在这里插入图片描述

打开串口监视器,可以看到 CyberonSDK 识别的可用命令。

识别到相关语音指令时,串口将输出相关信息;

在这里插入图片描述

自定义命令使用方法

使用 Cyberon 模型配置 来创建自定义语音命令

选择所需识别的语言,设置后 “创建

在这里插入图片描述

创建命令词 ,例如“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 提供),将物理运动信息(即速度、方向和距离)转换为数字信号。

图示如下:

在这里插入图片描述

原理图:

在这里插入图片描述

使用方法:

安装 APDS9960

APDS9960手册

在这里插入图片描述

3.1、接近检测使用方法

文件->示例->Arduino_APDS9960->ProximitySensor

根据物体的接近程度,控制不同颜色的 LED 以不同的频率闪烁,并且串口打印 proximity值

接近值 (proximity) LED 状态 闪烁频率 含义
> 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.2、RGB颜色检测使用方法

颜色传感器分为四个不同的通道(红色、绿色、蓝色和透明光强度);每一个都有一个紫外线和红外线阻挡过滤器和一个专用的数据转换器来同时读取数据。四个不同的通道,不同的颜色数据,能够同时生成16位数据;

在这里插入图片描述

文件->示例->Arduino_APDS9960->ColorSensor

检测环境颜色(RGB 值),并点亮对应颜色的 LED 反馈当前的主色调,同时将 RGB 数据输出到串口上

场景 LED 状态 串口输出
红色为主 红灯亮,其他灭 输出 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);
}

在这里插入图片描述

3.3、手势检测使用方法

传感器的手势检测利用四个定向光电二极管来感测反射的 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 P 0 ) 1 5.255 ] H = 44330 * [1-(\frac{P}{P_0})^\frac{1}{5.255}] H=44330[1(P0P)5.2551]

其中,“H“代表海拔高度,“P“代表传感器测得的压力(kPa),“P0“代表海平面参考压力(101.325 kPa)。

大气压和海拔高度之间的数学关系如下

在这里插入图片描述

图示如下:

在这里插入图片描述

原理图:

在这里插入图片描述

使用方法:

安装 LPS22HB

LPS22HB手册

在这里插入图片描述

4.1、气压传感器使用方法

文件->示例->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

图示如下:

在这里插入图片描述

原理图:

在这里插入图片描述

使用方法:

安装 HS3003

HS3003手册

在这里插入图片描述

5.1、温湿度传感器使用方法

文件->示例->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手册

ArduinoBLE.h手册

在这里插入图片描述

2、安装蓝牙APP【nRF Connect for Mobile / LightBlue】等

在这里插入图片描述

6.1、蓝牙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);        
  }
}


在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到