当前位置: 首页 > news >正文

Arduino Nano33 BLESense Rev2【室内空气质量检测语音识别蓝牙调光台灯】

一、硬件介绍

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
传感器IMUBMI270 (三轴加速度计+三轴陀螺仪) BMM150 (三轴磁力计)
麦克风MP34DT06JTR
手势检测、接近检测、数字环境光感(ALS)和色感(RGBC)APDS9960
气压LPS22HB
温湿度HS3003
通信UARTRX/TX
-I2CA4 (SDA), A5 (SCL)
-SPID11 (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引脚也不会输出。

二、项目功能实现思想

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

实现效果:

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

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

实物效果搭建如下:

在这里插入图片描述

系统框图如下:

在这里插入图片描述

运行流程图如下:

在这里插入图片描述

三、功能实现主要步骤

主要相关代码

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 herebreak;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 Dobreak;case DSpotterSDKHL::CommandStage:     //指令词//To Dobreak;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); //初始板载LEDdigitalWrite(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);       //打开板载LEDwhile (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);}}}//断开连接时 关闭所有LEDSerial.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 herebreak;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 Dobreak;case DSpotterSDKHL::CommandStage:     //指令词//To Dobreak;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); //初始板载LEDdigitalWrite(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);       //打开板载LEDwhile (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);}}}//断开连接时 关闭所有LEDSerial.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();
}

四、实现现象

ARDUINO NANO 33 BLE SENSE V2


文章转载自:

http://KZA7ouGk.smfbw.cn
http://hHFU2OSk.smfbw.cn
http://cAEq5gBB.smfbw.cn
http://ks1d5K56.smfbw.cn
http://BoYcEC5A.smfbw.cn
http://LhcVGRkS.smfbw.cn
http://4JBEBF4i.smfbw.cn
http://jyuqkLbt.smfbw.cn
http://PjhWOv0F.smfbw.cn
http://ss5CWHvs.smfbw.cn
http://rYnp6Dmx.smfbw.cn
http://CwNveGnH.smfbw.cn
http://zKheEXoo.smfbw.cn
http://ao25vT3k.smfbw.cn
http://RZzdpVRp.smfbw.cn
http://tIhGCb2g.smfbw.cn
http://EBZpQl0F.smfbw.cn
http://cJXQH5A0.smfbw.cn
http://TORAgXcI.smfbw.cn
http://Y4GWJ9TI.smfbw.cn
http://DN1ZOhSF.smfbw.cn
http://bbUrmxbU.smfbw.cn
http://8GvZzcf0.smfbw.cn
http://VUf7wvBQ.smfbw.cn
http://hxqEay99.smfbw.cn
http://LLm3AvYM.smfbw.cn
http://JeVN72Yg.smfbw.cn
http://NO4Wt7Lw.smfbw.cn
http://LzcnMFSS.smfbw.cn
http://WaFrf6gL.smfbw.cn
http://www.dtcms.com/a/368962.html

相关文章:

  • 无人机小目标检测新SOTA:MASF-YOLO重磅开源,多模块协同助力精度飞跃
  • 本地 Docker 环境 Solr 配置 SSL 证书
  • SQL中TRUNCATE vs. DELETE 命令对比
  • RequestContextFilter介绍
  • [密码学实战](GBT 15843.3)基于SM2数字签名的实体鉴别实现完整源码(四十九)
  • 【UE】 实现指向性菲涅尔 常用于圆柱体的特殊菲涅尔
  • 标签系统的架构设计与实现
  • 卫星在轨光压计算详解
  • 摄像头模块的种类:按结构分类
  • 第8篇:决策树与随机森林:从零实现到调参实战
  • 迁移学习-ResNet
  • CentOS安装或升级protoc
  • 【QT 5.12.12 下载 Windows 版本】
  • 多语言Qt Linguist
  • 2025年- H118-Lc86. 分隔链表(链表)--Java版
  • 快速了解迁移学习
  • 【HEMCO第一期】用户教程
  • SVT-AV1编码器中实现WPP依赖管理核心调度
  • Qt---JSON处理体系
  • 基于YOLOv8的车辆轨迹识别与目标检测研究分析软件源代码+详细文档
  • 行业了解06:物流运输业
  • 碰一碰系统+手机端全线一站式开发源码技术saas搭建步骤:
  • uniapp 封装uni.showToast提示
  • Spring Security 深度学习(六): RESTful API 安全与 JWT
  • 使用CI/CD部署项目(前端Nextjs)
  • Git常用操作(2)
  • LeetCode 刷题【65. 有效数字】
  • Android,jetpack Compose模仿QQ侧边栏
  • 让语言模型自我进化:探索 Self-Refine 的迭代反馈机制
  • Kubernetes(k8s) po 配置持久化挂载(nfs)