Temperature, humidity and air
BMP280 with ESP32
The BMP280 measures air pressure and temperature, and nothing else. There is no humidity output. That one letter matters when you buy: BMP280 and BME280 boards look almost the same, and sellers mix up the names. If your humidity reading is missing, or the library finds no sensor, check the chip ID before you blame the wiring. The example below prints it: 0x58 is a BMP280, 0x60 a BME280.
Adafruit lists ±1 hPa absolute pressure accuracy and ±1.0 °C temperature accuracy, with low altitude noise of 0.25 m. Good uses are weather trend displays and relative height changes, such as whether a drone or a lift has moved up a floor. Absolute altitude is a weaker result: the calculation needs today's sea-level pressure, and that changes with the weather. Enter the local value from a weather service, or the height shown will wander through the day.
The address is 0x76 or 0x77 depending on the module, and the example tries both. Bare modules usually take 3.3 V only, so connect VCC to 3V3 unless the board has its own regulator. The temperature output reads the chip, which warms up slightly when placed near a display or regulator, so mount the sensor away from them.

Specifications
| Measures | Pressure, temperature |
|---|---|
| Pressure accuracy | ±1 hPa absolute |
| Temperature accuracy | ±1.0 °C |
| Altitude noise | 0.25 m |
| Interface | I2C or SPI |
| I2C address | 0x76 or 0x77 |
| Chip ID | 0x58 (BME280: 0x60) |
Power and logic levels
3.3 V: safe to connect directly
| Supply | Chip up to 3.6 V, some modules have a regulator |
|---|---|
| Signal level | 3.3 V |
| On an ESP32 | Run it from 3V3, so the I2C lines stay at 3.3 V. |
ESP32 pins, including those on a display board's connectors, work at 3.3 V and are not 5 V tolerant. Modules differ, so if in doubt, measure the signal before you connect it.
Wiring
| BMP280 | Connect to | Note |
|---|---|---|
| VIN / VCC | 3V3 | |
| GND | GND | |
| SDA | GPIO 8 | Any free pin, set in Wire.begin() |
| SCL | GPIO 9 | Any free pin, set in Wire.begin() |
Arduino code
#include <Wire.h>
#include <Adafruit_BMP280.h>
const int SDA_PIN = 8, SCL_PIN = 9; // use your board's I2C pins
const float SEA_LEVEL_HPA = 1013.25; // replace with today's local value
Adafruit_BMP280 bmp(&Wire);
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
if (!bmp.begin(0x76) && !bmp.begin(0x77)) {
Serial.println("No sensor at 0x76 or 0x77");
while (true) delay(1000);
}
Serial.printf("Chip ID 0x%02X\n", bmp.sensorID());
}
void loop() {
Serial.printf("%.1f C %.1f hPa %.1f m\n", bmp.readTemperature(),
bmp.readPressure() / 100.0, bmp.readAltitude(SEA_LEVEL_HPA));
delay(2000);
}
Needs the Adafruit BMP280 library. Compiled for ESP32-S3 with arduino-esp32 3.x. Not yet tested by us on a physical sensor. Change the pins to match your board.
On a display
Read the value in your sketch and pass it to a label, or send it over MQTT and show it with an MQTT value in the editor.
Design a display for BMP280Boards with a ready connector
Only boards whose connectors we have surveyed. Others may still work on free GPIOs.
| Elecrow CrowPanel ESP32 HMI 2.4" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32 HMI 2.8" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32 HMI 3.5" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32-S3 HMI 5.0" | I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18) |
| Elecrow CrowPanel ESP32-S3 HMI 7.0" | I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18) |
| LilyGO T-Display-S3-Pro 2.33" | QWIIC RIGHT: SDA 5, SCL 6I2C only — same bus as the touch, the PMU (SY6970) and the light sensor |
| M5Stack AtomS3 0.85" | Bottom I2C pins: SDA 38, SCL 39Same I2C bus as the built-in IMU (MPU6886, 0x68) |
| Makerfabs MaTouch ESP32-S3 Rotary IPS 2.1 Round | Mabee I2C (J1): SDA 17, SCL 18Same I2C bus as the touch controller (CST826) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT 4.3" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 5.0" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 7.0" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Sunton ESP32-4827S043R/C 4.3" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S043C 4.3" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S050C 5.0" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S070C 7.0" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Waveshare ESP32-S3 Touch LCD 2.1" round | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3 Touch LCD 2.8" | I2C connector: SDA 11, SCL 10Same I2C bus as the RTC and the IMU (0x51, 0x6B, 0x7E taken) — the touch has its own bus |
| Waveshare ESP32-S3 Touch LCD 2.8" Type B | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3-Touch-LCD-2.8C | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3-LCD-7B | I2C connector (H1): SDA 8, SCL 9Same I2C bus as the touch controller (GT911) and the IO expander (CH422G) |
Good to know
- No humidity output. For that, use a BME280.
- Sellers mix up BMP280 and BME280 boards.
- Altitude needs today's sea-level pressure.
- Heat from nearby parts raises the temperature reading.
What it is good for
- Weather trend displays
- Relative height changes
- Pressure logging
FAQ
What is the difference between BMP280 and BME280?
The BME280 also measures humidity. The BMP280 does not.
Why is the altitude wrong?
The calculation needs the current sea-level pressure for your location.
How do I tell which chip I have?
Read the chip ID: 0x58 is a BMP280 and 0x60 a BME280.
Sources
Related parts
Use this information at your own risk. It is for general guidance only: the example code compiles, but it has not been tested on every part, and modules differ between sellers. Check the manufacturer's data before you build. Product names belong to their owners, and LCD Ultra Pro is not affiliated with them. See our Terms.