The Arduino Nano 33 BLE Sense Rev2 is the sensor-rich version of Arduino’s nRF52840 Nano platform.
It keeps the same compact 45 × 18 mm format and 64 MHz Arm Cortex-M4F processor as the Nano 33 BLE Rev2, but adds an unusually complete onboard sensor suite:
- BMI270 3-axis accelerometer and 3-axis gyroscope;
- BMM150 3-axis magnetometer;
- HS3003 temperature and humidity sensor;
- LPS22HB barometric pressure sensor;
- APDS9960 colour, ambient-light, proximity and gesture sensor;
- MP34DT06J digital MEMS microphone.
That makes the board particularly suitable for:
- TinyML;
- gesture recognition;
- voice and sound classification;
- environment monitoring;
- wearables;
- motion detection;
- Bluetooth Low Energy sensor nodes.
Arduino now marks the original Nano 33 BLE Sense as End of Life. This guide therefore focuses on the current Rev2 hardware.
The most important compatibility warning is that Rev2 changed several sensors. Old tutorials written for the original board may compile against the wrong libraries.
Nano 33 BLE Sense Rev2 Specifications
| Feature | Nano 33 BLE Sense Rev2 |
|---|---|
| Main module | u-blox NINA-B306 |
| Main MCU | Nordic nRF52840 |
| CPU | 64 MHz Arm Cortex-M4F with FPU |
| Flash | 1 MB |
| RAM | 256 kB |
| Logic voltage | 3.3 V |
| Bluetooth | Bluetooth 5 / BLE |
| IEEE 802.15.4 hardware | Yes |
| ADC | 12-bit SAADC |
| Analog inputs | A0-A7 |
| DAC | No true voltage DAC |
| USB | Native full-speed USB |
| IMU | BMI270 + BMM150 |
| Temperature/humidity | HS3003 |
| Pressure | LPS22HB |
| Colour/proximity/gesture | APDS9960 |
| Microphone | MP34DT06JTR digital MEMS microphone |
| VIN | 5-21 V |
Complete Header Pinout
The external Nano header pin mapping is essentially the same as Nano 33 BLE Rev2:
| Arduino pin | nRF52840 GPIO | Main functions |
|---|---|---|
| D0 / TX | P1.03 | UART TX, digital GPIO |
| D1 / RX | P1.10 | UART RX, digital GPIO |
| D2 | P1.11 | Digital GPIO, PWM/timer-capable |
| D3 | P1.12 | Digital GPIO, PWM/timer-capable |
| D4 | P1.15 | Digital GPIO, PWM/timer-capable |
| D5 | P1.13 | Digital GPIO, PWM/timer-capable |
| D6 | P1.14 | Digital GPIO, PWM/timer-capable |
| D7 | P0.23 | Digital GPIO, PWM/timer-capable |
| D8 | P0.21 | Digital GPIO, PWM/timer-capable |
| D9 | P0.27 | Digital GPIO, PWM/timer-capable |
| D10 | P1.02 | Digital GPIO, SPI SS |
| D11 | P1.01 | Digital GPIO, SPI COPI/MOSI |
| D12 | P1.08 | Digital GPIO, SPI CIPO/MISO |
| D13 | P0.13 | SPI SCK, LED_BUILTIN |
| A0 / D14 | P0.04 | ADC AIN2, digital GPIO |
| A1 / D15 | P0.05 | ADC AIN3, digital GPIO |
| A2 / D16 | P0.30 | ADC AIN6, digital GPIO |
| A3 / D17 | P0.29 | ADC AIN5, digital GPIO |
| A4 / D18 | P0.31 | ADC AIN7, I²C SDA |
| A5 / D19 | P0.02 | ADC AIN0, I²C SCL |
| A6 / D20 | P0.28 | ADC AIN4, digital GPIO |
| A7 / D21 | P0.03 | ADC AIN1, digital GPIO |
Physical Header Layout
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Left side Right side D13 / SCK D12 / CIPO 3V3 D11 / COPI AREF D10 / SS A0 D9 A1 D8 A2 D7 A3 D6 A4 / SDA D5 A5 / SCL D4 A6 D3 A7 D2 5V GND RESET RESET GND D1 / RX VIN D0 / TX |
Remember:
|
1 2 3 4 5 |
D0 = TX D1 = RX |
on the current Rev2 pinout.
3.3 V Logic Only
Nano 33 BLE Sense Rev2 is not 5 V tolerant.
Do not connect a 5 V logic signal directly to:
- D0-D13;
- A0-A7;
- AREF;
- other nRF52840 signals.
Use level shifting where required.
GPIO Current Limits
Arduino specifies approximately:
|
1 2 3 4 5 6 |
15 mA maximum output current per pin 5 mA maximum input current per pin 25 mA total external current budget |
The board is intended for logic and sensors, not powering relays or motors directly.
UART, SPI and I²C
The normal external buses are:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
UART D0 = TX D1 = RX SPI D10 = SS D11 = COPI / MOSI D12 = CIPO / MISO D13 = SCK I2C A4 = SDA A5 = SCL |
Native USB is separate from D0/D1, so:
|
1 2 3 4 5 6 7 8 |
Serial → USB Serial1 → D0/D1 |
A4 and A5 Are Primarily I²C Pins
A4 and A5 map to ADC inputs too, but Arduino’s current datasheet notes that they have internal pull-ups and default to I²C operation.
For precision analog measurement, prefer A0-A3 or A6/A7 rather than A4/A5.
12-Bit ADC
The nRF52840 SAADC provides native 12-bit conversion:
|
1 2 3 4 |
0 to 4095 |
on the exposed analog inputs.
There is no true voltage DAC on this board.
What Makes the Sense Rev2 Different?
The normal Nano 33 BLE Rev2 already contains:
- nRF52840;
- Bluetooth LE;
- native USB;
- BMI270;
- BMM150.
Nano 33 BLE Sense Rev2 adds:
- HS3003 temperature/humidity;
- LPS22HB pressure;
- APDS9960 colour/proximity/gesture;
- MP34DT06J microphone.
This is why the Sense version is particularly well suited to machine-learning experiments without external sensor modules.
Rev2 vs Original Nano 33 BLE Sense
| Function | Original Sense | Sense Rev2 |
|---|---|---|
| MCU | nRF52840 | nRF52840 |
| Accelerometer/gyro | LSM9DS1 | BMI270 |
| Magnetometer | LSM9DS1 | BMM150 |
| Temperature/humidity | HTS221 | HS3003 |
| Pressure | LPS22HB | LPS22HB |
| Gesture/colour/proximity | APDS9960 | APDS9960 |
| Microphone | MP34DT05 | MP34DT06JTR |
That means old code using:
|
1 2 3 4 5 |
#include <Arduino_LSM9DS1.h> #include <Arduino_HTS221.h> |
targets the original board.
Rev2 should use the corresponding new libraries.
Onboard Sensor Summary
| Sensor | Measures | Recommended Arduino library |
|---|---|---|
| BMI270 | 3-axis acceleration + 3-axis angular rate | Arduino_BMI270_BMM150 |
| BMM150 | 3-axis magnetic field | Arduino_BMI270_BMM150 |
| HS3003 | Relative humidity + temperature | Arduino_HS300x |
| LPS22HB | Barometric pressure + temperature | Arduino_LPS22HB |
| APDS9960 | Colour, ambient light, proximity, gestures | Arduino_APDS9960 |
| MP34DT06J | Digital audio | PDM |
BMI270 Accelerometer and Gyroscope
The BMI270 provides:
- 3-axis acceleration;
- 3-axis angular velocity.
Arduino’s current BMI270/BMM150 library configures the board with:
- accelerometer range of ±4 g;
- gyroscope range of ±2000 degrees per second;
- accelerometer/gyro output rate close to 100 Hz.
BMM150 Magnetometer
The BMM150 adds 3-axis magnetic-field measurement.
It can be used for:
- electronic compass projects;
- heading estimation;
- magnetic field detection;
- sensor fusion with the accelerometer/gyro.
The current Arduino library exposes the BMI270 and BMM150 together through one IMU object.
Basic IMU Example
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <Arduino_BMI270_BMM150.h> void setup() { Serial.begin(115200); if (!IMU.begin()) { Serial.println("IMU initialization failed"); while (true) { } } } void loop() { float ax, ay, az; if (IMU.accelerationAvailable()) { IMU.readAcceleration(ax, ay, az); Serial.print(ax); Serial.print(','); Serial.print(ay); Serial.print(','); Serial.println(az); } } |
Reading Gyroscope Data
|
1 2 3 4 5 6 7 8 |
float gx, gy, gz; if (IMU.gyroscopeAvailable()) { IMU.readGyroscope(gx, gy, gz); } |
Reading Magnetometer Data
|
1 2 3 4 5 6 7 8 |
float mx, my, mz; if (IMU.magneticFieldAvailable()) { IMU.readMagneticField(mx, my, mz); } |
The magnetometer output is useful for heading but normally requires calibration if you want accurate compass behaviour.
Magnetometer Calibration
Nearby ferromagnetic material, PCB currents and permanent magnets can distort the measured field.
For serious heading estimation, account for:
- hard-iron offset;
- soft-iron scaling;
- board orientation;
- tilt compensation.
A raw magnetometer is not automatically a calibrated compass.
HS3003 Temperature and Humidity
The HS3003 measures:
- 0-100% relative humidity;
- ambient temperature.
Arduino’s current datasheet quotes typical temperature accuracy around:
|
1 2 3 4 |
±0.1 °C |
under the relevant sensor conditions, while Arduino’s product page describes around ±0.2 °C application accuracy.
As always, board self-heating and airflow can influence the temperature measured by an onboard sensor.
HS3003 Library
Use:
|
1 2 3 4 |
#include <Arduino_HS300x.h> |
Example:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <Arduino_HS300x.h> void setup() { Serial.begin(115200); if (!HS300x.begin()) { Serial.println("HS3003 initialization failed"); while (true) { } } } void loop() { float temperature = HS300x.readTemperature(); float humidity = HS300x.readHumidity(); Serial.print(temperature); Serial.print(" C, "); Serial.print(humidity); Serial.println(" %RH"); delay(1000); } |
Board Temperature Is Not Room Temperature
The HS3003 sits on the same PCB as:
- the nRF52840;
- power circuitry;
- LEDs;
- other active sensors.
If the board is enclosed or processing heavily, local board heating can shift the measured temperature away from free-air room temperature.
For accurate environmental monitoring:
- allow airflow;
- avoid mounting next to hot regulators;
- consider calibration against a reference thermometer;
- avoid reading immediately after large power-state changes.
LPS22HB Barometric Pressure Sensor
The LPS22HB measures absolute pressure over approximately:
|
1 2 3 4 |
260 to 1260 hPa |
with up to 24-bit pressure data.
It also contains its own temperature sensor for compensation and reports temperature data separately.
Pressure Library
Use:
|
1 2 3 4 |
#include <Arduino_LPS22HB.h> |
Example:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <Arduino_LPS22HB.h> void setup() { Serial.begin(115200); if (!BARO.begin()) { Serial.println("LPS22HB initialization failed"); while (true) { } } } void loop() { float pressure = BARO.readPressure(); Serial.print(pressure); Serial.println(" kPa"); delay(1000); } |
Using Pressure to Estimate Altitude
Barometric pressure can be converted to approximate altitude if you know the reference sea-level pressure.
However, atmospheric pressure changes with weather, so a barometer is not a permanently accurate absolute altimeter without calibration.
It is excellent for:
- relative height changes;
- floor detection;
- weather monitoring;
- vertical-motion features in sensor fusion.
APDS9960 Colour, Light, Proximity and Gesture Sensor
The APDS9960 combines several optical functions:
- red/green/blue colour sensing;
- ambient-light measurement;
- infrared proximity sensing;
- directional gesture recognition.
Gesture detection uses directional photodiodes and an integrated IR LED.
Supported simple gestures include:
|
1 2 3 4 5 6 7 |
UP DOWN LEFT RIGHT |
APDS9960 Library
Use:
|
1 2 3 4 |
#include <Arduino_APDS9960.h> |
Proximity Example
|
1 2 3 4 5 6 7 8 |
if (APDS.proximityAvailable()) { int proximity = APDS.readProximity(); Serial.println(proximity); } |
Colour Example
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if (APDS.colorAvailable()) { int r, g, b; APDS.readColor(r, g, b); Serial.print(r); Serial.print(','); Serial.print(g); Serial.print(','); Serial.println(b); } |
Gesture Example
|
1 2 3 4 5 6 7 8 9 10 |
if (APDS.gestureAvailable()) { int gesture = APDS.readGesture(); if (gesture == GESTURE_LEFT) { Serial.println("LEFT"); } } |
Optical Sensor Placement Matters
The APDS9960 needs optical access to the outside world.
If you put Nano 33 BLE Sense Rev2 inside an opaque enclosure, you effectively disable:
- colour sensing;
- ambient light;
- proximity;
- gesture detection.
For a finished product, plan the enclosure around the optical sensor position.
MP34DT06J Digital Microphone
The onboard MP34DT06JTR is an omnidirectional digital MEMS microphone.
Arduino quotes characteristics including:
- approximately 64 dB signal-to-noise ratio;
- around -26 dBFS sensitivity;
- approximately 122.5 dB SPL acoustic overload point.
The microphone outputs a PDM digital stream rather than an analog voltage.
PDM Library
The normal Arduino interface is:
|
1 2 3 4 |
#include <PDM.h> |
The PDM library converts the microphone’s high-rate one-bit stream into PCM audio samples that your sketch can process.
Basic Microphone Pattern
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <PDM.h> short sampleBuffer[256]; volatile int samplesRead = 0; void onPDMdata() { int bytesAvailable = PDM.available(); PDM.read( sampleBuffer, bytesAvailable ); samplesRead = bytesAvailable / 2; } void setup() { Serial.begin(115200); PDM.onReceive(onPDMdata); if (!PDM.begin(1, 16000)) { Serial.println("PDM initialization failed"); while (true) { } } } void loop() { if (samplesRead) { // Process PCM samples here. samplesRead = 0; } } |
Why the Microphone Is Excellent for TinyML
Audio classification is one of the classic embedded machine-learning workloads.
Typical pipeline:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
microphone ↓ PDM samples ↓ windowing ↓ FFT / MFCC / spectral features ↓ TinyML model ↓ keyword / event classification |
Applications include:
- keyword spotting;
- clap detection;
- machine-noise classification;
- alarm recognition;
- environmental sound classification.
Why the IMU Is Also Excellent for TinyML
Motion classification can use:
|
1 2 3 4 5 6 7 8 |
accelerometer + gyroscope + optional magnetometer |
to identify:
- gestures;
- walking/running;
- machine vibration states;
- tool motion;
- orientation changes;
- abnormal movement.
The 256 kB RAM and Cortex-M4F make the board much more comfortable for small neural-network inference than an AVR Nano.
Combining Multiple Sensors
The real strength of Nano 33 BLE Sense Rev2 is sensor fusion.
For example:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
IMU → movement pressure → height change humidity + temperature → environment APDS9960 → nearby hand / light / colour microphone → sound context |
A model or state machine can combine all of these signals without adding any external sensor board.
Do Not Sample Everything as Fast as Possible
Different sensors have very different useful data rates.
For example:
- IMU data may be useful around tens to hundreds of samples per second;
- audio needs kHz-range sampling;
- humidity changes slowly;
- barometric pressure usually changes slowly;
- gesture/proximity needs event-oriented polling.
A good application gives each sensor an appropriate update interval instead of repeatedly polling every device in a tight loop.
BLE Sensor Streaming
ArduinoBLE can transmit selected sensor data to a phone or another BLE device.
Example architecture:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
onboard sensor ↓ nRF52840 ↓ filter / inference ↓ BLE characteristic ↓ phone / gateway |
Do not stream raw audio continuously over BLE unless the bandwidth and packet design have been considered carefully. Sending classification results is often much more efficient.
No Wi-Fi
Nano 33 BLE Sense Rev2 has Bluetooth LE but no Wi-Fi.
If you need direct Wi-Fi plus substantial memory, Nano ESP32 is a more natural choice.
See our Nano ESP32 pinout guide.
Sense Rev2 vs Nano 33 BLE Rev2
The underlying processor and external header pinout are closely related.
The major reason to buy the Sense version is the extra onboard environmental, optical and audio sensors.
See our Nano 33 BLE Rev2 pinout guide for a deeper look at the nRF52840 GPIO, ADC, PWM and BLE architecture.
Power and Low-Power Use
The board can be powered through:
- Micro-USB;
- VIN at approximately 5-21 V;
- specialised low-power 3.3 V arrangements after the documented jumper modification.
Arduino’s current datasheet notes that the 5 V header does not behave like the classic Nano’s regulated 5 V output in every configuration; it is tied to the USB power path through a jumper.
Sensor Power Consumption Matters
For battery applications, shutting down or reducing the data rate of unused sensors can save more power than optimising application code alone.
For example:
- disable optical gesture functions when not required;
- reduce IMU output data rate;
- stop PDM capture between audio windows;
- avoid leaving LEDs on;
- use BLE advertising/connection intervals appropriate to the application.
Board Recovery
If a sketch prevents normal USB upload:
- power the board;
- double-tap RESET;
- wait for bootloader mode;
- select the bootloader serial port;
- upload a known-good sketch.
Common Problem: Old IMU Sketch Does Not Compile
If an old tutorial uses:
|
1 2 3 4 |
#include <Arduino_LSM9DS1.h> |
it targets the original Nano 33 BLE Sense.
For Rev2 use:
|
1 2 3 4 |
#include <Arduino_BMI270_BMM150.h> |
Common Problem: Old Temperature/Humidity Sketch Does Not Compile
If the tutorial uses:
|
1 2 3 4 |
#include <Arduino_HTS221.h> |
it targets the old HTS221 sensor.
Rev2 uses HS3003:
|
1 2 3 4 |
#include <Arduino_HS300x.h> |
Common Problem: Temperature Seems Too High
Onboard temperature sensors measure the local air/PCB environment, not an ideal remote ambient reference.
Check:
- USB and regulator heating;
- CPU workload;
- enclosure ventilation;
- nearby heat sources;
- time allowed for thermal stabilisation.
Common Problem: Gesture Sensor Does Not Work in Enclosure
The APDS9960 needs a clear optical path.
Dark or opaque plastic over the sensor can prevent correct operation unless the enclosure has been designed for IR/visible transmission.
Common Problem: BLE Works but Wi-Fi Example Does Not
Nano 33 BLE Sense Rev2 has no Wi-Fi radio.
It supports Bluetooth LE through the nRF52840.
Quick Reference
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
Main MCU nRF52840 64 MHz Cortex-M4F 1 MB Flash 256 kB RAM Logic 3.3 V only UART D0 = TX D1 = RX SPI D10 = SS D11 = MOSI / COPI D12 = MISO / CIPO D13 = SCK I2C A4 = SDA A5 = SCL ADC A0-A7 12 bit DAC none IMU BMI270 BMM150 Temperature / humidity HS3003 Pressure LPS22HB Colour / proximity / gesture APDS9960 Microphone MP34DT06JTR PDM interface Wireless Bluetooth 5 / BLE IEEE 802.15.4 hardware no Wi-Fi |
Best Practices
- Use Rev2-specific libraries for the BMI270/BMM150 and HS3003.
- Do not apply 5 V signals to any GPIO.
- Use A4/A5 primarily for I²C rather than precision analog sensing.
- Use the appropriate sensor data rate instead of polling everything continuously.
- Calibrate the magnetometer for accurate compass use.
- Allow airflow if temperature/humidity accuracy matters.
- Give the APDS9960 a clear optical path through the enclosure.
- Stop or reduce sensor activity when optimising battery life.
- Use BLE to transmit processed information rather than unnecessarily large raw data streams.
- Use the microphone and IMU as primary TinyML inputs; they are the board’s strongest machine-learning features.
Final Thoughts
Nano 33 BLE Sense Rev2 is one of Arduino’s most complete small sensor boards because almost every common TinyML input modality is already onboard.
You get:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
motion → BMI270 + BMM150 temperature / humidity → HS3003 barometric pressure → LPS22HB light / colour / proximity / gesture → APDS9960 audio → MP34DT06J wireless → Bluetooth LE |
all connected to a 64 MHz Cortex-M4F with 1 MB Flash and 256 kB RAM.
The biggest trap is compatibility with old tutorials. The original Sense board used LSM9DS1 and HTS221, while Rev2 uses BMI270+BMM150 and HS3003. If code fails because those old libraries are missing or return the wrong assumptions, check which board generation the tutorial actually targets.
Once the Rev2 sensor set is understood, the board is an unusually capable platform for motion recognition, sound classification, environmental monitoring, BLE wearables and compact TinyML prototypes without any external sensor wiring.