About BME280 - temperature, humidity and pressure sensor
Bosch BME280 it's a digital humidity, pressure and temperature sensor. Main measurement characteristics:
- ambient range for operation -40 ~ +85C, 0%-100% r.H., 300-1100hPa
- humidity accuracy +-3%
- absolute temperature (0-65C) accuracy +-1C
- absolute/relative pressure accuracy +-0.6hPa/+-0.12hPa
More info on: BME280 datasheet
In June 2019 we've realeased 6 new environmental and air quality sensors, including Bosch Sensortec BME280, all being part of the s-Sense I2C sensor breakout family.
HINT: Do not be confused! BMP280 sensor (temperature+pressure - no humidity!) and BMP280 sensor (temperature+pressure+humidity) seems to be similar, but: the first one is a little bit smaller and on s-Sense PCB bottom you will find the sensor type marking.
s-Sense BME280 sensor breakout by itbrainpower.net


PN: SS-BME280#I2C SKU: ITBP-6002 BME280 I2C sensor breakout info
Next, let's kickstart with BME280 sensor I2C breakout - around 10-15 minutes.
Arduino BME280 sensor hardware integration (wiring)
First, identify if your Arduino it's 5V or 3.3V compliant!
The BME280 I2C sensor breakout it's shipped in default auto 3-5V compliant configuration. In a nut shell, wire as bellow:
| BME280 breakout | Arduino 5V [Eg.: UNO] | Arduino 3.3V [Eg.: Zero] |
|---|---|---|
| Vin PAD | 5V | 3.3V |
| Vdd PAD (3V3) | do not connect | do not connect |
| SDA PAD | SDA | SDA |
| SCL PAD | SCL | SCL |
| GND PAD | GND | GND |
HINT, for some ARDUINO boards:
* SDA (Serial Data) --> A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro
* SCK (Serial Clock) --> A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro
Bellow, sensor wiring example with xyz-mIoT shield [AT SAMD21G, 3.3V compliant, with or without modems]:
Arduino BME280 sensor software
a. download BME280/BMP280 Arduino library from: here.
b. unzip the library and install in Arduino libraries folder. Restart Arduino.
c. Make a folder named "ssense_BMx280_example".
Copy the code bellow, paste it one new file and save the file as "ssense_BMx280_example.ino" in the folder created in previously or, you may
download it from here (right click & save as): BME280 / BMP280 - read sensor data Arduino code
| 1 | /* s-Sense BME280 I2C / s-Sense BMP280 I2C sensor breakout example - v1.0/20190524. |
| 2 | * |
| 3 | * Compatible with: |
| 4 | * s-Sense BME280 I2C sensor breakout - temperature, humidity and pressure - [PN: SS-BME280#I2C, SKU: ITBP-6002], info https://itbrainpower.net/sensors/BME280-TEMPERATURE-HUMIDITY-PRESSURE-I2C-sensor-breakout |
| 5 | * s-Sense BMP280 I2C sensor breakout - temperature and pressure - [PN: SS-BMP280#I2C, SKU: ITBP-6001], info https://itbrainpower.net/sensors/BMP280-TEMPERATURE-HUMIDITY-I2C-sensor-breakout |
| 6 | * |
| 7 | * This code shows how to use predefined recommended settings from Bosch for the BME280/BMP280 environmental sensor. Read temperature, |
| 8 | * humidity (unavailable for BMP280) and pressure (pulling at 1sec) - code based on BME280-2.3.0 library originally written by Tyler Glenn |
| 9 | * and forked by Alex Shavlovsky. Some part of code was written by Brian McNoldy. |
| 10 | * Amazing work folks! |
| 11 | * |
| 12 | * We've just select the relevant functions, add some variables, functions and fuctionalities. |
| 13 | * |
| 14 | * |
| 15 | * Mandatory wiring: |
| 16 | * Common for 3.3V and 5V Arduino boards: |
| 17 | * sensor I2C SDA <------> Arduino I2C SDA |
| 18 | * sensor I2C SCL <------> Arduino I2C SCL |
| 19 | * sensor GND <------> Arduino GND |
| 20 | * For Arduino 3.3V compatible: |
| 21 | * sensor Vin <------> Arduino 3.3V |
| 22 | * For Arduino 5V compatible: |
| 23 | * sensor Vin <------> Arduino 5V |
| 24 | * |
| 25 | * Leave other sensor PADS not connected. |
| 26 | * |
| 27 | * SPECIAL note for some ARDUINO boards: |
| 28 | * SDA (Serial Data) -> A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro |
| 29 | * SCK (Serial Clock) -> A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro |
| 30 | * |
| 31 | * WIRING WARNING: wrong wiring may damage your Arduino board MCU or your sensor! Double check what you've done. |
| 32 | * |
| 33 | * READ BME280 documentation! https://itbrainpower.net/sensors/BME280-TEMPERATURE-HUMIDITY-PRESSURE-I2C-sensor-breakout |
| 34 | * READ BMP280 documentation! https://itbrainpower.net/sensors/BMP280-TEMPERATURE-PRESSURE-I2C-sensor-breakout |
| 35 | * |
| 36 | * We ask you to use this SOFTWARE only in conjunction with s-Sense BME280 I2C or s-Sense BMP280 I2C sensor breakout usage. Modifications, derivates |
| 37 | * and redistribution of this SOFTWARE must include unmodified this notice. You can redistribute this SOFTWARE and/or modify it under the |
| 38 | * terms of this notice. |
| 39 | * |
| 40 | * This SOFTWARE is distributed is provide "AS IS" in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 41 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| 42 | * |
| 43 | * itbrainpower.net invests significant time and resources providing those how to and in design phase of our IoT products. |
| 44 | * Support us by purchasing our environmental and air quality sensors from https://itbrainpower.net/order#s-Sense |
| 45 | * |
| 46 | * |
| 47 | * Dragos Iosub, Bucharest 2019. |
| 48 | * https://itbrainpower.net |
| 49 | */ |
| 50 | |
| 51 | #define SERIAL_SPEED 19200 |
| 52 | |
| 53 | #include <sSense-BMx280I2C.h> |
| 54 | #include <Wire.h> |
| 55 | |
| 56 | |
| 57 | /* Recommended Modes - |
| 58 | Based on Bosch BME280I2C environmental sensor data sheet. |
| 59 | |
| 60 | Weather Monitoring : |
| 61 | forced mode, 1 sample/minute |
| 62 | pressure ×1, temperature ×1, humidity ×1, filter off |
| 63 | Current Consumption = 0.16 μA |
| 64 | RMS Noise = 3.3 Pa/30 cm, 0.07 %RH |
| 65 | Data Output Rate 1/60 Hz |
| 66 | |
| 67 | Humidity Sensing : |
| 68 | forced mode, 1 sample/second |
| 69 | pressure ×0, temperature ×1, humidity ×1, filter off |
| 70 | Current Consumption = 2.9 μA |
| 71 | RMS Noise = 0.07 %RH |
| 72 | Data Output Rate = 1 Hz |
| 73 | |
| 74 | Indoor Navigation : |
| 75 | normal mode, standby time = 0.5ms |
| 76 | pressure ×16, temperature ×2, humidity ×1, filter = x16 |
| 77 | Current Consumption = 633 μA |
| 78 | RMS Noise = 0.2 Pa/1.7 cm |
| 79 | Data Output Rate = 25Hz |
| 80 | Filter Bandwidth = 0.53 Hz |
| 81 | Response Time (75%) = 0.9 s |
| 82 | |
| 83 | |
| 84 | Gaming : |
| 85 | normal mode, standby time = 0.5ms |
| 86 | pressure ×4, temperature ×1, humidity ×0, filter = x16 |
| 87 | Current Consumption = 581 μA |
| 88 | RMS Noise = 0.3 Pa/2.5 cm |
| 89 | Data Output Rate = 83 Hz |
| 90 | Filter Bandwidth = 1.75 Hz |
| 91 | Response Time (75%) = 0.3 s |
| 92 | |
| 93 | */ |
| 94 | |
| 95 | BMx280I2C::Settings settings( |
| 96 | BME280::OSR_X1, |
| 97 | BME280::OSR_X1, |
| 98 | BME280::OSR_X1, |
| 99 | BME280::Mode_Forced, |
| 100 | BME280::StandbyTime_1000ms, |
| 101 | BME280::Filter_Off, |
| 102 | BME280::SpiEnable_False, |
| 103 | 0x76 // I2C address. I2C specific. |
| 104 | ); |
| 105 | |
| 106 | BMx280I2C ssenseBMx280(settings); |
| 107 | |
| 108 | ////////////////////////////////////////////////////////////////// |
| 109 | void setup() |
| 110 | { |
| 111 | delay(5000); |
| 112 | DebugPort.begin(SERIAL_SPEED); |
| 113 | |
| 114 | while(!DebugPort) {} // Wait |
| 115 | |
| 116 | DebugPort.println("s-Sense BME/BMP280 I2C sensor."); |
| 117 | |
| 118 | Wire.begin(); |
| 119 | while(!ssenseBMx280.begin()) |
| 120 | { |
| 121 | DebugPort.println("Could not find BME/BMP280 sensor!"); |
| 122 | delay(1000); |
| 123 | } |
| 124 | |
| 125 | switch(ssenseBMx280.chipModel()) |
| 126 | { |
| 127 | case BME280::ChipModel_BME280: |
| 128 | DebugPort.println("Found BME280 sensor! Humidity available."); |
| 129 | break; |
| 130 | case BME280::ChipModel_BMP280: |
| 131 | DebugPort.println("Found BMP280 sensor! No Humidity available."); |
| 132 | break; |
| 133 | default: |
| 134 | DebugPort.println("Found UNKNOWN sensor! Error!"); |
| 135 | } |
| 136 | |
| 137 | // Change some settings before using. |
| 138 | settings.tempOSR = BME280::OSR_X4; |
| 139 | |
| 140 | ssenseBMx280.setSettings(settings); |
| 141 | } |
| 142 | |
| 143 | ////////////////////////////////////////////////////////////////// |
| 144 | void loop() |
| 145 | { |
| 146 | printBMx280Data(&DebugPort); |
| 147 | delay(500); |
| 148 | } |
| 149 | |
| 150 | ////////////////////////////////////////////////////////////////// |
| 151 | void printBMx280Data |
| 152 | ( |
| 153 | Stream* client |
| 154 | ) |
| 155 | { |
| 156 | float temp(NAN), hum(NAN), pres(NAN); |
| 157 | |
| 158 | BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); |
| 159 | BME280::PresUnit presUnit(BME280::PresUnit_Pa); |
| 160 | |
| 161 | ssenseBMx280.read(pres, temp, hum, tempUnit, presUnit); |
| 162 | |
| 163 | client->print("Temp: "); |
| 164 | client->print(temp); |
| 165 | //client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F')); |
| 166 | client->print(" "+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F')); |
| 167 | client->print("\t\tHumidity: "); |
| 168 | client->print(hum); |
| 169 | client->print("% RH"); |
| 170 | client->print("\t\tPressure: "); |
| 171 | client->print(pres); |
| 172 | client->println(" Pa"); |
| 173 | |
| 174 | delay(1000); |
| 175 | } |
| 176 |
c'. The very same code it's available in Arduino "File-> Examples", under "ssense-BMx280" library.
d. Compile and upload the code to your Arduino shield. The sensor data may be seen on Arduino Serial Monitor (set to 19200bps).
What to do next:
- you may like to run the "ssense_BMx280_Environment_Calculations.ino" example - available in Arduino "File-> Examples", under "ssense-BMx280" library.
TUTORIAL PROVIDED WITHOUT ANY WARRANTY!!! USE IT AT YOUR OWN RISK!!!!