The Arduino Nano 33 BLE is a game-changer for makers venturing into wearable electronics. Packed with Bluetooth 5, a 9-axis IMU (LSM9DS1), and an ARM Cortex-M4 running at 64 MHz, this tiny board enables sophisticated arduino nano 33 ble projects that once required much larger hardware. Whether you are building a smartwatch prototype, a gesture-controlled device, or a body-area sensor network, the Nano 33 BLE gives you everything you need on a board barely larger than a postage stamp.
Why Choose the Arduino Nano 33 BLE for Wearables?
The Arduino Nano 33 BLE (and its sibling, the Nano 33 BLE Sense) stands out from other Arduino boards for several reasons that matter specifically to wearable designers:
- Bluetooth 5 (BLE): The onboard u-blox NINA-B306 module supports BLE with 2 Mbps data rate, improved range, and mesh networking capability.
- 9-Axis IMU: The LSM9DS1 combines a 3-axis accelerometer, 3-axis gyroscope, and 3-axis magnetometer — perfect for motion tracking.
- 3.3 V logic: Lower power consumption and compatibility with modern sensors and displays.
- Compact footprint: At just 45 × 18 mm, it fits inside wristbands, chest straps, and helmet liners.
- ArduinoBLE library: A well-maintained, beginner-friendly library for creating GATT services and characteristics.
The Nano 33 BLE Sense adds a microphone, colour/proximity sensor, temperature/humidity sensor, barometer, and gesture sensor — making it a complete environmental sensing platform on one tiny board.
Getting Started: Setup and IDE Configuration
Before diving into projects, make sure your development environment is ready.
Step 1: Install the Board Package
Open Arduino IDE → Tools → Board → Boards Manager. Search for Arduino Mbed OS Nano Boards and install it. This package covers the Nano 33 BLE and Nano 33 BLE Sense.
Step 2: Install Required Libraries
From Sketch → Include Library → Manage Libraries, install:
- ArduinoBLE — Bluetooth Low Energy stack
- Arduino_LSM9DS1 — IMU driver
- Arduino_HTS221 — humidity/temperature (Sense only)
- Arduino_APDS9960 — gesture/colour (Sense only)
Step 3: Select the Correct Port
Connect the board via USB-C. On Windows, you may need to install the mbed USB driver. Select the correct COM port and board from the Tools menu. Upload the built-in BLE_LED example to verify everything works before starting your project.
Project 1: Gesture-Controlled BLE Remote
This project uses the IMU to detect wrist gestures and transmits them via BLE to a PC, smartphone, or another microcontroller. It is a popular entry point for arduino nano 33 ble projects because it requires no external hardware beyond the board itself.
How It Works
The accelerometer reads wrist orientation 100 times per second. A simple threshold algorithm classifies the motion into one of five gestures: tilt left, tilt right, tilt forward, tilt backward, and shake. Each gesture is mapped to a BLE characteristic value that a receiving device reads and acts upon.
Sketch Outline
#include <ArduinoBLE.h>
#include <Arduino_LSM9DS1.h>
BLEService gestureService("180D");
BLEByteCharacteristic gestureChar("2A37", BLERead | BLENotify);
void setup() {
BLE.begin();
IMU.begin();
BLE.setLocalName("GestureRemote");
BLE.setAdvertisedService(gestureService);
gestureService.addCharacteristic(gestureChar);
BLE.addService(gestureService);
BLE.advertise();
}
void loop() {
BLEDevice central = BLE.central();
if (central) {
float ax, ay, az;
IMU.readAcceleration(ax, ay, az);
byte gesture = classifyGesture(ax, ay, az);
gestureChar.writeValue(gesture);
}
}
On the smartphone side, use the nRF Connect app (Android/iOS) to connect and read the characteristic values in real time.
Project 2: BLE Heart Rate & Motion Health Monitor
Combine an external MAX30102 pulse oximeter module with the Nano 33 BLE’s motion sensing to create a wearable health band. The board reads SpO2 and heart rate from the MAX30102 over I2C, combines it with step count data from the IMU, and broadcasts all values over BLE using the standard Heart Rate Service (UUID 0x180D).
Hardware Connections
- MAX30102 SDA → A4
- MAX30102 SCL → A5
- MAX30102 VCC → 3.3 V
- MAX30102 GND → GND
The MAX30102 library (SparkFun_Bio_Sensor_Hub) handles the complex signal processing. Your sketch only needs to call bioHub.readBpm() and pass the result to a BLE characteristic.
BLE GATT Profile
Use UUID 0x180D (Heart Rate Service) with characteristic 0x2A37 (Heart Rate Measurement). This makes the Nano 33 BLE compatible with standard fitness apps on Android and iOS without any custom app development.
Project 3: Wireless Pedometer / Step Counter
A pedometer is one of the most practical wearable applications. The Nano 33 BLE’s accelerometer detects the characteristic vertical acceleration spike of each footstep. Steps are counted using a peak-detection algorithm and transmitted via BLE to a companion app.
Algorithm
Read the Z-axis acceleration at 50 Hz. Apply a simple moving average to remove noise, then detect peaks above a threshold (typically 1.2 g). A minimum inter-peak interval of 250 ms prevents double-counting. The step count is stored in a BLE characteristic and updated every second.
// Simplified peak detection
if (az > THRESHOLD && (millis() - lastStep) > 250) {
stepCount++;
lastStep = millis();
stepChar.writeValue(stepCount);
}
Battery Life Optimisation
Enable BLE connection interval of 1000 ms instead of the default 100 ms. Put the IMU into low-power mode between readings. These two changes alone can extend a 100 mAh LiPo battery from 8 hours to over 30 hours.
Project 4: IMU Data Logger for Sports Analysis
Athletes and coaches increasingly rely on motion data to improve technique. This project streams 9-axis IMU data at 100 Hz over BLE to a laptop running a Python script that saves it to CSV for post-session analysis.
Arduino Side
Create a BLE service with three characteristics: acceleration (ax, ay, az as float array), gyroscope (gx, gy, gz), and magnetometer (mx, my, mz). Pack three floats into a 12-byte array for each characteristic to minimise BLE overhead.
Python Receiver
Use the bleak library for cross-platform BLE access in Python:
import asyncio
from bleak import BleakClient
import struct, csv
async def main():
async with BleakClient(DEVICE_ADDRESS) as client:
def callback(handle, data):
ax, ay, az = struct.unpack('fff', data)
writer.writerow([ax, ay, az])
await client.start_notify(ACCEL_UUID, callback)
await asyncio.sleep(60) # Record for 60 seconds
asyncio.run(main())
The resulting CSV can be imported into MATLAB, Python (pandas/matplotlib), or Excel for visualisation and biomechanical analysis.
Project 5: TinyML on the Nano 33 BLE Sense
TinyML (Tiny Machine Learning) brings neural network inference directly onto microcontrollers. The Nano 33 BLE Sense, with its ARM Cortex-M4 and onboard sensors, is the reference platform for Arduino’s ML tutorials.
Gesture Recognition with TensorFlow Lite
Record 100 samples of each gesture (punch, flex, etc.) using the IMU. Train a small neural network using Google Colab (Arduino’s free tutorial provides the notebook). Export the model as a .h file and include it in your sketch. The TensorFlow Lite for Microcontrollers library runs inference locally — no cloud connection needed.
Wake-Word Detection
The Nano 33 BLE Sense’s built-in microphone enables offline wake-word detection using Edge Impulse. Record positive/negative audio samples, train in Edge Impulse Studio, download the Arduino library, and deploy. The board can recognise words like “on” and “off” without any internet connection — ideal for privacy-sensitive wearables.
Power and Battery Tips for Wearable Builds
Power management is the Achilles’ heel of wearable electronics. The Nano 33 BLE draws about 7–12 mA when actively transmitting. Here is how to bring that down:
- Use BLE advertising intervals wisely: Increase advertising interval from 100 ms to 500 ms when not connected. This cuts radio duty cycle by 5×.
- Sleep the IMU: Call
IMU.end()between readings when you only need updates every second, then reinitialise. - Disable the RGB LED: The onboard LED draws ~8 mA. Call
digitalWrite(LED_PWR, LOW)to cut the power LED. - Choose the right LiPo: For a wristband, a 300 mAh cell at 4 mm thickness gives 20–30 hours of life with the optimisations above.
- Consider a DC-DC boost converter: As the LiPo discharges below 3.3 V, a boost converter maintains a stable supply for the board.
Frequently Asked Questions
Does the Arduino Nano 33 BLE support Bluetooth Classic (not BLE)?
No. The NINA-B306 module on the Nano 33 BLE supports only Bluetooth Low Energy (BLE). It cannot connect to devices that require classic Bluetooth (BR/EDR), such as traditional Bluetooth speakers or older headsets.
What is the difference between Arduino Nano 33 BLE and Nano 33 BLE Sense?
The Sense variant adds six additional sensors: a microphone (MP34DT05), proximity/gesture/colour sensor (APDS9960), pressure/temperature sensor (LPS22HB), humidity/temperature sensor (HTS221), IMU (MPU-6050 on newer revision), and a low-power microphone. The core processor and BLE module are identical.
Can I power the Nano 33 BLE from a single AA battery?
Not directly. A single AA battery (1.5 V) is below the minimum operating voltage. You need at least 3.3 V–5 V at the VIN pin. Use two AA batteries in series (3 V) with a boost converter to 3.3 V, or use a single LiPo cell (3.7 V nominal) which is ideal for wearable projects.
Is the Arduino Nano 33 BLE compatible with 5 V shields?
No. All I/O pins operate at 3.3 V. Connecting 5 V signals directly to the pins will damage the nRF52840 processor. Use a level shifter if you need to interface with 5 V devices.
How do I update the NINA-B306 firmware?
Open Arduino IDE and run File → Examples → WiFiNINA → CheckFirmwareVersion. If outdated, use the FirmwareUpdater sketch combined with the Arduino Firmware Uploader tool from the Arduino website. Always update firmware before starting a new project to ensure BLE stability.
Ready to start your first wearable project? Explore our full range of Arduino boards and accessories at Zbotic — including the Nano 33 BLE, sensors, and everything you need to build your next wearable innovation. Fast delivery across India.
Add comment