ESP8266 with BME280 using Arduino IDE (Pressure, Temperature, Humidity)

Содержание

This guide shows how to use the BME280 sensor module with the ESP8266 to read pressure, temperature, humidity and estimate altitude using Arduino IDE. The BME280 sensor uses I2C or SPI communication protocol to exchange data with a microcontroller.

ESP8266 with BME280 using Arduino IDE (Pressure, Temperature, Humidity)

We’ll show you how to wire the sensor to the ESP8266, install the required libraries, and write a simple sketch that displays the sensor readings. We’ll also build a web server example to display the latest pressure, temperature and humidity readings.

Before proceeding with this tutorial you should have the ESP8266 add-on installed in your Arduino IDE.

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. We’re using the module illustrated in the figure below.

BME280 Sensor I2C Module reads pressure, temperature, and humidity

This sensor communicates using I2C communication protocol, so the wiring is very simple. You can use the default ESP8266 I2C pins as shown in the following table:

BME280 ESP8266
Vin 3.3V
GND GND
SCL GPIO 5
SDA GPIO 4

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 Sensor Module SPI or I2C communication protocols

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

BME280 ESP8266
SCK (SCL Pin) GPIO 5
SDI (SDA pin) GPIO 4

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

BME280 ESP8266
SCK (SPI Clock) GPIO 14
SDO (MISO) GPIO 12
SDI (MOSI) GPIO 13
CS (Chip Select) GPIO 15

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 – ESP8266 with BME280 using I2C

We’re going to use I2C communication with the BME280 sensor module. For that, wire the sensor to the ESP8266 SDA and SCL pins, as shown in the following schematic diagram.

Schematic Wiring diagram ESP8266 with BME280 using I2C

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.

ESP8266 with BME280 I2C sensor module on Breadboard

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

We’ve made a few modifications to the sketch to make it fully compatible with the ESP8266.

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.

SPI communication

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

Note: if you’re using SPI communication, use the ESP8266 default SPI pins:

MOSI MISO CLK CS
GPIO 13 GPIO 12 GPIO 14 GPIO 15

Sea level pressure

A variable called SEALEVELPRESSURE_HPA is created.

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.

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

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

setup()

In the setup() , start a serial communication:

And initialize the sensor:

We initialize the sensor with the 0x76 address. In case you’re not getting sensor readings, check the I2C address of your sensor. With the BME280 sensor wired to your ESP8266, run this I2C scanner sketch to check the address of your sensor. Then, change the address if needed.

Printing values

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

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

Upload the code to your ESP8266, and open the Serial Monitor at a baud rate of 9600. Press the on-board RST button to run the code. You should see the readings displayed on the Serial Monitor.

Printing BME280 pressure, temperature and humidity readings with ESP32 in Arduino IDE Serial Monitor

ESP8266 Web Server with BME280 Sensor

The BME280 sensor measures temperature, humidity, and pressure. So, you can easily build a compact weather station and monitor the measurements using a web server built with the ESP8266 – that’s what we’re going to do in this section

ESP8266 Web Server with BME280 Sensor in Arduino IDE

Copy the following code to your Arduino IDE. Don’t upload it yet. First, you need to include your SSID and password.

How the Code Works

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

This sketch is very similar with the sketch used in the ESP8266 Web Server Tutorial. First, you include the ESP8266WiFi library and the needed libraries to read from the BME280 sensor.

The next line defines a variable to save the pressure at the sea level. For more accurate altitude estimation, replace the value with the current sea level pressure at your location.

In the following line you create an Adafruit_BME280 object called bme that by default establishes a communication with the sensor using I2C.

As mentioned previously, you need to insert your ssid and password in the following lines inside the double quotes.

Then, you set your web server to port 80.

The following line creates a variable to store the header of the HTTP request:

setup()

In the setup() , we start a serial communication at a baud rate of 115200 for debugging purposes.

You check that the BME280 sensor was successfully initialized.

The following lines begin the Wi-Fi connection with WiFi.begin(ssid, password) , wait for a successful connection and print the ESP IP address in the Serial Monitor.

In the loop() , we program what happens when a new client establishes a connection with the web server. The ESP is always listening for incoming clients with this line:

When a request is received from a client, we’ll save the incoming data. The while loop that follows will be running as long as the client stays connected.

Displaying the HTML web page

The next thing you need to do is sending a response to the client with the HTML text to build the web page.

The web page is sent to the client using this expression client.println() . You should enter what you want to send to the client as an argument.

The following code snippet sends the web page to display the sensor readings in a table.

Displaying the Sensor Readings

To display the sensor readings on the table, we just need to send them between the corresponding td and /td tags. For example, to display the temperature:

Note: the span tag is useful to style a particular part of a text. In this case, we’re using the span tag to include the sensor reading in a class called “sensor”. This is useful to style that particular part of text using CSS.

By default the table is displaying the temperature readings in both Celsius degrees and Fahrenheit. You can comment the following three lines, if you want to display the temperature only in Fahrenheit degrees.

Closing the Connection

Finally, when the response ends, we clear the header variable, and stop the connection with the client with client.stop() .

Web Server Demonstration

After inserting your network credentials you can upload the code to your board.

Check that you have the right board and COM port selected, and upload the code to your ESP8266. After uploading, open the Serial Monitor at a baud rate of 115200, and copy the ESP8266 IP address.

ESP8266 IP address Serial Monitor

Open your browser, paste the IP address, and you should see the latest sensor readings.

BME280 Web Server with ESP8266 demonstration

To update the readings, you just need to refresh the web page.

Wrapping Up

This article was an in-depth guide on how to get pressure, temperature and humidity readings from a BME280 sensor with the ESP8266 using Arduino IDE and display the readings on a web server.

Now, you can take this project further and display your sensor readings in an OLED display; create a datalogger; save the readings in your own database or send the readings to your Home Automation platform using MQTT. Here’s some projects and tutorials that might help you implement these ideas:

Learn more about the ESP8266 with our course: Home Automation using ESP8266

Thanks for reading.

[eBook] Build Web Servers with ESP32 and ESP8266 (2nd Edition)

Build Web Server projects with the ESP32 and ESP8266 boards to control outputs and monitor sensors remotely. Learn HTML, CSS, JavaScript and client-server communication protocols DOWNLOAD »

Recommended Resources

Build a Home Automation System from Scratch » With Raspberry Pi, ESP8266, Arduino, and Node-RED.

Home Automation using ESP8266 eBook and video course » Build IoT and home automation projects.

Arduino Step-by-Step Projects » Build 25 Arduino projects with our course, even with no prior experience!

What to Read Next…

Build an ESP8266 Web Server - Code and Schematics (NodeMCU)

Build an ESP8266 Web Server – Code and Schematics (NodeMCU)

ESP32 WebSocket Server Control Outputs Arduino IDE

ESP32 WebSocket Server: Control Outputs (Arduino IDE)

ESP8266 NodeMCU Access Point AP for Web Server

ESP8266 NodeMCU Access Point (AP) for Web Server

Enjoyed this project? Stay updated by subscribing our newsletter!

18 thoughts on “ESP8266 with BME280 using Arduino IDE (Pressure, Temperature, Humidity)”

When trying to connect with my W10 Firefox, I get these messages on the serial monitor:

WiFi connected.
IP address:
172.20.10.2
New Client.
GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: en-US,en-GB;q=0.8,en-DE;q=0.5,en;q=0.3
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: 172.20.10.2
Connection: Keep-Alive

Exception (28):
epc1=0x40202b6c epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

ctx: cont
sp: 3ffffd80 end: 3fffffc0 offset: 01a0
3fffff20: 3ffe88bd 3ffe8a63 3fffff50 40203714
3fffff30: 0000000a 3ffe8a63 3ffee768 40202c50
3fffff40: 3ffe85d9 3ffe8a63 3ffee908 402012e7
3fffff50: 402063a8 00000000 00001388 4020fa2f
3fffff60: 00000000 3ffefcfc 3fff000c 0000005f
3fffff70: ff2f5054 3ffee7b0 3ffee908 4020267f
3fffff80: 0000000a 3ffee7b0 3ffee908 402010d1
3fffff90: 00000000 00000000 00000001 3ffee970
3fffffa0: 3fffdad0 00000000 3ffee940 40203fc8
3fffffb0: feefeffe feefeffe 3ffe8510 40100529
stack

ets Jan 8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v8b899c12

Same using Internet Explorer.
What could be the problem?

You Need to install the ArduinoIDE plugin EspExceptionDecoder to decipher the stack.
Try to hard reset your ESP before anything else….

BUT it should be in same network the wifi module and the client
i want to check wifi module from different network

At the moment this post only works on a local network. But you can simply do “router port forwarding” to make the web server accessible from anywhere.

Hello Rui.
Works perfectly here at home.
But how can I get the values with 1 digit after the comma?
For example 20.29 gr / c to 20.2 Gr / c
I have not yet succeeded in doing it myself.
Thanks in advance.
Bert Heideveld (the Netherlands).

Hi Rui,
First things first: my compliments for your tutorials! But I have a problem with the webserver part of the tutorial. When uploading the sketch I get this “info” in the serial monitor:

⸮!⸮⸮Ԍ⸮

Exception (3):
epc1=0x40207fb5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x40030729 depc=0x00000000

ctx: cont
sp: 3ffffbc0 end: 3fffffc0 offset: 01a0
3ffffd60: 00000001 4010429b 3ffed010 3ffffef0
3ffffd70: 40100e68 0000049c 000003fd 402080df
3ffffd80: 0000049c 00001000 000003fd 40100e68
3ffffd90: 4010655c 00000000 0000001f 40233cd9
3ffffda0: 40100119 40233dc3 3ffefe44 0000049c
3ffffdb0: 000003fd 3ffffef0 3ffefe44 40233da6
3ffffdc0: ffffff00 55aa55aa 00000021 00000020
3ffffdd0: 00000020 00000004 00000004 aa55aa55
3ffffde0: 000003ff 40234290 3ffefe44 3ffefe44
3ffffdf0: 000000ff 3ffefe44 0000049c 00000000
3ffffe00: 40100119 00000001 3ffefe54 402344aa
3ffffe10: 00000008 3ffefe44 000000ff 3ffffef0
3ffffe20: 3fffff10 3ffefe7b 00000021 00000020
3ffffe30: 3ffeff04 3fffff51 00000001 4023455a
3ffffe40: 3ffffef0 40241870 00000000 00000009
3ffffe50: 3fff0244 3fffff10 3fff617c 40234529
3ffffe60: 3ffefe44 40234590 3ffe8512 3ffe84e6
3ffffe70: 402023aa 3ffe84e6 3ffe84dc 40202307
3ffffe80: 5f504b53 36393062 00006530 00000000
3ffffe90: 3ffee858 00000001 3ffefe44 40233e9e
3ffffea0: 35373832 39313636 00000037 40207e58
3ffffeb0: 00000001 3ffefe44 00000000 40208280
3ffffec0: 000003fd 4023397b 00000000 40100e34
3ffffed0: 00000001 00000064 3ffee780 40233996
3ffffee0: 01051000 009dc39b 3ffee851 3ffee84f
3ffffef0: 5f504b53 36393062 00006530 00000000
3fffff00: 3ffee858 00000001 3ffefe44 40233eae
3fffff10: 35373832 39313636 00000037 40207e68
3fffff20: 00000001 3ffefe44 00000000 40208290
3fffff30: 000003fd 4023398b 00000000 40100e34
3fffff40: 00000001 00000064 3ffee780 402339a6
3fffff50: 40233900 3ffee818 00000081 00000002
3fffff60: 00000004 00000000

This happened after I by mistake uploaded an incomplete code, because I did not copy everything. After searching the internet I think that in one or another way the flash memory of the ESP8266 is corrupted or some code is left, so maybe I need a way to clear everything in the flash memory, I think.

I did upload another sketch (with webserver access), which worked fine before, but now also this program gives similarly messages in the serial monitor. BTW the example code for the BM280 still works OK.

The problem is therefore probably the code for connection to my network. Any ideas? Thanks for any advice!

Kind regards,
Sjoerd W. Bijleveld

Hi Rui,
Problem solved! The Arduino IDE on my Mac shows under the tab “tools” all kind of information about the connected board, in my case Wemos D1 mini and it shows also the option “Erase Flash:” with 3 options: Only Sketch, Sketch + Wifi settings and All Flash Memory. I did choose All Flash Memory and now your sketch works like a charm! I hope this information will help you (and other people with similar problems)!

Hi.
Thank you for sharing your experience.
It may be helpful for other readers.
Regards,
Sara 😀

Hi,
I’ve met trouble with addressing of BMP280 and solve it (thanks to David Stein davidstein.cz/2017/09/30/arduino-bme280-could-not-find-a-valid-bme280-sensor-solved/#comment-141)
Adafruit lib include an alternate adress but it doesn’t work. Don’t know why.
So, I’ve modified Adafruit_BMP280.h lib as it :
#define BMP280_ADDRESS (0x76) / The default I2C address for the sensor. */
#define BMP280_ADDRESS_ALT (0x77) /
Alternative I2C address for the sensor. */
instead of original which was :
#define BMP280_ADDRESS (0x77) / The default I2C address for the sensor. */
#define BMP280_ADDRESS_ALT (0x76) /
Alternative I2C address for the sensor. */
(I know, here is BME that we are talking about, but there are the same lines in both libraries so people could have same issue)
You could also meet same trouble with CHIPID, so you can modified address too :
#define BMP280_CHIPID (0x58) /** Default chip ID. */ It could be 0x60, which is not my case.
Finally, I thank you for your tuto. You are the basement of all my sketches.

Hi.
thank you for that information.
Whenever an I2C sensor doesn’t work with the default sketches, I recommend running an I2C scanner sketch to check the address: https://raw.githubusercontent.com/RuiSantosdotme/Random-Nerd-Tutorials/master/Projects/LCD_I2C/I2C_Scanner.ino
Regards,
Sara

Hi Sara,
I did it (using your Ino for scan for a while). That the reason I place 0x76 (reported by I2C_Scanner) in first place into Ada’s lib.
First, I tried to force information thru bme.begin(0x76), but it didn’t work, then I also tried in instantiation Adafruit_BMP280 bmp = 0x76, no more result (without any fault during compilation). My address was good, just lib doesn’t work till I modif it internally.

I ran this and it works great. I am wondering if there is a simple way to add a way to touch the screen (on a smartphone) anywhere to make it refresh the readings webpage?
Thank you.

Hi.
To refresh the readings automatically, I recommend that you follow this tutorial: https://randomnerdtutorials.com/esp8266-nodemcu-web-server-sent-events-sse/
If you want to add a refresh button, you just need to add a button that redirects to the root URL, this is to “/”
Regards,
Sara

Thank you for your suggestion. I do have a question about this method. Does this cause the whole webpage to be refreshed every 30 seconds or does it just update the temp, pressure and humidity numbers?
If it reloads the whole page, then how is this better than just using a refresh directive in the section of the html page?

With Server-Sent Events, you only update the values.
With the refresh button for the root URL, you upload the whole page.
You can also add a button that makes a request on a specify URL that only updates the values. There are endless possibilites. I was referring one of the easiest processes.
Regards,
Sara


Источник: randomnerdtutorials.com