这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » ArduinoNano33BLESenseRev2【室内空气质量语音检测蓝牙调光

共1条 1/1 1 跳转至

ArduinoNano33BLESenseRev2【室内空气质量语音检测蓝牙调光台灯】

菜鸟
2025-06-18 16:47:25     打赏

一、硬件介绍

1、产品特点

Arduino Nano 33 BLE Rev2,利用了nRF52840微控制器的先进功能。这款32位Arm® Cortex®-M4 CPU 64 MHz与MicroPython的兼容性增强了板子的灵活性,该开发板的突出特点是其蓝牙低功耗(BLE)功能,使其能够轻松与其他蓝牙低功耗设备进行通信。

Nano 33 BLE Rev2设计具备多功能性,配备了内置的9轴惯性测量单元、提供位置、方向和加速度的精确测量等。

image-20250522175223992.png

image-20250522215352956.png


2、功能引脚示意图 / 原理图


image-20250523224729366.png





5V引脚仅在满足以下两个条件时可用:标记为VUSB的两个焊盘上制作焊接桥 / 通过USB端口为 Nano 33 BLE Sense Rev2 供电;

如果从VIN引脚给电路板供电,不会得到任何稳定的5V,即使你做焊接桥,5V引脚也不会输出。


二、项目功能实现思想

【室内空气质量语音检测蓝牙调光台灯】


实现效果:

通过板载麦克风识别相关语音指令,可获取当前室内的温湿度、气压等信息输出到串口上,以及声控打开 / 关闭LED;

并且通过蓝牙功能,通过手机连接开发板,发送相关指令实现PWM调节LED亮度等功能;


实物效果搭建如下:


image-20250616180030378.png


系统框图如下:


image-20250616210016948.png


运行流程图如下:


image-20250616233956456.png



三、功能实现主要步骤

主要相关代码

1、LED控制部分

int Ble_Data;   //接收到的蓝牙数据
int led = D2;   //LED引脚

void Led_Init(void){
    pinMode(led, OUTPUT);
    digitalWrite(led,LOW);
}


2、温湿度获取部分

#include <Arduino_HS300x.h>

void HS300x_Init(void){
   	if (!HS300x.begin()) {
    Serial.println("温湿度传感器初始化失败!");
    while (1);
  }
}

void HS300x_Get(void){
  float temperature = HS300x.readTemperature();	//温度
  float humidity    = HS300x.readHumidity();	//湿度

  Serial.print("温度 = ");
  Serial.print(temperature);
  Serial.println(" °C");

  Serial.print("湿度 = ");
  Serial.print(humidity);
  Serial.println(" %");
  Serial.println();
}


3、气压、海拔高度获取部分

#include <Arduino_LPS22HB.h>

void LPS22HB_Init(void){
if (!BARO.begin()) {
    Serial.println("气压传感器初始化失败!");
    while (1);
  }
}

void LPS22HB_Get(void){
  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");
}


4、语音识别部分

唤醒词:  100 Hi Arduino

命令词:  10000 打开LED  

10001 关闭LED  

10002 获取室内空气质量

#include <Arduino.h>
#include <DSpotterSDK_MakerHL.h>
#include "CybLicense_1750150084.h"
#define DSPOTTER_LICENSE g_lpdwLicense

#if defined(TARGET_ARDUINO_NANO33BLE) || defined(TARGET_PORTENTA_H7) || defined(TARGET_NICLA_VISION)
#include "Model_1750150084.h"    
#endif      

#define DSPOTTER_MODEL g_lpdwModel
static DSpotterSDKHL g_oDSpotterSDKHL;

// 回调处理函数
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("LED已打开"));
            digitalWrite(led,HIGH);
            break;
          case 10001:
            Serial.println(F("LED已关闭"));
            digitalWrite(led,LOW);
            break;
          case 10002:
             HS300x_Get();
             LPS22HB_Get();
             Ble_Init();
             delay(800);
            break;
          default:
            break;
      }
  }
  else if (nFlag==DSpotterSDKHL::ChangeStage) // 命令 / 指令状态切换
  {
      switch(nID)
      {
          case DSpotterSDKHL::TriggerStage:     //唤醒词
            //To Do
            break;
          case DSpotterSDKHL::CommandStage:     //指令词
            //To Do
            break;
          default:
            break;
      }
  }
  else if (nFlag==DSpotterSDKHL::GetError)  //错误处理
  {
      if (nID == DSpotterSDKHL::LicenseFailed)
      {
      }
      g_oDSpotterSDKHL.Release();// 释放SDK资源
      while(1);
  }

}


void voiceControl_Init(void){
  DSpotterSDKHL::ShowDebugInfo(true);
  if (g_oDSpotterSDKHL.Init(DSPOTTER_LICENSE, sizeof(DSPOTTER_LICENSE), DSPOTTER_MODEL, VRCallback) != DSpotterSDKHL::Success)
    return;
}

void setup()
{
  voiceControl_Init();
}

void loop()
{
  g_oDSpotterSDKHL.DoVR();
}


5、蓝牙控制部分

#include <ArduinoBLE.h>

void Ble_Init(void){
  pinMode(LED_BUILTIN, OUTPUT); //初始板载LED
  digitalWrite(LED_BUILTIN, LOW);                

  if (!BLE.begin()) {
    Serial.println("蓝牙启动失败!");
    while (1);
  }
  // 蓝牙设备名称
  BLE.setLocalName("Nano 33 BLE Sense V2");
  BLE.setAdvertisedService(ledService);
  ledService.addCharacteristic(bleCharacteristic);
  BLE.addService(ledService);
  // 初始值
  bleCharacteristic.writeValue(0);
  BLE.advertise();
}

void Ble_Get(void){
  BLEDevice central = BLE.central();
  // 连接成功
  if (central) {
    digitalWrite(LED_BUILTIN, HIGH);       //打开板载LED
    while (central.connected()) {
      if (bleCharacteristic.written()) {
        int data = bleCharacteristic.value();
          
        if(data>=0 && data<=100){
          Ble_Data = map(data, 0, 100, 0, 255); // 蓝牙值 0~100 映射到PWM 0~255;
          analogWrite(led,Ble_Data);
        }
      }
    }
	//断开连接时 关闭所有LED
    Serial.print(F("断开连接"));
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(led, LOW); 
  }
}

完整代码

#include <Arduino.h>
#include <DSpotterSDK_MakerHL.h>
#include "CybLicense_1750150084.h"

#include <Arduino_LPS22HB.h>
#include <Arduino_HS300x.h>
#include <ArduinoBLE.h>
#define DSPOTTER_LICENSE g_lpdwLicense

#if defined(TARGET_ARDUINO_NANO33BLE) || defined(TARGET_PORTENTA_H7) || defined(TARGET_NICLA_VISION)
#include "Model_1750150084.h"    
#endif      

#define DSPOTTER_MODEL g_lpdwModel
static DSpotterSDKHL g_oDSpotterSDKHL;

  int led = D2;   //LED引脚
  BLEService ledService("180A"); 
  BLEByteCharacteristic bleCharacteristic("2A57", BLERead | BLEWrite);

// 回调处理函数
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("LED已打开"));
            digitalWrite(led,HIGH);
            break;
          case 10001:
            Serial.println(F("LED已关闭"));
            digitalWrite(led,LOW);
            break;
          case 10002:
             HS300x_Get();
             LPS22HB_Get();
             Ble_Init();
             delay(800);
            break;
          default:
            break;
      }
  }
  else if (nFlag==DSpotterSDKHL::ChangeStage) // 命令 / 指令状态切换
  {
      switch(nID)
      {
          case DSpotterSDKHL::TriggerStage:     //唤醒词
            //To Do
            break;
          case DSpotterSDKHL::CommandStage:     //指令词
            //To Do
            break;
          default:
            break;
      }
  }
  else if (nFlag==DSpotterSDKHL::GetError)  //错误处理
  {
      if (nID == DSpotterSDKHL::LicenseFailed)
      {
      }
      g_oDSpotterSDKHL.Release();// 释放SDK资源
      while(1);
  }

}

void Led_Init(void){
    pinMode(led, OUTPUT);
    digitalWrite(led,LOW);

    pinMode(LED_BUILTIN, OUTPUT); //初始板载LED
    digitalWrite(LED_BUILTIN, LOW);         
}

void voiceControl_Init(void){
  DSpotterSDKHL::ShowDebugInfo(true);
  if (g_oDSpotterSDKHL.Init(DSPOTTER_LICENSE, sizeof(DSPOTTER_LICENSE), DSPOTTER_MODEL, VRCallback) != DSpotterSDKHL::Success)
    return;
}

void HS300x_Init(void){
   	if (!HS300x.begin()) {
    Serial.println("温湿度传感器初始化失败!");
    while (1);
  }
}

void LPS22HB_Init(void){
  if (!BARO.begin()) {
    Serial.println("气压传感器初始化失败!");
    while (1);
  }
}

void Ble_Init(void){
  if (!BLE.begin()) {
    Serial.println("蓝牙启动失败!");
    while (1);
  }

  // 蓝牙设备名称
  BLE.setLocalName("Nano 33 BLE Sense V2");
  BLE.setAdvertisedService(ledService);

  ledService.addCharacteristic(bleCharacteristic);
  BLE.addService(ledService);

  // 初始值
  bleCharacteristic.writeValue(0);
  BLE.advertise();

}

void HS300x_Get(void){
  float temperature = HS300x.readTemperature();	//温度
  float humidity    = HS300x.readHumidity();	//湿度

  Serial.print("温度 = ");
  Serial.print(temperature);
  Serial.println(" °C");
  Serial.print("湿度 = ");
  Serial.print(humidity);
  Serial.println(" %");
}

void LPS22HB_Get(void){
  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");
}

void Ble_Get(void){
  BLEDevice central = BLE.central();
  // 连接成功
  if (central) {
    digitalWrite(LED_BUILTIN, HIGH);       //打开板载LED
    while (central.connected()) {
      if (bleCharacteristic.written()) {

        int data = bleCharacteristic.value();

        if(data>=0 && data<=100){
         int Ble_Data = map(data, 0, 100, 0, 255); // 蓝牙值 0~100 映射到PWM 0~255;
          analogWrite(led,Ble_Data);
        }
      }
    }

	//断开连接时 关闭所有LED
    Serial.print(F("断开连接"));
    digitalWrite(LED_BUILTIN, LOW);
    analogWrite(led,LOW);
  }
}


void setup()
{
  Serial.begin(9600);
  while(!Serial);
  voiceControl_Init();
  Led_Init();
  HS300x_Init();
  LPS22HB_Init();
}

void loop()
{
  g_oDSpotterSDKHL.DoVR();
  Ble_Get();
}


四、演示效果


https://live.csdn.net/v/481749








关键词: Arduino     Nano 33 BLE Sense    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]