文档
Arduino Nano 33 BLE (nRF52840) 代码例程
例程 1:BLE 外设模式 — 发送传感器数据
// 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 姿态检测(加速度 + 陀螺仪 + 磁力计)
// 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 控制
// 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 读取
// 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:超低功耗系统关闭
// 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。