**BMV080 readSensor() returns 0 indefinitely after brief working period — dedicated I2C bus, ESP32-WROOM**

Hi all — posting a detailed report hoping someone has seen this behavior before.

Setup:

  • SparkFun BMV080 breakout (I2C pull-up jumper cut)
  • ESP32-WROOM
  • BMV080 on its own dedicated I2C bus (Wire1, SDA=14, SCL=15) — no other sensors sharing the bus
  • Runs on a dedicated FreeRTOS task pinned to Core 1
  • SparkFun BMV080 library v1.0.4, Bosch SDK v11.2.0
  • Local decoupling caps (100nF + 10µF) added directly at sensor VCC/GND
  • I2C clock: 100kHz, timeout: 50ms

Behavior:
The sensor initializes successfully every time (begin() OK, init() OK on first attempt). It then produces valid frames for a short period — we see readSensor() returning 1 with real PM values. Then, without any obvious trigger, readSensor() starts returning 0 indefinitely.

Key observations:

  • FreeRTOS task heartbeat keeps incrementing throughout — task is alive, not deadlocked
  • I2C bus shows no errors, no hangs
  • begin() + init() succeeds again after bus recovery, but readSensor() continues returning 0 immediately after reinit
  • This happens in clean air at rest — not just during high-particulate events
  • During dense aerosol exposure (cooking smoke) the dropout happens faster and more reliably, but it also occurs spontaneously in clean air after 2-5 minutes
  • Once in this state, only a full power cycle (not software reinit) reliably restores normal operation

What we’ve tried:

  • Cutting I2C pull-up jumper on SparkFun board
  • Dedicated I2C bus with no other devices
  • Local decoupling capacitors
  • setDoObstructionDetection(false) and true — both exhibit the same dropout behavior
  • Full begin() + init() reinit sequence — init reports success but readSensor() still returns 0
  • I2C bus clock-out recovery (toggling SCL 16 times + STOP condition + Wire1.begin()) before reinit
  • Reducing I2C clock to 50kHz

Questions:

  1. Has anyone encountered this and found a reliable solution?
  2. Is spontaneous cessation of frame output (readSensor()=0 in a loop) with successful init() a known failure mode? What typically causes it?
  3. Is there an internal sensor state or protection mode that can activate in clean air conditions, and if so is there a reset sequence beyond begin() + init() that reliably clears it?
  4. Does the BMV080 have any hardware reset pin or power-cycle requirement that the SparkFun breakout exposes?
  5. Are there known issues with the BMV080 in environments with airflow turbulence, fan vibration, or PWM noise on the power rail?

Any insight appreciated — this sensor has been the hardest part of an otherwise solid prototype build.

Before delving into the FreeRTOS: Does the default arduino sketch here work? Setting Up Arduino - SparkFun Air Quality PM1/PM2.5/PM10 Sensor - BMV080 (Qwiic) Hookup Guide (setup)

Sketch 1 — Basic Readings - SparkFun Air Quality PM1/PM2.5/PM10 Sensor - BMV080 (Qwiic) Hookup Guide