Fix “Could not find a valid BMP280 sensor, check wiring or try a different address!”
Most purple BMP280 modules sit at 0x76, but the Adafruit library defaults to 0x77. Call bmp.begin(0x76). SensorID 0x60 means it’s really a BME280.
Community draft — report a mistake
What you see
BMP280 test
Could not find a valid BMP280 sensor, check wiring or try a different address!
SensorID was: 0xFF
ID of 0xFF probably means a bad address, a BMP 180 or BMP 085
ID of 0x56-0x58 represents a BMP 280,
ID of 0x60 represents a BME 280.
ID of 0x61 represents a BME 680.BMP280 test
Could not find a valid BMP280 sensor, check wiring or try a different address!
SensorID was: 0xFF
ID of 0xFF probably means a bad address, a BMP 180 or BMP 085
ID of 0x56-0x58 represents a BMP 280,
ID of 0x60 represents a BME 280.
ID of 0x61 represents a BME 680.
The Adafruit BMP280 example prints this message when bmp.begin() fails, followed by the chip ID it read. That ID tells you which of three problems you have: no answer at that address (0xFF), a BMP280 at a different address, or a different chip altogether.
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(115200);
if (!bmp.begin(0x76)) { // most purple modules
Serial.println("Not at 0x76 - try 0x77");
}
}Quick fix — try in order
- 1
Pass the address: bmp.begin(0x76)
The Adafruit library’s default is 0x77. Cheap GY-BMP280 boards ship with SDO pulled low → 0x76. The I2C scanner below tells you which.
- 2
Read the SensorID line
0xFF = nothing answered at that address (wrong address or wiring). 0x58 = a BMP280 that answered. 0x60 = it is a BME280 — use the BME280 library.
- 3
Wire SDA/SCL and power correctly
ESP32: SDA 21, SCL 22, VCC 3V3. Uno: SDA A4, SCL A5. Most purple boards have a 3.3 V regulator and accept 3.3–5 V on VCC.
- 4
Don’t leave CSB floating on 6-pin boards
CSB low at power-up switches the chip to SPI mode. Tie CSB to VCC (most modules pull it up already) and SDO to GND for 0x76.
Diagnostic sketch
// I2C scanner — lists every device address that answers on the bus.
// ESP32 DevKit V1: SDA = GPIO21, SCL = GPIO22. Uno/Nano: SDA = A4, SCL = A5.
#include <Wire.h>
void setup() {
Serial.begin(115200);
while (!Serial) {}
#if defined(ARDUINO_ARCH_ESP32)
Wire.begin(21, 22); // SDA, SCL
#else
Wire.begin();
#endif
Serial.print("I2C scanner on SDA=");
Serial.print(SDA);
Serial.print(" SCL=");
Serial.println(SCL);
}
void loop() {
Serial.println("Scanning...");
uint8_t found = 0;
// 0x08..0x77 are the usable 7-bit addresses; the rest are reserved.
for (uint8_t addr = 0x08; addr <= 0x77; addr++) {
Wire.beginTransmission(addr);
uint8_t err = Wire.endTransmission();
if (err == 0) {
Serial.print("Found device at 0x");
if (addr < 0x10) Serial.print('0');
Serial.println(addr, HEX);
found++;
} else if (err == 4) {
Serial.print("Unknown error at 0x");
Serial.println(addr, HEX);
}
}
if (found == 0) {
Serial.println("No I2C devices found");
Serial.println("Check: SDA/SCL swapped? Module powered? Pull-ups present?");
} else {
Serial.print(found);
Serial.println(" device(s) found");
}
Serial.println();
delay(5000);
}// I2C scanner — lists every device address that answers on the bus.
// ESP32 DevKit V1: SDA = GPIO21, SCL = GPIO22. Uno/Nano: SDA = A4, SCL = A5.
#include <Wire.h>
void setup() {
Serial.begin(115200);
while (!Serial) {}
#if defined(ARDUINO_ARCH_ESP32)
Wire.begin(21, 22); // SDA, SCL
#else
Wire.begin();
#endif
Serial.print("I2C scanner on SDA=");
Serial.print(SDA);
Serial.print(" SCL=");
Serial.println(SCL);
}
void loop() {
Serial.println("Scanning...");
uint8_t found = 0;
// 0x08..0x77 are the usable 7-bit addresses; the rest are reserved.
for (uint8_t addr = 0x08; addr <= 0x77; addr++) {
Wire.beginTransmission(addr);
uint8_t err = Wire.endTransmission();
if (err == 0) {
Serial.print("Found device at 0x");
if (addr < 0x10) Serial.print('0');
Serial.println(addr, HEX);
found++;
} else if (err == 4) {
Serial.print("Unknown error at 0x");
Serial.println(addr, HEX);
}
}
if (found == 0) {
Serial.println("No I2C devices found");
Serial.println("Check: SDA/SCL swapped? Module powered? Pull-ups present?");
} else {
Serial.print(found);
Serial.println(" device(s) found");
}
Serial.println();
delay(5000);
}Why it happens
BMP280 or BME280?
They look identical. The BME280 also measures humidity. Sellers mix them up both ways, so the chip ID is the only reliable label.
Fake / relabelled chips
IDs 0x56 or 0x57 are BMP280 engineering samples; the library accepts 0x58 by default. Some clones report other IDs and need a library that skips the check.
It worked, then stopped after soldering
Flux or a bridge on the SDO pad changes the address. Re-scan.
Board-specific notes
ESP32: Wire.begin(21, 22) before bmp.begin(0x76) if your code changes I2C pins.
BME280: If the ID is 0x60, use the BME280 library — and if that fails, see Could not find a valid BME280 sensor.
Did this fix it?
Thanks — that helps us keep this page right.