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

Software Preparation

Wiring Diagram

SEN0662 I2C INT 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

SEN0662-I2C INT Result

Was this article helpful?

TOP