An I²C scanner that finds a device at 0x76 or 0x77 has proved only that an address acknowledged. Before replacing wires or changing pull-ups, read register 0xD0: a Bosch BME280 should return chip ID 0x60.
Featured image: Adafruit.
This one-byte check separates three questions that are often collapsed into one error message: did the bus transaction work, did software choose the responding address, and is the device actually a BME280?
Use the scanner result as an address, not an identity
The Bosch datasheet defines two I²C addresses. The device uses 0x76 when SDO is low and 0x77 when SDO is high. On the Adafruit breakout, the default is 0x77; its address connection can select 0x76.
Pass the address that the scanner actually found to the library initialization call. A sketch hard-coded for 0x77 will fail against a board strapped to 0x76 even though the wiring and sensor are otherwise healthy.

Read 0xD0 and interpret the byte
Register 0xD0 is the chip-identification register. A BME280 returns 0x60 after power-on reset completes. If the address ACKs but 0xD0 returns another stable value, the transport path may be working while the attached silicon is a different device or an incompatible module.
A repeated 0xFF often points to a read that never received valid data, such as a wrong register transaction, released bus or address mismatch. A repeated 0x00 suggests a different failure path, including a device held in reset, an incorrect read sequence or another component that implements the address but not the expected register map. Record the address, register and returned byte instead of reducing all outcomes to “sensor not found.”
Confirm interface mode and board-level wiring
The BME280 supports I²C up to 3.4 MHz and SPI up to 10 MHz, but a breakout’s pin straps determine which interface the software sees. On a board with both interfaces exposed, chip-select must be in the state required for I²C operation. SDO then selects the low address bit rather than carrying SPI data.
Inspect solder joints on VIN, GND, SCL and SDA, and measure supply voltage at the board while it is connected. If SDA is physically held low, address scanning is no longer the right branch; TVG’s I²C stuck-low recovery guide covers that bus-level condition.

Reset only after identity is established
Bosch defines 0xB6 as the soft-reset command written to register 0xE0. A reset can clear a bad configuration state, but it cannot turn a BMP280 or another responding part into a BME280. Verify 0x60 first, then reset and allow startup to complete before writing measurement settings.
If the ID is correct and initialization still fails, capture the exact library version, address argument and bus speed. The remaining fault is then in configuration timing, register access or library compatibility—not the basic claim that a BME280 is present at that address.

