Example Code for Arduino-BMV080 Continuous Measurement Reading
The article guides users to communicate with BMV080 via the I2C interface of ESP32-E, configure balanced measurement algorithm, obstruction detection and vibration filtering, enable continuous measurement mode, poll for PM1.0/PM2.5/PM10 concentration as well as obstruction and out-of-range alarm status, and print data through serial port.
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 |
- 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"
// I2C device address, A0 and A1 pins pulled high for 0x57
const uint8_t I2C_ADDR = 0x57;
DFRobot_BMV080_Gravity_I2C sensor(&Wire, I2C_ADDR);
void setup()
{
delay(2000);
// Initialize serial port at baud rate 115200
Serial.begin(115200);
while (!Serial) {
delay(100);
}
// Sensor I2C initialization, loop until initialization succeeds
while (!sensor.begin()) {
Serial.println("Sensor init failed, please check wiring and I2C address!");
delay(1000);
}
Serial.println("BMV080 sensor init succeeded");
/**
* Set measurement algorithm mode:
* eFastResponse Fast response mode
* eBalanced Balanced mode (balance speed and accuracy, default)
* eHighPrecision High precision mode
*/
sensor.setMeasurementAlgorithm(DFRobot_BMV080_Gravity::eBalanced);
Serial.print("Current 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 enabled");
} else {
Serial.println("Failed to start continuous measurement!");
}
}
void loop()
{
DFRobot_BMV080_Gravity::sData_t data;
// Read sensor measurement data, return true only when new data is ready
if (sensor.getData(&data)) {
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");
// Print status warning messages
if (data.isObstructed) {
Serial.print(" [WARNING: Sensor filter obstructed]");
}
if (data.isOutsideMeasurementRange) {
Serial.print(" [WARNING: Measured value out of range]");
}
Serial.println();
}
delay(100);
}
Result

Was this article helpful?
