Arduino Nano 33 BLE

元器件
开发板
库存 95

介绍

Arduino Nano 33 BLE,基于nRF52840主控(Arm Cortex-M4F 64MHz),内置蓝牙5.0 BLE,1MB Flash,256KB RAM,14路数字IO,8路ADC(12位),6路PWM,内置9轴IMU(LSM9DS1),支持Arduino IoT Cloud。尺寸与经典Nano兼容(18×45mm),3.3V逻辑。适合低功耗蓝牙可穿戴设备、物联网传感节点

规格参数

参数
I2C1路
PWM6路
SPI1路
SRAM256KB
Flash1MB
串口1路硬UART
内核Arm Cortex-M4F 64MHz
尺寸18mm×45mm
无线蓝牙5.0 BLE/Bluetooth Mesh
重量约5g
数字IO14路(全部可中断)
USB接口Micro-USB(Native USB)
主控芯片nRF52840 (Nordic)
工作电压3.3V(逻辑)
模拟输入8路(12位ADC)
输入电压5V(USB)/4.5-21V(VIN)
内置传感器LSM9DS1(9轴IMU: 加速度+陀螺仪+磁力计)

代码例程

Arduino Nano 33 BLE — 代码例程.md
# Arduino Nano 33 BLE (nRF52840) 代码例程

## 例程 1:BLE 外设模式 — 发送传感器数据

```cpp
// Nano 33 BLE - BLE UART 外设,发送温度+IMU数据
#include <ArduinoBLE.h>
#include <Arduino_LSM9DS1.h>

// BLE 服务和特征值
BLEService sensorService("180A");  // 自定义服务UUID
BLEFloatCharacteristic tempChar("2A6E", BLERead | BLENotify);
BLEFloatCharacteristic accelXChar("2A01", BLERead | BLENotify);

void setup() {
    Serial.begin(115200);
    while (!Serial);
    
    // 初始化IMU
    if (!IMU.begin()) {
        Serial.println("IMU init failed!");
        while (1);
    }
    
    // 初始化BLE
    if (!BLE.begin()) {
        Serial.println("BLE init failed!");
        while (1);
    }
    
    // 配置BLE
    BLE.setLocalName("Nano33BLE-Sensor");
    BLE.setAdvertisedService(sensorService);
    sensorService.addCharacteristic(tempChar);
    sensorService.addCharacteristic(accelXChar);
    BLE.addService(sensorService);
    
    // 设置初始值
    tempChar.writeValue(0.0f);
    accelXChar.writeValue(0.0f);
    
    // 开始广播
    BLE.advertise();
    Serial.println("BLE Sensor ready. Connect with nRF Connect or LightBlue.");
}

void loop() {
    BLEDevice central = BLE.central();  // 等待连接
    
    if (central) {
        Serial.print("Connected: ");
        Serial.println(central.address());
        
        while (central.connected()) {
            // 读取IMU
            float ax, ay, az, gx, gy, gz;
            if (IMU.accelerationAvailable()) {
                IMU.readAcceleration(ax, ay, az);
                accelXChar.writeValue(ax);
            }
            
            // 模拟温度(nRF52840 内部温度传感器)
            float temp = analogRead(A0) * (3.3f / 4095.0f) * 100.0f;
            tempChar.writeValue(temp);
            
            Serial.print("AccelX: "); Serial.print(ax);
            Serial.print("  Temp: "); Serial.println(temp);
            delay(100);
        }
        
        Serial.println("Disconnected.");
    }
}
```

---

## 例程 2:IMU 姿态检测(加速度 + 陀螺仪 + 磁力计)

```cpp
// Nano 33 BLE - 9轴IMU 完整数据读取
#include <Arduino_LSM9DS1.h>

void setup() {
    Serial.begin(115200);
    while (!Serial);
    
    if (!IMU.begin()) {
        Serial.println("Failed to initialize IMU!");
        while (1);
    }
    
    Serial.println("IMU initialized. Reading 9-axis data...");
    Serial.println("Accel(m/s²) | Gyro(dps) | Mag(uT)");
}

void loop() {
    float ax, ay, az, gx, gy, gz, mx, my, mz;
    
    if (IMU.accelerationAvailable() &&
        IMU.gyroscopeAvailable() &&
        IMU.magneticFieldAvailable()) {
        
        IMU.readAcceleration(ax, ay, az);
        IMU.readGyroscope(gx, gy, gz);
        IMU.readMagneticField(mx, my, mz);
        
        // 计算姿态角(简易互补滤波)
        float pitch = atan2(ay, az) * 180.0f / PI;
        float roll  = atan2(-ax, sqrt(ay*ay + az*az)) * 180.0f / PI;
        
        Serial.print("Pitch:"); Serial.print(pitch, 1); Serial.print("° ");
        Serial.print("Roll:"); Serial.print(roll, 1); Serial.print("° ");
        Serial.print("| GyroX:"); Serial.print(gx, 1); Serial.print("  ");
        Serial.print("| MagHeading:"); 
        float heading = atan2(my, mx) * 180.0f / PI;
        if (heading < 0) heading += 360;
        Serial.print(heading, 1); Serial.println("°");
    }
    
    delay(50);
}
```

---

## 例程 3:RGB LED 控制

```cpp
// Nano 33 BLE - 板载 RGB LED 控制
// L_RED=D22, L_GREEN=D23, L_BLUE=D24

const int LED_R = 22;  // 红色通道
const int LED_G = 23;  // 绿色通道
const int LED_B = 24;  // 蓝色通道

void setup() {
    pinMode(LED_R, OUTPUT);
    pinMode(LED_G, OUTPUT);
    pinMode(LED_B, OUTPUT);
    
    // 初始关灯
    digitalWrite(LED_R, HIGH);  // 共阳极,HIGH=灭
    digitalWrite(LED_G, HIGH);
    digitalWrite(LED_B, HIGH);
}

void loop() {
    // 彩虹渐变
    for (int hue = 0; hue < 360; hue++) {
        setHue(hue);
        delay(10);
    }
}

void setHue(int hue) {
    // HSV → RGB 转换
    float h = hue / 60.0f;
    float x = 1.0f - abs(fmod(h, 2.0f) - 1.0f);
    float r, g, b;
    
    if      (h < 1) { r=1; g=x; b=0; }
    else if (h < 2) { r=x; g=1; b=0; }
    else if (h < 3) { r=0; g=1; b=x; }
    else if (h < 4) { r=0; g=x; b=1; }
    else if (h < 5) { r=x; g=0; b=1; }
    else            { r=1; g=0; b=x; }
    
    // 共阳极:PWM 值取反(255-值)
    analogWrite(LED_R, 255 - (int)(r * 255));
    analogWrite(LED_G, 255 - (int)(g * 255));
    analogWrite(LED_B, 255 - (int)(b * 255));
}
```

---

## 例程 4:12位高精度 ADC 读取

```cpp
// Nano 33 BLE - 12位 ADC(0-4095 vs 经典Nano 0-1023)
// 注意:输入电压范围 0-3.3V!

void setup() {
    Serial.begin(115200);
    while (!Serial);
    analogReadResolution(12);  // 设置12位分辨率
}

void loop() {
    int raw = analogRead(A0);
    float voltage = raw * (3.3f / 4095.0f);
    
    Serial.print("Raw: "); Serial.print(raw);
    Serial.print("  |  Voltage: "); Serial.print(voltage, 4);
    Serial.println("V");
    
    delay(200);
}
```

---

## 例程 5:超低功耗系统关闭

```cpp
// Nano 33 BLE - 系统关闭模式(功耗 <1μA)
// 唤醒方式:RST 按钮或 NFC 天线引脚

void setup() {
    Serial.begin(115200);
    while (!Serial);
    
    pinMode(LED_BUILTIN, OUTPUT);
    
    // 闪烁三次表示即将休眠
    for (int i = 0; i < 3; i++) {
        digitalWrite(LED_BUILTIN, HIGH);
        delay(200);
        digitalWrite(LED_BUILTIN, LOW);
        delay(200);
    }
    
    Serial.println("Entering SYSTEM OFF mode...");
    Serial.println("Wake via RST button only.");
    Serial.flush();
    delay(100);
    
    // 进入系统关闭
    NRF_POWER->SYSTEMOFF = 1;
    
    // 以下代码永远不会执行(除非RST复位)
}

void loop() {
    // 永远不会到达
}
```

> **编译提示**:Arduino IDE → `Tools → Board → Arduino Nano 33 BLE`,需安装 `Arduino Mbed OS Nano Boards`。

参考资料

暂无参考文献