Example Code for Arduino- External Interrupt Continuous Sampling
The article guides users to communicate with the BMV080 via the I2C interface of ESP32-E, acquire sensor data through external interrupt on GPIO14, read PM1.0/PM2.5/PM10 concentrations and monitor blockage and out-of-range statuses, enable the balanced measurement algorithm, blockage detection and vibration filtering, and output measurement results continuously.
Hardware Preparation
- SEN0662 Gravity: BMV080 PM2.5 Sensor × 1
- DFR0654 FireBeetle 2 ESP32-E Development Board × 1
- Several Dupont Wires
Software Preparation
- Download and install Arduino IDE: Download Link
- Download DFRobot_BMV080_Gravity library: DFRobot_BMV080_Gravity Library
- Download and install the DFRobot_RTU library: DFRobot_RTU Library
- Library Installation Guide: View Installation Tutorial
Wiring Diagram

Connection Description:
| Sensor Pin: VCC | Connect to | Main Controller Pin: 3.3V |
|---|---|---|
| Sensor Pin: GND | Connect to | Main Controller Pin: GND |
| Sensor Pin: C | Connect to | Main Controller Pin: 22/SCL |
| Sensor Pin: D | Connect to | Main Controller Pin: 21/SDA |
| Sensor Pin: INT | Connect to | Main Controller Pin: 14/D6 |
- DIP switch configuration for the sensor: Set communication mode to I2C, and set the I2C address to 0x57 (A0=1, A1=1, factory default address).
Sample Code
#include "DFRobot_BMV080_Gravity.h"
const uint8_t I2C_ADDR = 0x57;
DFRobot_BMV080_Gravity_I2C sensor(&Wire, I2C_ADDR);
// Interrupt flag, shared between ISR and main loop, must use volatile
volatile uint8_t dataFlag = 0;
/**
* @brief External interrupt callback function. Only set flag, no time‑consuming operations allowed.
*/
void IRAM_ATTR onInterrupt(void)
{
if (dataFlag == 0) {
dataFlag = 1;
}
}
// ESP32‑E interrupt pin: Module INT pin connected to GPIO14
const uint8_t INT_PIN = 14;
void setup()
{
delay(2000);
Serial.begin(115200);
while (!Serial) {
delay(100);
}
// Wait for sensor I2C initialization success
while (!sensor.begin()) {
Serial.println("Sensor init failed");
delay(1000);
}
Serial.println("BMV080 Gravity init succeeded");
/**
* Configure measurement algorithm. Options:
* eFastResponse(Fast response), eBalanced(Balanced mode), eHighPrecision(High precision)
*/
sensor.setMeasurementAlgorithm(DFRobot_BMV080_Gravity::eBalanced);
Serial.print("Measurement Algorithm: ");
Serial.println(sensor.getMeasurementAlgorithm());
// Enable obstruction detection
sensor.setObstructionDetection(true);
Serial.print("Obstruction Detection: ");
Serial.println(sensor.getObstructionDetection() ? "Enabled" : "Disabled");
// Enable vibration filtering
sensor.setVibrationFiltering(true);
Serial.print("Vibration Filtering: ");
Serial.println(sensor.getVibrationFiltering() ? "Enabled" : "Disabled");
// Start continuous measurement mode
if (sensor.setMeasureMode(DFRobot_BMV080_Gravity::eContinuousMode) == 0) {
Serial.println("Continuous measurement mode started");
} else {
Serial.println("Failed to start measurement");
}
// Configure external interrupt, falling‑edge trigger, pull‑up input
pinMode(INT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INT_PIN), onInterrupt, FALLING);
Serial.print("External interrupt configured, INT pin is GPIO");
Serial.println(INT_PIN);
}
void loop()
{
DFRobot_BMV080_Gravity::sData_t data;
if (dataFlag == 1) {
// Read PM data, including concentration, obstruction, out‑of‑range status
if (sensor.getData(&data)) {
dataFlag = 0;
Serial.print("PM1.0: ");
Serial.print(data.PM1);
Serial.print(" ug/m3 PM2.5: ");
Serial.print(data.PM2_5);
Serial.print(" ug/m3 PM10: ");
Serial.print(data.PM10);
Serial.print(" ug/m3");
if (data.isObstructed) {
Serial.print(" [Obstruction Detected]");
}
if (data.isOutsideMeasurementRange) {
Serial.print(" [Measurement out of range]");
}
Serial.println();
}
}
}
Result

Was this article helpful?
