Aziz Bench

SEN50 / SEN54 / SEN55 I²C address

The SEN50 / SEN54 / SEN55 (particulate matter, VOC/NOx, temperature and humidity module) has a fixed I²C address, 0x69: no pin changes it.

I²C address (7-bit)
0x69
fixed address
Write / read (8-bit)
0xD2 / 0xD3
Binary
1101001
Shares an address with
5 devices
Where it sits on the bus its addresses reserved
0123456789ABCDEF
00000102030405060708090A0B0C0D0E0F
10101112131415161718191A1B1C1D1E1F
20202122232425262728292A2B2C2D2E2F
30303132333435363738393A3B3C3D3E3F
40404142434445464748494A4B4C4D4E4F
50505152535455565758595A5B5C5D5E5F
60606162636465666768696A6B6C6D6E6F
70707172737475767778797A7B7C7D7E7F

How to set the address

There is no address pin: the address is set at the factory, so it is always 0x69.

The SEL pin must be tied to GND for I²C.

Devices that use the same addresses

Two devices on the same bus can’t answer on the same address. These modules from our list also use 0x69:

DeviceWhat it isShared address
BMI2706-axis IMU0x69
MPU-60506-axis accelerometer + gyroscope0x69
MPU-68866-axis IMU0x69
MPU-92509-axis IMU (accel + gyro + AK8963 magnetometer)0x69
PCA968516-channel 12-bit PWM / servo driver0x69

If two of them end up on the same address, move one with its address pin, put one behind a TCA9548A multiplexer (0x70–0x77), or use a second I²C bus: the ESP32, ESP32-S3 and RP2040 have two I²C controllers (the ESP32-C3 has one).

Check your whole bus →Add the SEN50 / SEN54 / SEN55 and your other modules: the checker finds conflicts, suggests free addresses and sizes the pull-ups.

7-bit and 8-bit address

I²C addresses are 7 bits long. Some datasheets and libraries write them as 8-bit numbers, with the read/write bit added on the right: that is why the same chip can appear as 0x69 or 0xD2. Arduino’s Wire library and ESPHome use the 7-bit form.

7-bitBinary8-bit write8-bit read
0x6911010010xD20xD3

Check that it answers

Upload this sketch with the SEN50 / SEN54 / SEN55 wired to SDA and SCL: it tries every address the chip can use and prints the one that answers. On an ESP32 the default pins are GPIO21 (SDA) and GPIO22 (SCL); on an Arduino Uno, A4 and A5.

#include <Wire.h>

const byte ADDRS[] = {0x69};

void setup() {
  Serial.begin(115200);
  Wire.begin();
  for (byte a : ADDRS) {
    Wire.beginTransmission(a);
    if (Wire.endTransmission() == 0) {
      Serial.print("SEN50 / SEN54 / SEN55 answers at 0x");
      if (a < 0x10) Serial.print('0');
      Serial.println(a, HEX);
      return;
    }
  }
  Serial.println("No answer: check the wiring");
}

void loop() {}

In ESPHome the bus is scanned at boot (scan: true is the default): the log lists every address that answers.

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true

Pull-up resistors

SDA and SCL need pull-up resistors to the supply. Many breakout boards already carry them, often 4.7 kΩ or 10 kΩ, and with several boards on the bus they add up in parallel. The I²C checker works out the allowed range for your bus voltage and speed.

Frequently asked questions

What is the I2C address of the SEN50 / SEN54 / SEN55?

0x69. It is fixed: there is no address pin.

Can I use more than one SEN50 / SEN54 / SEN55 on the same bus?

Not directly: the address is fixed, so two would clash. Put each one on a different channel of a TCA9548A multiplexer, or use a second I²C bus.

Why doesn’t the SEN50 / SEN54 / SEN55 show up in an I2C scan?

Check, in this order: SDA and SCL not swapped; ground shared between the boards; pull-up resistors on SDA and SCL; the module powered at the voltage it is made for; and that your code uses the 7-bit address (0x69), not the 8-bit one (0xD2).

Similar devices

Addresses checked against the SEN50 / SEN54 / SEN55 datasheet.