Guide for BME280 Sensor with Arduino (Pressure, Temperature, Humidity)

This guide shows how to use the BME280 sensor module with Arduino to read pressure, temperature, humidity and estimate altitude. We’ll show you how to wire the sensor, install the required libraries, and write a simple sketch to display the sensor readings.

Guide for BME280 Sensor with Arduino Pressure, Temperature, and Humidity

You might also like reading other BME280 guides:

Introducing BME280 Sensor Module

The BME280 sensor module reads barometric pressure, temperature, and humidity. Because pressure changes with altitude, you can also estimate altitude. There are several versions of this sensor module. The BME280 sensor uses I2C or SPI communication protocol to exchange data with a microcontroller.

We’re using the module illustrated in the figure below.

BME280 Sensor Module reads pressure, temperature, and humidity

This sensor communicates using I2C communication protocol, so the wiring is very simple. You connect the BME280 sensor to the Arduino Uno I2C pins as shown in the table below:

BME280Arduino
Vin5V
GNDGND
SCLA5
SDAA4

There are other versions of this sensor that can use either SPI or I2C communication protocols, like the module shown in the next figure:

BME280 with SPI and I2C

If you’re using one of these sensors, to use I2C communication protocol, use the following pins:

BME280Arduino
SCK (SCL Pin) A5
SDI (SDA pin) A4

If you use SPI communication protocol, you need to use the following pins:

BME280Arduino
SCK (SPI Clock) Pin 13
SDO (MISO) Pin 12
SDI (MOSI) Pin 11
CS (Chip Select) Pin 10

Parts Required

To complete this tutorial you need the following parts:

You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!

Schematic

Wire the BME280 sensor to your Arduino board as shown in the following schematic diagram.

Arduino BME280 Wiring Schematic Diagram

Installing the BME280 library

To get readings from the BME280 sensor module you need to use the Adafruit_BME280 library. Follow the next steps to install the library in your Arduino IDE:

Open your Arduino IDE and go to Sketch Include Library > Manage Libraries. The Library Manager should open.

Search for “adafruit bme280 ” on the Search box and install the library.

Installing BME280 library in Arduino IDE

Installing the Adafruit_Sensor library

To use the BME280 library, you also need to install the Adafruit_Sensor library. Follow the next steps to install the library in your Arduino IDE:

Go to Sketch Include Library > Manage Libraries and type “Adafruit Unified Sensor” in the search box. Scroll all the way down to find the library and install it.

Installing Adafruit Unified Sensor driver library

After installing the libraries, restart your Arduino IDE.

Reading Pressure, Temperature, and Humidity

To read pressure, temperature, and humidity we’ll use a sketch example from the library.

Arduino BME280 Guide Reading Temperature, Humidity, and Pressure Sketch

After installing the BME280 library, and the Adafruit_Sensor library, open the Arduino IDE and, go to File > Examples > Adafruit BME280 library > bme280 test.

/*
 * Complete Project Details https://randomnerdtutorials.com
*/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

unsigned long delayTime;

void setup() {
  Serial.begin(9600);
  Serial.println(F("BME280 test"));

  bool status;
  
  // default settings
  // (you can also pass in a Wire library object like &Wire2)
  status = bme.begin();  
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  
  Serial.println("-- Default Test --");
  delayTime = 1000;

  Serial.println();
}


void loop() { 
  printValues();
  delay(delayTime);
}


void printValues() {
  Serial.print("Temperature = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");
  
  // Convert temperature to Fahrenheit
  /*Serial.print("Temperature = ");
  Serial.print(1.8 * bme.readTemperature() + 32);
  Serial.println(" *F");*/
  
  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");
  
  Serial.print("Approx. Altitude = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");
  
  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");
  
  Serial.println();
}

View raw code

How the Code Works

Continue reading this section to learn how the code works, or skip to the “Demonstration” section.

Libraries

The code starts by including the needed libraries: the wire library to use I2C, and the Adafruit_Sensor and Adafruit_BME280 libraries to interface with the BME280 sensor.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

SPI communication

As we’re going to use I2C communication, the following lines that define the SPI pins are commented:

/*#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10*/

Sea level pressure

A variable called SEALEVELPRESSURE_HPA is created.

#define SEALEVELPRESSURE_HPA (1013.25)

This variable saves the pressure at the sea level in hectopascal (is equivalent to milibar). This variable is used to estimate the altitude for a given pressure by comparing it with the sea level pressure. This example uses the default value, but for more accurate results, replace the value with the current sea level pressure at your location.

I2C

This example uses I2C communication protocol by default. As you can see, you just need to create an Adafruit_BME280 object called bme.

Adafruit_BME280 bme; // I2C

To use SPI, you need to comment this previous line and uncomment one of the following lines.

//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

setup()

In the setup(), start a serial communication:

Serial.begin(9600);

And the sensor is initialized:

status = bme.begin(); 
if (!status) {
  Serial.println("Could not find a valid BME280 sensor, check wiring!");
  while (1);
}

Note: when testing the sensor, if you can’t get any sensor readings, you may need to find your BME280 sensor I2C address. With the BME280 wired to your Arduino, run this I2C scanner sketch to check the address of your sensor. Then, pass the address to the begin() method.

Printing values

In the loop(), the printValues() function reads the values from the BME280 and prints the results in the Serial Monitor.

void loop() { 
  printValues();
  delay(delayTime);
}

Reading temperature, humidity, pressure, and estimate altitude is as simple as using the following methods on the bme object:

  • bme.readTemperature() – reads temperature in Celsius;
  • bme.readHumidity() – reads absolute humidity;
  • bme.readPressure() – reads pressure in hPa (hectoPascal = millibar);
  • bme.readAltitude(SEALEVELPRESSURE_HPA) – estimates altitude in meters based on the pressure at the sea level.

Demonstration

Arduino BME280 Read Temperature, Humidity, and Pressure Sketch

Upload the code to your Arduino Board.

Upload Arduino Sketch for BME280 Sensor

Open the Serial Monitor at a baud rate of 9600.

Upload Arduino Sketch for BME280 Sensor

You should see the readings displayed on the Serial Monitor.

Arduino Sketch for BME280 Sensor Demonstration Serial Monitor

Wrapping Up

The BME280 provides an easy and inexpensive way to get pressure, temperature and humidity readings. The sensor communicates via I2C communication protocol, which means that wiring is very simple, you just need to connect the sensor to the Arduino I2C pins.

Writing the code to get the sensor readings is also very straightforward thanks to the BME280_Adafruit library. You just need to use the readTemperature(), readHumidity() and readPressure() methods. You can also estimate altitude using the readAltitude() method.

We have guides for other sensors and modules with the Arduino that you may find useful:

If you want to learn more about Arduino, take a look at our resources:

Thanks for reading.


Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »

Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »


Enjoyed this project? Stay updated by subscribing our weekly newsletter!

9 thoughts on “Guide for BME280 Sensor with Arduino (Pressure, Temperature, Humidity)”

  1. Would be great to see this BME280 on an ESP 01 for outdoor and read to your mobile device or better to another indoor ESP8266 with LCD 🙂 Thanks for the great work. You guys are awesome. Thumbs up!

  2. Excellent article. There is a similar Bosch sensor called the BMP280 which has Pressure/Temperature but does not include humidity. Many ebay sellers confuse the two and sell the BMP280 as the BME280. There are 3 ways to identify the BME280 :
    1. Shape – the metal BME sensor is square; the BMP is rectangular.
    2. Location of Vent Hole – On LHS for BME; or RHS for BMP.
    3. Code – the BME has P in the code marking; the BMP has K in the code.
    Also, the BME boards are often 3-4 times the price of the BMP boards.
    To avoid frustration, check that the sensor you have bought is the BME280 and not the BMP280.

  3. It would be useful to know how to find the current sea level air pressure for a location.

    Hoe do I do it?

    • Duncan, You need the qnh value for your nearest aerodrome

      Here is mine (1015hpa)

      skybrary.aero/index.php/EGNX

      • My point was that Rui should show a method in the tutorial, not just leave it hanging in mid air…

        Thanks

    • Hi Duncam.
      I think it depends on where you live.
      Here in Portugal, I cant get the pressure from IPMA website (portuguese meteorology website).
      Try searching your country + sea level pressure on google and see the results.
      Regards,
      Sara

  4. Interesting post.
    With the BME280 it is important to realise that by default it is in automode, taking continuous readings. This will warm up the chip, affecting the read temperature.
    It is better to use the BME in “Forced mode” and to set the sampling rate:
    bme.setSampling(Adafruit_BME280::MODE_FORCED,
    Adafruit_BME280::SAMPLING_X1, // temperature
    Adafruit_BME280::SAMPLING_X1, // pressure
    Adafruit_BME280::SAMPLING_X1, // humidity
    Adafruit_BME280::FILTER_OFF );

Leave a Reply to Sara Santos Cancel reply

Download our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.