Skip to content

필사 모드: Seeed Studio XIAO nRF52840 完全指南 — BLE IoT 项目实战

中文
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
XIAO nRF52840

本文是本系列中小型 BLE 边缘设备篇。XIAO nRF52840 的优势在于,把超小型外形、BLE、低功耗、TinyML 可能性整合在一块板子上,能够快速动手实验。如果你想聚焦于传感器节点和可穿戴设备,可以从这里开始;如果你想处理 PID 控制、自主飞行等更大的系统,可以把Arduino + Raspberry Pi 无人机与控制系统搭建完全指南作为下一篇来读。

引言

XIAO nRF52840 — 尺寸为 21mm × 17.5mm 的超小型开发板,搭载 BLE 5.0、6轴 IMU、麦克风和 256KB RAM。非常适合用于可穿戴设备、IoT 传感器、TinyML 设备。

规格对比

项目XIAO nRF52840XIAO nRF52840 SenseXIAO ESP32C3
处理器ARM Cortex-M4F 64MHzARM Cortex-M4F 64MHzRISC-V 160MHz
RAM256KB256KB400KB
Flash1MB + 2MB QSPI1MB + 2MB QSPI4MB
无线BLE 5.0BLE 5.0Wi-Fi + BLE 5.0
IMU✅ LSM6DS3TR-C
麦克风✅ PDM
电池内置锂电池充电电路内置锂电池充电电路
尺寸21×17.5mm21×17.5mm21×17.5mm
价格~$5.99~$15.99~$4.99

开发环境搭建

Arduino IDE

1. 添加开发板管理器 URL   https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

2. 开发板管理器 → 安装 "Seeed nRF52 mbed-enabled Boards"

3. 选择开发板:"Seeed XIAO BLE - nRF52840"

4. 注意:进入 Bootloader 模式的方法:快速双击 RST 引脚
   → 橙色 LED 呈渐变闪烁 = Bootloader 模式

BLE(Bluetooth Low Energy)编程

BLE 基础概念

BLE 结构:
├── GAP(Generic Access Profile) — 连接管理
│   ├── Peripheral(服务端):提供数据(传感器)
│   └── Central(客户端):请求数据(智能手机)
└── GATT(Generic Attribute Profile) — 数据结构
    ├── Service:功能分组(例:温度服务)
    │   ├── Characteristic:数据点(例:温度值)
    │   │   ├── Value:实际数据
    │   │   ├── Properties:Read/Write/Notify
    │   │   └── Descriptor:元数据
    │   └── Characteristic:...
    └── Service:...

BLE 传感器服务端(Peripheral)

#include <ArduinoBLE.h>

// 自定义服务 + 特性定义
BLEService envService("181A");  // Environmental Sensing

BLEFloatCharacteristic tempChar("2A6E", BLERead | BLENotify);
BLEFloatCharacteristic humChar("2A6F", BLERead | BLENotify);
BLEByteCharacteristic ledChar("2A57", BLERead | BLEWrite);

void setup() {
    Serial.begin(115200);
    BLE.begin();

    // 设备配置
    BLE.setLocalName("XIAO-Sensor");
    BLE.setAdvertisedService(envService);

    // 添加特性
    envService.addCharacteristic(tempChar);
    envService.addCharacteristic(humChar);
    envService.addCharacteristic(ledChar);
    BLE.addService(envService);

    // 初始值
    tempChar.writeValue(0.0f);
    humChar.writeValue(0.0f);
    ledChar.writeValue(0);

    // LED 控制回调
    ledChar.setEventHandler(BLEWritten, onLedWrite);

    BLE.advertise();
    Serial.println("BLE Sensor Ready!");
}

void onLedWrite(BLEDevice central, BLECharacteristic characteristic) {
    byte value = ledChar.value();
    digitalWrite(LED_BUILTIN, value ? LOW : HIGH);
    Serial.print("LED: "); Serial.println(value ? "ON" : "OFF");
}

void loop() {
    BLEDevice central = BLE.central();

    if (central) {
        Serial.print("Connected: "); Serial.println(central.address());

        while (central.connected()) {
            // 读取传感器(示例:模拟量)
            float temp = analogRead(A0) * 0.1;  // 实际项目中可使用 DHT22 等传感器
            float hum = analogRead(A1) * 0.1;

            tempChar.writeValue(temp);
            humChar.writeValue(hum);

            delay(1000);
        }
        Serial.println("Disconnected");
    }
}

Python BLE 客户端(Central)

import asyncio
from bleak import BleakClient, BleakScanner
import struct

DEVICE_NAME = "XIAO-Sensor"
TEMP_UUID = "00002a6e-0000-1000-8000-00805f9b34fb"
HUM_UUID = "00002a6f-0000-1000-8000-00805f9b34fb"
LED_UUID = "00002a57-0000-1000-8000-00805f9b34fb"

async def main():
    # 扫描
    print("Scanning...")
    device = await BleakScanner.find_device_by_name(DEVICE_NAME)
    if not device:
        print("Device not found!")
        return

    # 连接
    async with BleakClient(device) as client:
        print(f"Connected: {device.address}")

        # 订阅 Notify
        def on_temp(sender, data):
            temp = struct.unpack('<f', data)[0]
            print(f"  Temperature: {temp:.1f}°C")

        await client.start_notify(TEMP_UUID, on_temp)

        # 打开 LED
        await client.write_gatt_char(LED_UUID, bytes([1]))

        await asyncio.sleep(30)  # 监控 30 秒

asyncio.run(main())

低功耗设计

#include <nrf_power.h>

// 深度睡眠模式(System OFF — 0.5μA!)
void enterDeepSleep(int wakeupPin) {
    // 配置唤醒引脚
    nrf_gpio_cfg_sense_input(
        digitalPinToInterrupt(wakeupPin),
        NRF_GPIO_PIN_PULLUP,
        NRF_GPIO_PIN_SENSE_LOW
    );

    // System OFF
    NRF_POWER->SYSTEMOFF = 1;
    // 程序在此停止 — 唤醒时重新启动
}

// 轻度睡眠(System ON + WFE — 1.5μA)
void lightSleep(uint32_t ms) {
    delay(ms);  // 基于 WFE,保持 BLE 连接
}

// 电池续航计算:
// 110mAh LiPo,平均功耗 50μA(睡眠中周期性 BLE 广播)
// 续航 = 110mAh / 0.05mA = 2,200 小时 = 约 91 天!

传感器网状网络

XIAO #1(客厅)          XIAO #2(卧室)          XIAO #3(厨房)
  温度/湿度                光照度                   气体传感器
    │                      │                      │
    └──── BLE ─────────────┴──── BLE ─────────────┘
                    Raspberry Pi(网关)
                    MQTTHome Assistant
                      仪表盘 / 通知

TinyML(XIAO Sense)

// 使用内置 IMU 进行手势识别!
#include <LSM6DS3.h>
#include <gesture_model.h>  // TensorFlow Lite 模型

LSM6DS3 imu(I2C_MODE, 0x6A);
tflite::MicroInterpreter* interpreter;

void loop() {
    float ax, ay, az, gx, gy, gz;
    imu.readAcceleration(ax, ay, az);
    imu.readGyroscope(gx, gy, gz);

    // 模型输入
    input->data.f[0] = ax; input->data.f[1] = ay; input->data.f[2] = az;
    input->data.f[3] = gx; input->data.f[4] = gy; input->data.f[5] = gz;

    interpreter->Invoke();

    // 手势判定
    int gesture = output->data.f[0] > 0.8 ? WAVE :
                  output->data.f[1] > 0.8 ? PUNCH : IDLE;
    Serial.println(gestureName[gesture]);
}

本嵌入式实战系列的下一篇推荐阅读


📝 小测验 — XIAO nRF52840 与 BLE IoT(点击查看!)

Q1. BLE 中 Peripheral 与 Central 的区别是什么? ||Peripheral(服务端):提供数据并进行广播的一方(传感器)。Central(客户端):扫描并连接、请求数据的一方(智能手机)||

Q2. GATT 中 Service、Characteristic、Descriptor 之间的关系是什么? ||Service:功能分组(温度服务)。Characteristic:实际的数据点(温度值)。Descriptor:元数据(单位、说明)。层级结构为 Service > Characteristic > Descriptor||

Q3. XIAO nRF52840 的 System OFF 模式电流是多少? ||0.5μA。使用 110mAh 电池约可运行 91 天。唤醒时会重新启动(RAM 内容丢失)||

Q4. BLE Notify 与 Read 的区别是什么? ||Read:仅在 Central 发起请求时才发送数值(轮询)。Notify:数值发生变化时由 Peripheral 自动推送(事件驱动)。Notify 在功耗与延迟方面更高效||

현재 단락 (1/151)

**XIAO nRF52840** — 尺寸为 21mm × 17.5mm 的超小型开发板,搭载 BLE 5.0、6轴 IMU、麦克风和 256KB RAM。非常适合用于可穿戴设备、IoT 传感器、T...

작성 글자: 0원문 글자: 4,957작성 단락: 0/151