It is that time again! SparkFun Electronics will be closed Friday, January 13th for our annual inventory day. Please keep in mind that any orders placed after 2PM (Mountain Time) on Thursday, January 12th will not ship or be prepared for local pickup until we open for normal operations on Monday, January 16th. In addition, tours will resume on Friday, January 20th. Thank you for your patience!

Creative Commons images are CC BY-NC-SA 3.0

Description: The SparkFun BME280 Atmospheric Sensor Breakout is the easy way to measure barometric pressure, humidity, and temperature readings all without taking up too much space. Basically, anything you need to know about atmospheric conditions you can find out from this tiny breakout. The BME280 Breakout has been design to be used in indoor/outdoor navigation, weather forecasting, home automation, and even personal health and wellness monitoring.

The on-board BME280 sensor measures atmospheric pressure from 30kPa to 110kPa as well as relative humidity and temperature. The breakout provides a 3.3V SPI interface, a 5V tolerant I2C interface (with pull-up resistors to 3.3V), takes measurements at less than 1mA and idles less than 5µA. The BME280 Breakout board has 10 pins, but no more than six are used at a single time. The left side of the board provide power, ground, and I2C pins. The remaining pins which provide SPI functionality and have another power and ground, are broken out on the other side.

Note: The breakout does NOT have headers installed and will need to purchased and soldered on yourself. Check the Recommended Products section below for the type of headers we use in the Hookup Guide!


  • Operation Voltage: 3.3V
  • I2C & SPI Communications Interface
  • Temp Range: -40C to 85C
  • Humidity Range: 0 - 100% RH, =-3% from 20-80%
  • Pressure Range: 30,000Pa to 110,000Pa, relative accuracy of 12Pa, absolute accuracy of 100Pa
  • Altitude Range: 0 to 30,000 ft (9.2 km), relative accuracy of 3.3 ft (1 m) at sea level, 6.6 (2 m) at 30,000 ft.
  • Incredibly Small


Recommended Products

Customer Comments

  • Hey everyone. There’s a few comments here that have to do with the sensor being a few degrees high and I wanted to discuss it.

    Specified Accuracy

    I looked up datasheets on the various sensors this is being compared to. Here’s the take-away:

    TMP36: Specified accurate to +-2 degrees C DHT11: Specified +-2 degrees C MPL3115A2: +-1 degree C at 25C +-3 degrees C over full range BME280: +-0.5 degree C at 25C +-1 degrees C over full range

    So, by manufacturer specification the BME280 is the most accurate.

    Implementation Impact

    Some of the discussion says that maybe the location in the circuit effects the temperature. Noting that self-heating could possibly effect the temperature, I devised a quick experiment to test this.

    • Two boards are configured in I2C, on the same bus. One has a fan to circulate room air.
    • One board is configured as SPI and overvolted to 5.0 V (I connected to uno-type with no level shifter)
    • Two boards are left out as control
    • Temperatures measured by the sensor and by a this IR Thermometer. The samples were measured up against the face of the IR hole, centered.

    Here’s the test data:

    Experiment photo showing EUTs


    1. The BME spec. is tighter than most of the complaints' test thermometer.
    2. Implementation had <1 deg. C impact on the various sensors. In any of these configurations, the IR thermometer read very similarly. This is surprising for the over-volt case where the extra voltage could result in extra self-heating in the sensor, but it doesn’t measure as such.
    3. Over-volting the SPI bus causes an incorrectly high reading of about 3 degrees
    4. (not shown in data) Returning sample 3 to an appropriate 3.3 V bus restores correct operation
    5. Handling boards causes them to rise 2-5 degrees C. Thermal equalization of that difference takes about 5 minutes.


    • I can confirm, that readings seems to be high compared to other I2C sensors. Since all available BME280 libraries give similar results i assume, there could be a misinterpretation of calibration values or a not yet discovered problem with the datasheet. I set up a small test on 3.3V bus with readings all 15s.

      BME280 Temp: 22.94
      BMP180 Temp: 21.30
      HTU21D Temp: 21.55
      AM2321 Temp: 21.50
      BME280 Pres: 966.81 hPa
      BMP180 Pres: 968.24 hPa
      BME280 Hum: 46.13
      HTU21D Hum: 51.46
      AM2321 Hum: 49.70
  • These boards aren’t compatible with 5 volts. I had several sensors burn out due to being connected to I2C on a MEGA 2560 without level shifting before I figured this out. See the BME 280 absolute ratings in the datasheet… it states Vdd and Vddio maximum is 4.25V and interface pins maximum is Vddio + 0.3V.

  • Shadar / last month / 1

    Just a quick note on the library. The hookup guide says that pressure is returned in kilopascals, but unless I’m deep under the ocean and nobody told me, it’s just returning pascals.

  • I love how easy this device was to set up, and the built-in I2C/SPI support, but I, too, am finding the temp readings from this device to be consistently high, sometimes by as much as 9 degrees F. I have it connected via I2C directly to an ESP8266 thing (WRL13231), with the BME280 board hanging off the edge so it doesn’t pick up heat from the thing, and I have two other thermometers sitting right next to it. The temps all rise and fall together, but the BME280 is between 5 and 9 degrees (F) high. The thing should be delivering 3.3v, so I don’t think it’s over voltage, and it’s in a fairly breezy outdoor location so I also don’t think it’s surrounded by heated air. This is so far off I’m tempted just to call it defective or miscalibrated and order a replacement. It’s a shame we can’t somehow fix the calibration by taking known temps.

  • Is there a Particle Spark library for this module?

  • Could be a very simple question. Is this water resistant? I have a PVC rain tower. I want to know what the RH is inside. Obviously the board will get wet. I will use heat shrink on the wiring.

    • The datasheet says condensation is allowed, but I don’t know if immersion will damage the sensor (or the breakout board).

  • Is there a Frizting file available for this? I can’t find one, but it looks like the Hook-Up guide is using one.

  • I got this breakout board (from a reseller in Germany) but all values are way off. Even the temperature shown by the BME280 is about 3 degrees Celsius higher than the real temperature and altitude is about 130 metres to low. Is there any calibration necessary before first use? I could not find any method for this in the library.

    • Accuracy should be about +/- 0.5 degrees C, so that’s a little odd. Calibration happens from a set of factory programmed registers that the library reads out, then uses for calculations. The barometric readings are highly dependent on temperature, so both being off at the same time isn’t so surprising.

      The I2C_ReadAllData sketch displays the calibration words at the start. Even if you are using SPI (just change the .settings.commInterface and .settings.chipSelectPin lines), can you please send me the concatenated calibration words listing?

      Mine looks like this:

      Displaying concatenated calibration words
      dig_T1, uint16: 27974
      dig_T2, int16: 26594
      dig_T3, int16: 50
      dig_P1, uint16: 38207
      dig_P2, int16: -10702
      dig_P3, int16: 3024
      dig_P4, int16: 7917
      dig_P5, int16: -118
      dig_P6, int16: -7
      dig_P7, int16: 9900
      dig_P8, int16: -10230
      dig_P9, int16: 4285
      dig_H1, uint8: 75
      dig_H2, int16: 358
      dig_H3, uint8: 0
      dig_H4, int16: 328
      dig_H5, int16: 0
      dig_H6, uint8: 30

      Note: start code with 4 spaces for our markdown formatting.

      • Chiming in because I have the same problem! Consistently reading 2.5C to 3C warmer than actual (as measured with a TMP36, and a wall thermometer.)

        Temp from my TMP36 sensor: 21.29C

        Temp from BME280: 23.94C

        Calibration words and first reading from BME280:

        Displaying concatenated calibration words
        dig_T1, uint16: 28229
        dig_T2, int16: 26576
        dig_T3, int16: 50
        dig_P1, uint16: 38175
        dig_P2, int16: -10690
        dig_P3, int16: 3024
        dig_P4, int16: 3748
        dig_P5, int16: 3
        dig_P6, int16: -7
        dig_P7, int16: 9900
        dig_P8, int16: -10230
        dig_P9, int16: 4285
        dig_H1, uint8: 75
        dig_H2, int16: 356
        dig_H3, uint8: 0
        dig_H4, int16: 333
        dig_H5, int16: 0
        dig_H6, uint8: 30
        Temperature: 23.94 degrees C
        Temperature: 75.07 degrees F
        Pressure: 96380.00 Pa
        Altitude: 434.37m
        Altitude: 1425.11ft
        %RH: 25.00 %
      • Hi Taylor, thanks for your reply, my calibration words are like this:

        Displaying concatenated calibration words
        dig_T1, uint16: 28196
        dig_T2, int16: 26476
        dig_T3, int16: 50
        dig_P1, uint16: 37109
        dig_P2, int16: -10699
        dig_P3, int16: 3024
        dig_P4, int16: 5537
        dig_P5, int16: 2
        dig_P6, int16: -7
        dig_P7, int16: 9900
        dig_P8, int16: -10230
        dig_P9, int16: 4285
        dig_H1, uint8: 75
        dig_H2, int16: 352
        dig_H3, uint8: 0
        dig_H4, int16: 344
        dig_H5, int16: 0
        dig_H6, uint8: 30

        Today the temp is only about 2,5 degrees too high (measured with a DHT11 and a MPL3115A2) and altitude about 110m too low. Very strange. I just removed all other components from the breadboard, but still the same…

        • I also have one of these that is giving temperature readings that are 4.25 degrees too high.

          Displaying concatenated calibration words
          dig_T1, uint16: 28281
          dig_T2, int16: 26448
          dig_T3, int16: 50
          dig_P1, uint16: 36891
          dig_P2, int16: -10832
          dig_P3, int16: 3024
          dig_P4, int16: 6098
          dig_P5, int16: 80
          dig_P6, int16: -7
          dig_P7, int16: 9900
          dig_P8, int16: -10230
          dig_P9, int16: 4285
          dig_H1, uint8: 75
          dig_H2, int16: 356
          dig_H3, uint8: 0
          dig_H4, int16: 333
          dig_H5, int16: 0
          dig_H6, uint8: 30

          I’m reading 28.40 degrees C instead of 24.7 (inside temperature shown on a weather station console)

          However that’s when plugged into headers on an ESP8266 Thing. When I instead place it at the end of a 30cm cable, the temperature difference comes down to within half a degree of my other reading.

          Temperature: 24.95 degrees C
          Temperature: 76.91 degrees F
          Pressure: 101919.00 Pa
          Altitude: -51.02m
          Altitude: -167.37ft
          %RH: 46.00 %

          My elevation is about 30m above see level, not 50m beneath it. However the pressure at sea level at the moment is not 1013.25 hPa as the library assumes. Adafruit’s BME280 library takes the unknown current sea level pressure as an input to the altitude function.

  • And what about degradation due to permanent humidity (for example in a bathroom)? What do we need to do to protect this Shield against permanent humidity ? Other Humidity sensors (DHT…) have a life time less than a year before beginning to produce incoherent measurements. The other sensor RB-Dfr-460 seems designed to better resist against moisture in time. In other words , how to use it in a sustainable solution for at least 5 years ?

  • i know it depends on the part the board is built around, but it kills me that every i2c breakout has the pins in a different order.. it’d be so nice to plunk a bunch of them on some stripboard, or to be able to make up a bunch of standard cable assemblies

    • We have started to use a standard on all new boards (which this should follow) because we got sick of the same thing around here. Sometimes you will see additional pins as well, but SCL, SDA, VCC, and GND should all be in the same order on our new boards. We can’t force everyone to use our standard, but I have a feeling people are starting to come up with their own anyway.

    • Our friends over at Adafruit seem to have gotten to a standard ordering: Vin (i.e., +5V), 3.3V, GND, SDA, SCL – most of their boards include a regulator, and are 3.3V logic. (I think I got the order correct, but check the Adafruit website.)

  • Why doesn’t this come with the headers? Even when I order stuff from AliExpress it comes with headers (not pre-soldered of course), and that’s like the sketchiest place to order electronics from. I love the idea of this breakout board, but when I have to buy two separate items just to get one physical sensor working somethings wrong…

    • If everything came with headers I’d have a heap of unused headers from soldering wires to my boards. The argument goes both ways and I like the option of getting to choose between headers and wires without clogging up my already overloaded heap ‘o crap.

      • TheBurrito is completely correct: The main reason why there are no headers per-soldered onto this board is so that you, the end user, get the choice on what sort of connection you want. There are multiple types of headers to choose from, different wires (with and without terminated connectors), and it is a lot easier to solder something on than it is to de-solder that same thing off.

        If you take a look at our past in-house assemblies you’ll notice that most, if not all, of them are sold without headers for this same exact reason. So rest assured that nothing is wrong, we just don’t want to make decisions for you that you may not agree with, however, we are sorry for the confusion in this matter. :)

        • Thank you for that. As a user looking at this I want to be able to decide how it is hooked up. Also I have a bunch of headers I can just use anyways.

      • I, too, agree. I’m looking at having this on one end of a “flat flexible cable” (might try something like a Raspberry Pi camera cable, or might end up using two of the “flat coax” cables) to put the sensor on the outside of a north-facing window and the computer on the inside of the same window. (Yeah, I’ll have to do some weatherproofing, but details, details.) Or maybe I can cobble up a 4-trace cable with some plastic sheet and copper tape. Nice thing about I2C is I only need 4 conductors (pwr, gnd, SDA, SCL)!

Customer Reviews

4.6 out of 5

Based on 5 ratings:

5 star
4 star
3 star
2 star
1 star

1 of 1 found this helpful:

Great sensor, very easy to hook up and integrate in project!

I had no difficulty wiring the bme280 to my raspberry PI 3. Just used the python libraries to read the sensor. Highly recommend it!

1 of 1 found this helpful:

Makes a great accessory to my ESP8266 Thing

The BME280 worked right out of the box and appears to be very accurate. I use it on my weather station and the readings match the others in my area on the wunderground.com. The pinout of the i2c communications header is compatible with the ESP8266 Thing so all I had to do was plug it into the socket I had installed on the Thing, load the SparkFun BME280 Arduino library, and I was up and running.

3 of 5 found this helpful:

wow! great resolution and works effortlessly

I connected the power and ground and the I2C interfacce. It worked out of the box with my Arduino redboard using the code I downloaded from the Sparkfun tutorial.

Then I modified the code to take successive readings of the temp, humidity and pressure channels as fast as possible, average them and print the results ever few seconds.

This dramatically reduced the noise and increased the resolution. I can track 0.1 degC changes, 1 foot elevation changes and about 0.5% rh changes.

Would have been truely effortless and instantly plug and play if the board came with a ribbon cable soldered in with pins on the other end to plug into the redboard. I had to take an additional 5 min soldering on the wires.

1 of 2 found this helpful:

Reliable, accurate, small

Sensor seems to be fairly accurate, can be used via I2C or SPI, is fairly small, and works reliably. I couldn’t have asked for more in an atmospheric sensor.

0 of 1 found this helpful:

Atmospheric Sensor

By the moment, I do only a little test over this sensor.

Normally Sparkfun gives us good information and examples for Arduino users.

But I normally use PIC16 microcontrollers and do my programs in assembler. Several elements have sufficient information for me; but others require some reversal engineering from the Arduino examples to discover how to use it. Then I prepare my programs.

In the future, it is possible to publish some information about the use of the devices without predefined libraries?

Related Tutorials

SparkFun BME280 Breakout Hookup Guide

October 22, 2015

A guide for connecting the BEM280 sensor to a microcontroller, and for using the Sparkfun Arduino library.

Photon Remote Water Level Sensor

June 2, 2016

Learn how to build a remote water level sensor for a water storage tank and how to automate a pump based off the readings!

Logging Data to Google Sheets with the Tessel 2

December 12, 2016

This project covers how to log data to Google Sheets two ways: using IFTTT with a web connection or a USB pen drive and "sneakernet" without.