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, butreadSensor()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)andtrue— 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:
- Has anyone encountered this and found a reliable solution?
- Is spontaneous cessation of frame output (
readSensor()=0in a loop) with successfulinit()a known failure mode? What typically causes it? - 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? - Does the BMV080 have any hardware reset pin or power-cycle requirement that the SparkFun breakout exposes?
- 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.