一、硬件介绍

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://www.pswp.cn/bicheng/95887.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95887.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95887.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【问题解决】mac笔记本遇到鼠标无法点击键盘可响应处理办法?(Command+Option+P+R)

背景 如题。鼠标无法点击&#xff0c;但可以移动。触控板能够波动&#xff0c;鼠标翻页能够work&#xff0c;但是点击后无法响应。 根因 电脑缓存问题 解决办法 重置PRAM&#xff1a; 确保电脑关机状态&#xff08;可以先sudo shutdown -t now)&#xff08;一定要确保&#xff…

23ai数据库通过SQLcl生成AWR报告

‌1. 查看现有快照SQL> awr list snap;SNAP_ID DBID BEGIN_INTERVAL_TIME END_INTERVAL_TIME FLUSH_LEVEL __________ _____________ __________________________________ __________________________________ ______________793 …

基于Django+Vue3+YOLO的智能气象检测系统

基于DjangoVue3YOLO的智能气象检测系统 项目简介 本项目是一个集成了人工智能深度学习技术的现代化气象检测系统&#xff0c;采用前后端分离架构&#xff0c;结合YOLO目标检测算法&#xff0c;实现了对气象现象的智能识别与分析。系统提供了完整的用户管理、实时检测、历史记录…

(4)什么时候引入Seata‘‘

非常好的问题&#xff01;这两个问题正是技术选型时需要重点考虑的。什么时候需要引入 Seata&#xff1f;需要引入 Seata 的场景&#xff1a;跨数据库的分布式事务// 订单服务&#xff08;MySQL&#xff09; 库存服务&#xff08;PostgreSQL&#xff09; 账户服务&#xff08…

苹果内部 AI聊天机器人“Asa”曝光,为零售员工打造专属A

MacRumors网站的亚伦佩里斯&#xff08;Aaron Perris&#xff09;透露&#xff0c;苹果正在内部测试一款名为“Asa”的AI聊天机器人。这款工具旨在赋能Apple Store零售员工&#xff0c;帮助他们快速掌握iPhone等产品的特色和差异化使用场景&#xff0c;从而提升与顾客互动时的解…

MySQL常见报错分析及解决方案总结(12)---slave_net_timeout

关于超时报错&#xff0c;一共有五种超时参数&#xff0c;详见&#xff1a;MySQL常见报错分析及解决方案总结(7)---超时参数connect_timeout、interactive_timeout/wait_timeout、lock_wait_timeout、net等-CSDN博客 以下是当前报错的排查方法和解决方案&#xff1a; 在 Wind…

云计算学习笔记——日志、SELinux、FTP、systemd篇

《云计算学习日记Day15》—— 从零开始的云计算之旅 今天是系统学习云计算的第十五天&#xff0c;记录了关于我的云计算学习&#xff0c;后续将每日更新我的笔记。欢迎大家一起来学习&#xff0c;如果内容有遗漏和错误&#xff0c;还请大家多多指正和包涵&#xff0c;谢谢大家 …

3Ds Max Gamma值完全指南:问题识别与正确设置解析

当渲染图像与本地图片相比亮度偏黑或偏白时&#xff0c;很可能是因为Gamma输入输出设置不一致。需要注意的是&#xff0c;Gamma问题通常表现为整体亮度偏差&#xff0c;而非大面积曝光或全黑状况。Gamma设置教程问题一&#xff1a;Gamma校正未开启如果使用VR帧缓冲窗口渲染但未…

用 Rust + Actix-Web 打造“Hello, WebSocket!”——从握手到回声,只需 50 行代码

用 Rust Actix-Web 打造“Hello, WebSocket!”——从握手到回声&#xff0c;只需 50 行代码 一、为什么选择 Rust 写 WebSocket&#xff1f; 零成本抽象&#xff1a;编译期确定生命周期&#xff0c;无 GC 抖动&#xff0c;延迟低至微秒级actix-web&#xff1a;Tokio 生态最成熟…

基于Cursor的 STM32工程搭建 (编译、下载、仿真)

嵌入式学习交流Q群 679912988 简介 本工程使用GCC编译器、MinGW、CMake构建工具和OpenOCD调试工具。实现了替代KEIL, IAR等在某些情况下不方便使用的情况。实现了编译、调试、下载、烧录一体。搭配Cursor的Tab补全功能&#xff0c;编码效率大大提升。 工具下载及安装 Cursor…

数据量太大处理不了?Hadoop+Spark轻松解决海洋气象大数据分析难题

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

Day34 UDP套接字编程 可靠文件传输与实时双向聊天系统

day34 UDP套接字编程 可靠文件传输与实时双向聊天系统 UDP文件传输 实现客户端向服务器传输文件&#xff08;如图片&#xff09;的功能&#xff0c;确保传输后文件内容完全一致且可正常打开。传输过程采用简单的确认机制防止数据包丢失&#xff0c;传输完成后双方程序自动退出。…

策略模式-不同的鸭子的案例

介绍了策略模式在C#中的应用&#xff0c;以一个鸭子的例子来说明。首先定义了鸭子类以及鸭子的行为&#xff08;方法&#xff09;&#xff0c;然后通过继承和实现接口的方式来定义不同种类的鸭子的特性。介绍了策略模式的概念&#xff0c;将相同的算法封装在不同的类中&#xf…

C++语言编程规范-初始化和类型转换

01 C语言编程规范-常量 02 初始化和类型转换 声明、定义与初始化 03 禁止用 memcpy、memset 初始化非 POD 对象 说明&#xff1a;POD 全称是“Plain Old Data”&#xff0c;是 C 98 标准(ISO/IEC 14882, first edition, 1998-09-01)中引入的一个概念&#xff0c; PO…

从零构建一款开源在线客服系统:我的Go语言实战之旅

了解更多&#xff0c;搜索 "程序员老狼"用代码连接世界&#xff0c;让沟通无界限缘起&#xff1a;为什么选择开发客服系统&#xff1f;在数字化浪潮席卷全球的今天&#xff0c;企业与客户之间的沟通方式正在发生深刻变革。传统的电话和邮件支持已无法满足即时互动的需…

unsloth笔记:基本介绍

更快的速度、更省的内存训练、运行、评估大模型 1 支持的模型 All Our Models | Unsloth Documentation 1.1 Dynamic GGUF/instruct 4-bit llama.cpp使用的新模型格式&#xff0c;专为高效、本地推理设计注&#xff1a;GGUF无法微调 只保留推理所需的内容&#xff0c;如量化…

博众测控 | 一文看懂菊水电源产品在半导体测试中的应用

01 半导体在各行业上的应用半导体作为现代工业体系的“核心神经”&#xff0c;其性能参数与应用场景深度绑定&#xff0c;不同行业因核心设备的功能需求差异&#xff0c;对半导体的电流、电压承载能力及类型选择有着明确且严格的要求&#xff0c;具体应用细节如下&#xff1a;1…

【STM32】贪吃蛇 [阶段 8] 嵌入式游戏引擎通用框架设计

这篇博客是 承接&#xff1a;【项目思维】贪吃蛇&#xff08;嵌入式进阶方向&#xff09;中 嵌入式游戏引擎雏形&#xff08;终极进阶&#xff09;&#xff0c; 是我们此前从 “写一个小游戏”提升到“构建可复用游戏框架” 的飞跃阶段。我们以“贪吃蛇游戏”为例&#xff0c;抽…

Vue图标按钮好用的样式

图标按钮示例一 <template><div class"icon-button-group"><button class"icon-btn icon-btn--default"><i class"el-icon-moon"></i></button><button class"icon-btn icon-btn--primary"&g…

Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装

文章目录前言一、Web 概念1.1 Web 的基本概念1.1.1 Web的特点1.2 B/S 架构模型1.3 Web 请求与响应过程&#xff08;重点&#xff09;1.4 静态资源与动态资源1.5 Web 的发展阶段1.6 案例&#xff1a;搭建最小 Web 服务1.6.1 目标1.6.2 搭建步骤1.7 小结二、HTTP 与 HTTPS 协议2.…