ESP8266 and bme280 temperature sensor example

The BME280 is a great new chip which was originally designed for the next generation of smartphones. It is made up of a very accurate pressure sensor and an associated temperature sensor which helps calibrate the pressure readings.

And just for fun they threw in a pretty solid humidity sensor in there as well! So with an I2C connection you have access to enough weather data to make some pretty good predictions for your local area.

Or you can just use the pressure sensor with it’s abililty to discern the difference in 7.5cm in altitude.

The chip contains smarts to smooth out measurements

Parameter Technical data
Operation range
Pressure: 300…1100 hPa
Temperature: -40…85°C
Supply voltage VDDIO
Supply voltage VDD
1.2 … 3.6 V
1.71 … 3.6 V
Interface
I²C and SPI
Average current consumption (typ.) (1Hz data refresh rate)
1.8 μA @ 1 Hz (H, T)
2.8 μA @ 1 Hz (P, T)
3.6 μA @ 1 Hz (H, P, T)
T = temperature
Average current consumption in sleep mode
0.1 μA
Humidity sensor
Response time (τ63%)
Accuracy tolerance
Hysteresis
1 s
±3% relative humidity
≤2% relative humidity
Pressure sensor
RMS Noise
Sensitivity Error

Temperature coefficient offset

0.2Pa (equiv. to 1.7cm)
±0.25% (equiv. to 1m at 400m height change)

±1.5Pa/K (equiv. to ±12.6cm at 1 °C temperature change)

Parts List

Here are the parts I used

 

Name Links
Wemos Mini
BME280
Connecting cables

Connection:

vin—————-3v3
GND————–GND
SCL—————-D1
SDA—————-D2

Just like this

esp8266 and bme280
esp8266 and bme280

 

Code

No libraries required

 

#include<Wire.h>

// BME280 I2C address is 0x76(108)
#define Addr 0x76

void setup()
{
// Initialise I2C communication as MASTER
Wire.begin();
// Initialise Serial communication, set baud rate = 9600
Serial.begin(9600);
}

void loop()
{
unsigned int b1[24];
unsigned int data[8];
unsigned int dig_H1 = 0;
for(int i = 0; i < 24; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select data register
Wire.write((136+i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr, 1);

// Read 24 bytes of data
if(Wire.available() == 1)
{
b1[i] = Wire.read();
}
}

// Convert the data
// temp coefficients
unsigned int dig_T1 = (b1[0] & 0xff) + ((b1[1] & 0xff) * 256);
int dig_T2 = b1[2] + (b1[3] * 256);
int dig_T3 = b1[4] + (b1[5] * 256);

// pressure coefficients
unsigned int dig_P1 = (b1[6] & 0xff) + ((b1[7] & 0xff ) * 256);
int dig_P2 = b1[8] + (b1[9] * 256);
int dig_P3 = b1[10] + (b1[11] * 256);
int dig_P4 = b1[12] + (b1[13] * 256);
int dig_P5 = b1[14] + (b1[15] * 256);
int dig_P6 = b1[16] + (b1[17] * 256);
int dig_P7 = b1[18] + (b1[19] * 256);
int dig_P8 = b1[20] + (b1[21] * 256);
int dig_P9 = b1[22] + (b1[23] * 256);

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select data register
Wire.write(161);
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr, 1);

// Read 1 byte of data
if(Wire.available() == 1)
{
dig_H1 = Wire.read();
}

for(int i = 0; i < 7; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select data register
Wire.write((225+i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr, 1);

// Read 7 bytes of data
if(Wire.available() == 1)
{
b1[i] = Wire.read();
}
}

// Convert the data
// humidity coefficients
int dig_H2 = b1[0] + (b1[1] * 256);
unsigned int dig_H3 = b1[2] & 0xFF ;
int dig_H4 = (b1[3] * 16) + (b1[4] & 0xF);
int dig_H5 = (b1[4] / 16) + (b1[5] * 16);
int dig_H6 = b1[6];

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select control humidity register
Wire.write(0xF2);
// Humidity over sampling rate = 1
Wire.write(0x01);
// Stop I2C Transmission
Wire.endTransmission();

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select control measurement register
Wire.write(0xF4);
// Normal mode, temp and pressure over sampling rate = 1
Wire.write(0x27);
// Stop I2C Transmission
Wire.endTransmission();

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select config register
Wire.write(0xF5);
// Stand_by time = 1000ms
Wire.write(0xA0);
// Stop I2C Transmission
Wire.endTransmission();

for(int i = 0; i < 8; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select data register
Wire.write((247+i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr, 1);

// Read 8 bytes of data
if(Wire.available() == 1)
{
data[i] = Wire.read();
}
}

// Convert pressure and temperature data to 19-bits
long adc_p = (((long)(data[0] & 0xFF) * 65536) + ((long)(data[1] & 0xFF) * 256) + (long)(data[2] & 0xF0)) / 16;
long adc_t = (((long)(data[3] & 0xFF) * 65536) + ((long)(data[4] & 0xFF) * 256) + (long)(data[5] & 0xF0)) / 16;
// Convert the humidity data
long adc_h = ((long)(data[6] & 0xFF) * 256 + (long)(data[7] & 0xFF));

// Temperature offset calculations
double var1 = (((double)adc_t) / 16384.0 - ((double)dig_T1) / 1024.0) * ((double)dig_T2);
double var2 = ((((double)adc_t) / 131072.0 - ((double)dig_T1) / 8192.0) *
(((double)adc_t)/131072.0 - ((double)dig_T1)/8192.0)) * ((double)dig_T3);
double t_fine = (long)(var1 + var2);
double cTemp = (var1 + var2) / 5120.0;
double fTemp = cTemp * 1.8 + 32;

// Pressure offset calculations
var1 = ((double)t_fine / 2.0) - 64000.0;
var2 = var1 * var1 * ((double)dig_P6) / 32768.0;
var2 = var2 + var1 * ((double)dig_P5) * 2.0;
var2 = (var2 / 4.0) + (((double)dig_P4) * 65536.0);
var1 = (((double) dig_P3) * var1 * var1 / 524288.0 + ((double) dig_P2) * var1) / 524288.0;
var1 = (1.0 + var1 / 32768.0) * ((double)dig_P1);
double p = 1048576.0 - (double)adc_p;
p = (p - (var2 / 4096.0)) * 6250.0 / var1;
var1 = ((double) dig_P9) * p * p / 2147483648.0;
var2 = p * ((double) dig_P8) / 32768.0;
double pressure = (p + (var1 + var2 + ((double)dig_P7)) / 16.0) / 100;

// Humidity offset calculations
double var_H = (((double)t_fine) - 76800.0);
var_H = (adc_h - (dig_H4 * 64.0 + dig_H5 / 16384.0 * var_H)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * var_H * (1.0 + dig_H3 / 67108864.0 * var_H)));
double humidity = var_H * (1.0 - dig_H1 * var_H / 524288.0);
if(humidity > 100.0)
{
humidity = 100.0;
}
else if(humidity < 0.0)
{
humidity = 0.0;
}

// Output data to serial monitor
Serial.print("Temperature in Celsius : ");
Serial.print(cTemp);
Serial.println(" C");
Serial.print("Temperature in Fahrenheit : ");
Serial.print(fTemp);
Serial.println(" F");
Serial.print("Pressure : ");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("Relative Humidity : ");
Serial.print(humidity);
Serial.println(" RH");
delay(1000);
}

 

 

Output

In the serial monitor you should see something along these lines

Temperature in Celsius : 22.10 C
Temperature in Fahrenheit : 71.77 F
Pressure : 1162.21 hPa
Relative Humidity : 0.00 RH
Temperature in Celsius : 27.18 C
Temperature in Fahrenheit : 80.93 F
Pressure : 1110.28 hPa
Relative Humidity : 0.00 RH
Temperature in Celsius : 28.71 C
Temperature in Fahrenheit : 83.67 F
Pressure : 1080.85 hPa
Relative Humidity : 0.00 RH
Temperature in Celsius : 29.91 C
Temperature in Fahrenheit : 85.84 F
Pressure : 1053.26 hPa
Relative Humidity : 0.00 RH

 

Links

https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf

4 COMMENTS

  1. Thanks for your Code. It works great. I am searching for days for a working sketch for my Wemos mini. The Adafruit library doesn’t work.

    But why the humidity is 0 in your sketch??

    Thanks a lot.

    Christian

  2. Adding to the last comment by @Christian: for me the sketch runs but it appears the readings are all off. my humidity also reads 0, but in addition, the temperature is about 10 deg F higher than it should be. IE: reading 83.33 when a DHT22 reads 72.4. Is there a calibration proceedure for this sensor?

LEAVE A REPLY

Please enter your comment!
Please enter your name here