一、硬件介紹
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引腳也不會輸出。
二、項目功能實現思想
【室內空氣質量語音檢測藍牙調光臺燈】
實現效果:
通過板載麥克風識別相關語音指令,可獲取當前室內的溫濕度、氣壓等信息輸出到串口上,以及聲控打開 / 關閉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