arduino-i2c-sen5x
arduino-i2c-sen5x copied to clipboard
SEN54-SDN-T returns constant 6553.4 µg/m³ on PM channels even after warm-up
I’m using a SEN54-SDN-T on a shared I²C bus with another Sensirion sensor. I’ve implemented the startup sequence according to the datasheet, including a warm-up delay before polling PM values. However, my PM1, PM2.5, PM4, and PM10 channels still report 6553.4 µg/m³ consistently, which I understand corresponds to the 0xFFFF “invalid” sentinel.
Hardware setup:
- SEN54-SDN-T connected via I²C to an MCU.
- Another SEN5x sensor also on the same I²C bus (different address).
- Using official Arduino SensirionI2CSen5x driver from GitHub.
Initialization:
- Call startMeasurement() in init() function.
- Delay 60 s (also tried 90 s: 60 s warm-up + 30 s PM stabilization per datasheet).
Loop:
- Poll readMeasuredValues() every 3 seconds.
- Temperature, humidity, VOC index all report valid and changing values.
- All PM channels remain at 6553.4.
Behavior:
- After first power-up, sometimes PM1 will briefly track down from 6553.4 toward ~6000, but all PM values remain fixed and unrealistically high.
- Reboots/warm-up delays do not change the outcome.
Expected behavior: After the documented warm-up, I expect the PM channels to output actual measured µg/m³ values and update with changes in the air environment.
Observed behavior:
- PM1, PM2.5, PM4, and PM10 always return 6553.4 µg/m³.
- Other channels (temp, RH, VOC index) behave normally.
- This persists after both 60 s and 90 s warm-up sequences.
Things I have checked:
- Confirmed correct I²C address for SEN54-SDN-T using getProductName() → "SEN54-SDN-T".
- No repeated startMeasurement() calls inside the main loop.
- Fan is spinning during measurement.
- Using stock Arduino example code with only delays modified.
- Power and pull-ups are within datasheet recommendations.
Questions:
- Is there any known condition where PM measurements would stay in the sentinel value state after warm-up?
- Could this be a firmware issue? (If so, what is the latest firmware and how do I update it?)
- Is there any additional command required to explicitly enable the PM laser/fan sampling for the SDN-T variant?
Environment: Sensor: SEN54-SDN-T Driver: Latest Arduino SensirionI2CSen5x from GitHub Platform: ESP 32 - S3 Pull-up resistors: 10 kΩ
Update: I tested using function readMeasuredPmValues() and it outputs 6553.40 for everything besides typical particle size which ranges betwen 0.55 and 0.63.
Dear @daniilnahl
How old is your sensor, did it always behave like that ?
We can try a few things:
- Could you read the device state and share the result ?
- Did you try to run the fan cleaning command ?
- Do you get the same result if the sensor is alone on the bus ?
Cheers Q
PS: edited my message a few times
Hi,
- Yes, it behaved like that from start and I thought it was normal when I first got it in June, but as I started investigating its reading this month I realized something is wrong. Although, couple times the readings have changed and came down to 5000s.
- The device status I am getting is '0x00000000'. My code to get status is below.
uint32_t status_before = 0;
uint16_t err = sen5x.readAndClearDeviceStatus(status_before);
if (err == 0) {
char buf[11];
snprintf(buf, sizeof(buf), "0x%08lX", (unsigned long)status_before);
Serial.println(buf);
}
- Yes, the measurements for mass concertation was not at 6553.40 but all are still above 6000 and fluctuating.
- Yes, although it varied. Sometimes I would get readings as low as 5000s and sometimes it would stay at 6553.40.
Hello @daniilnahl
It seems to me you got a defective unit. Could you reach out either to your distributor where you bought it or to the Sensirion support ? In case you reach out to Sensirion customer support please link this issue such that it reaches our team.
Cheers Q
Hello @qfisch,
I have sent a request to Sensirion support. Thank you for helping me out!