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://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.…