Interface bme280 temperature, humidity & pressure sensor with arduino

Алгоритм работы

Алгоритм работы с BMP280 и BME280 одинаков. Считываются калибровочные коэффициенты и данные датчиков температуры и давления.  Затем, по указанным в документации формулам, вычисляются реальные показания температуры , давления, и влажности если Вы используете BME280. Адреса регистров (корректировочных коэффициентов и данных) для работы с температурой и давлением у этих датчиков одинаковые. Формулы расчета температуры и давления идентичные. Если заменить BMP280 на BME280, то в программной части ничего менять не потребуется. Давление и температуру будет измерять, как и прежде. А вот для измерения влажности библиотеку придется доработать.

Это наводит на мысль, что схема измерения давления и температуры у них одинаковые. В BME280 просто добавили гигрометр.

На первых страницах документации по BME280 бросается в глаза, что он якобы менее шумный. Шум всего 0.2 Pa против 1.3 Pa у BMP280!

Но это всего лишь рекламный ход. Подвох заключается в том, что для BME280 уровень шума указан с применением встроенного цифрового фильтра. Такие же показатели выдает BMP280 с идентичными настройками фильтра. Без фильтрации BME280 шумит точно так же как и BMP280 о чем, свидетельствует документация к датчику.

На практике при работе в реальном проекте, где необходима определенная точность измерении давления, никакой разницы между BMP280 и BME280 не замечено.

Установка библиотек

Для работы с датчиком BMP280 существуют различные библиотеки, упрощающие работу. К ним относятся BMP280_DEV, Adafruit_BMP280_Library. Для датчика BMP280 будет используется библиотека от Adafruit.

Adafruit Unified Sensor Driver — общий драйвер

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
  2. В строке поиска вводим «Adafruit Unified Sensor», выбираем последнюю версию и кликаем Установить
  3. Библиотека установлена (INSTALLED)

Библиотека Arduino для датчиков BMP280

Чтобы начать считывать данные с датчиков, вам необходимо установить библиотеку Adafruit_BMP280 (код в репозитории github). Она доступна в менеджере библиотек Arduino, поэтому рекомендуется его использовать.

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
  2. В строке поиска вводим «Adafruit BMP280», выбираем библиотеку от Adafruit, но можете использовать любую.
  3. Выбираем последнюю версию и кликаем Установить
  4. Выбираем пример: Файл->Примеры->Adafruit BMP280 Library->bmp280test
  5. Компилируем этот пример. Если получаем ошибку , нужно установить Adafruit Unified Sensor (смотрите выше)

    …\Documents\Arduino\bmp280-i2c\bmp280-i2c.ino:1:30: fatal error: Adafruit_Sensor.h: No such file or directory

    #include <Adafruit_Sensor.h>

    ^
    compilation terminated.

    exit status 1
    Ошибка компиляции для платы Arduino Pro or Pro Mini.

    1
    2
    3
    4
    5
    6
    7
    8
    9

    …\Documents\Arduino\bmp280-i2c\bmp280-i2c.ino130fatal errorAdafruit_Sensor.hNo such file ordirectory

    #include <Adafruit_Sensor.h>

    ^

    compilation terminated.

    exit status1

    ОшибкакомпиляциидляплатыArduino Pro orPro Mini.

bme280.setup()¶

Initializes module. Initialization is mandatory before read values.

Parameters

  • (optional) — Controls oversampling of temperature data. Default oversampling is 16x.
  • (optional) — Controls oversampling of pressure data. Default oversampling is 16x.
  • (optional) — Controls oversampling of humidity data. Default oversampling is 16x
  • (optional) — Controls the sensor mode of the device. Default sensor more is normal.
  • (optional) — Controls inactive duration in normal mode. Default inactive duration is 20ms.
  • (optional) — Controls the time constant of the IIR filter. Default filter coefficient is 16.
  • (optional) — If 0 then the BME280 chip is not initialised. Useful in a battery operated setup when the ESP deep sleeps and on wakeup needs to initialise the driver (the module) but not the chip itself. The chip was kept powered (sleeping too) and is holding the latest reading that should be fetched quickly before another reading starts (). By default the chip is initialised.
, , Data oversampling
Skipped (output set to 0x80000)
1 oversampling ×1
2 oversampling ×2
3 oversampling ×4
4 oversampling ×8
5 oversampling ×16
Sensor mode
Sleep mode
1 and 2 Forced mode
3 Normal mode

Using forced mode is recommended for applications which require low sampling rate or hostbased synchronization. The sensor enters into sleep mode after a forced readout. Please refer to BME280 Final Datasheet for more details.

t standby (ms)
0.5
1 62.5
2 125
3 250
4 500
5 1000
6 10
7 20
Filter coefficient
Filter off
1 2
2 4
3 8
4 16

Example

Or simpler and more efficient

Use for «game mode» — Oversampling settings pressure ×4, temperature ×1, humidity ×0, sensor mode: normal mode, inactive duration = 0.5 ms, IIR filter settings filter coefficient 16.

Example of readout in forced mode (asynchronous)

Подключение BMP280 к Arduino по I2C/TWI

Так как датчик может работать по I2C и SPI, подключение можно реализовать двумя методами. При подключении по I2C нужно соединить контакты SDA и SCL.

Схема подключения BMP280 к Arduino

Для подключения понадобятся сам датчик BMP280, плата Ардуино, соединительные провода. Схема подключения показана на рисунке ниже.

Землю с Ардуино нужно соединить с землей на датчике, напряжение 3.3 В — на 3.3 В, SDA — к пину А4, SCL — к А5. Контакты А4 и А5 выбираются с учетом их поддержки интерфейса I2C.

Существуют несколько модулей с этим датчиком. Первый вариант — это модуль для работы в 3.3 В логике, данные модули будут подешевле; второй вариант — для работы в 5.0 В логике, на нём присутствуют: линейный стабилизатор напряжения на 3.3 В и преобразователи уровней 3.3/5.0 В на линиях SCK/SCL и SDI(MOSI)/SDA. Первый подойдёт для ардуин работающих от 3.3 В и Raspberry Pi / Orange Pi / Banana Pi и т.д., а второй — для обычных ардуин на 5.0 В.

Подключение BMP280 с встроенными стабилизатором напряжения на 3.3 В и преобразователями уровней 3.3/5.0 В на линиях SCK/SCL и SDI(MOSI)/SDA к Arduino.

Arduino Mega Arduino Uno/Nano/Pro Mini BMP280 модуль Цвет проводов на фото
GND GND GND Черный
5V 5V Vin Красный
20 (SDA) A4 SDA/SDI Зелёный
21 (SCL) A5 SCL/SCK Жёлтый

Подключение BMP280 без встроенного стабилизатора напряжения на 3.3 В к Arduino. В данном случае нужно использовать внешний преобразователь уровней на линиях SCK/SCL и SDI(MOSI)/SDA.

Arduino Mega Arduino Uno/Nano/Pro Mini BMP280 модуль Цвет проводов на фото
GND GND GND Черный
3.3V 3.3V VCC/3.3V Красный
20 (SDA) A4 SDA/SDI Зелёный
21 (SCL) A5 SCL/SCK Жёлтый

Примеры скетча

После запуска вы можете инициализировать датчик с помощью:

if (!bmp.begin()) {
Serial.println(«Could not find a valid BMP280 sensor, check wiring!»);
while (1);
}

1
2
3
4

if(!bmp.begin()){

Serial.println(«Could not find a valid BMP280 sensor, check wiring!»);

while(1);

}

вернет True, если датчик был найден, и False, если нет. В случае с False, проверьте соединение датчика с платой Arduino!

Считать температуру и давление легко, просто вызовите функции:

bmp.readTemperature(); // Температура в градусах Цельсия.
bmp.readPressure(); // Атмосферное давление в гПа

1
2

bmp.readTemperature();// Температура в градусах Цельсия.

bmp.readPressure();// Атмосферное давление в гПа

Копируйте и скомпилируйте нижеприведённый скетч в Arduino IDE.

#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp280;

void setup() {
Serial.begin(9600);
Serial.println(F(«BMP280»));

while (!bmp280.begin(BMP280_ADDRESS — 1)) {
Serial.println(F(«Could not find a valid BMP280 sensor, check wiring!»));
delay(2000);
}
}

void loop() {
float temperature = bmp280.readTemperature();
float pressure = bmp280.readPressure();
float altitude = bmp280.readAltitude(1013.25);

Serial.print(F(«Temperature = «));
Serial.print(temperature);
Serial.println(» *C»);

Serial.print(F(«Pressure = «));
Serial.print(pressure);
Serial.println(» Pa»);

Serial.print(F(«Altitude = «));
Serial.print(altitude);
Serial.println(» m»);

Serial.println();
delay(2000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#include <Adafruit_BMP280.h>
 

Adafruit_BMP280bmp280;

voidsetup(){

Serial.begin(9600);

Serial.println(F(«BMP280»));

while(!bmp280.begin(BMP280_ADDRESS-1)){

Serial.println(F(«Could not find a valid BMP280 sensor, check wiring!»));

delay(2000);

}

}
 

voidloop(){

floattemperature=bmp280.readTemperature();

floatpressure=bmp280.readPressure();

floataltitude=bmp280.readAltitude(1013.25);

Serial.print(F(«Temperature = «));

Serial.print(temperature);

Serial.println(» *C»);

Serial.print(F(«Pressure = «));

Serial.print(pressure);

Serial.println(» Pa»);

Serial.print(F(«Altitude = «));

Serial.print(altitude);

Serial.println(» m»);

Serial.println();

delay(2000);

}

Результат

Температура рассчитывается в градусах Цельсия, вы можете преобразовать ее в градусы Фаренгейта, используя классическое уравнение F = C * 9/5 + 32.

Давление возвращается в единицах СИ Паскалей. 100 Паскалей = 1 гПа = 1 миллибар. Часто барометрическое давление сообщается в миллибарах или миллиметрах ртутного столба. Для дальнейшего использования 1 паскаль = 0,00750062 миллиметров ртутного столба или 1 миллиметр ртутного столба = 133,322 Паскаля. Таким образом, если вы возьмете значение паскаля, скажем, 100734 и разделите на 133,322, вы получите 755,57 миллиметров ртутного столба.

Также возможно превратить BMP280 в альтиметр. Если вы знаете давление на уровне моря, библиотека может рассчитать текущее атмосферное давление в высоту.

Пример

Остальные примеры смотри в examples!

/*
   Простой пример, демонстрирующий основные функции измерения температуры, давления и влажности
*/

#include <GyverBME280.h>                      // Подключение библиотеки
GyverBME280 bme;                              // Создание обьекта bme

void setup() {
  Serial.begin(9600);                         // Запуск последовательного порта
  bme.begin();                                // Если доп. настройки не нужны  - инициализируем датчик
}

void loop() {
  Serial.print("Temperature: ");
  Serial.print(bme.readTemperature());        // Выводим темперутуру в 
  Serial.println(" *C");

  Serial.print("Humidity: ");
  Serial.print(bme.readHumidity());           // Выводим влажность в 
  Serial.println(" %");

  float pressure = bme.readPressure();        // Читаем давление в 
  Serial.print("Pressure: ");
  Serial.print(pressure / 100.0F);            // Выводим давление в 
  Serial.print(" hPa , ");
  Serial.print(pressureToMmHg(pressure));     // Выводим давление в 
  Serial.println(" mm Hg");
  Serial.print("Altitide: ");
  Serial.print(pressureToAltitude(pressure)); // Выводим высоту в 
  Serial.println(" m");
  Serial.println("");
  delay(1000);
}

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:

  • DHT11/DHT22 Humidity and Temperature Sensor With Arduino
  • DS18B20 Temperature Sensor with Arduino
  • I2C OLED Display with Arduino
  • Relay Module with Arduino
  • Ultrasonic Sensor HC-SR04 with Arduino

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

  • Arduino Step-by-step projects course
  • Free Arduino Projects and Tutorials
  • Arduino Mini Course

Thanks for reading.

Подключение модуля GY-BMP280-3.3 по шине SPI

Схема подключения к Arduino по шине SPI

  • VCC   —>  Arduino VCC (3.3 V)
  • GND  —>  Arduino GND
  • SCL   —>  Arduino D13  ( SPI / SCK )
  • SDO  —>  Arduino  D12 ( SPI / MISO )
  • SDA  —>   Arduino D11  ( SPI / MOSI )
  • CSB  —>   Arduino D10 ( SPI / CS,SS )

Скетч для работы с Arduino Uno по шине SPI:

Arduino

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

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10

//Adafruit_BMP280 bme; // I2C
Adafruit_BMP280 bme(BMP_CS); // hardware SPI
//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);

void setup() {
Serial.begin(9600);
Serial.println(F(«BMP280 test»));

if (!bme.begin()) {
Serial.println(F(«Could not find a valid BMP280 sensor, check wiring!»));
while (1);
}
}

void loop() {
Serial.print(F(«Temperature = «));
Serial.print(bme.readTemperature());
Serial.println(» *C»);

Serial.print(F(«Pressure = «));
Serial.print(bme.readPressure());
Serial.println(» Pa»);

Serial.print(F(«Approx altitude = «));
Serial.print(bme.readAltitude(1013.25)); // this should be adjusted to your local forcase
Serial.println(» m»);

Serial.println();
delay(2000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

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

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10

//Adafruit_BMP280 bme; // I2C

Adafruit_BMP280bme(BMP_CS);// hardware SPI

//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

voidsetup(){

Serial.begin(9600);

Serial.println(F(«BMP280 test»));

if(!bme.begin()){

Serial.println(F(«Could not find a valid BMP280 sensor, check wiring!»));

while(1);

}

}

voidloop(){

Serial.print(F(«Temperature = «));

Serial.print(bme.readTemperature());

Serial.println(» *C»);

Serial.print(F(«Pressure = «));

Serial.print(bme.readPressure());

Serial.println(» Pa»);

Serial.print(F(«Approx altitude = «));

Serial.print(bme.readAltitude(1013.25));// this should be adjusted to your local forcase

Serial.println(» m»);

Serial.println();

delay(2000);

}

Скетч такой же, как и в первом примере, за исключением изменения нескольких строк:

Arduino

//Adafruit_BMP280 bme; // I2C — раскомментировать для шины I²C
Adafruit_BMP280 bme(BMP_CS); // hardware SPI — раскомментировать для шины SPI
//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);

1
2
3

//Adafruit_BMP280 bme; // I2C  —  раскомментировать для шины I²C

Adafruit_BMP280bme(BMP_CS);// hardware SPI  —  раскомментировать для шины SPI

//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

Две последнии строчки отличаются режимом работы SPI — аппаратным или программным. Под программным SPI понимается использование драйвера Arduino SPI для эмуляции аппаратного SPI с использованием «битовой синхронизации». Это позволяет подключить SPI-устройство к любым контактам Arduino.

Результат работы скетча выводится на Монитор порта (Serial Monitor, вызывается клавишами CTRL+SHIFT+M) среды программирования Arduino IDE.

Arduino Code – Reading Temperature, Relative Humidity & Barometric Pressure

The following sketch will give you complete understanding on how to read temperature, relative humidity & barometric pressure from BME280 module and can serve as the basis for more practical experiments and projects.

Here’s how the output looks like in the serial monitor.

Code Explanation:

The sketch starts with including four libraries viz. Wire.h, SPI.h, Adafruit_Sensor.h and Adafruit_BME280.h.

Next, we define variable needed to calculate the altitude and create an object of Adafruit_BME280 library so that we can access functions related to it.

In setup section of code we initialize the serial communication with PC and call the function.

The function takes the I2C address of the module as parameter. If your module has different I2C address or , you need to specify it correctly. This function initializes I2C interface with given I2C Address and checks if the chip ID is correct. It then resets the chip using soft-reset & waits for the sensor for calibration after wake-up.

In looping section of the code, we use following functions to read temperature, relative humidity & barometric pressure from the BME280 module.

readTemperature() function returns the temperature from the sensor.

readPressure() function returns the barometric pressure from the sensor.

readAltitude(SEALEVELPRESSURE_HPA) function calculates the altitude (in meters) from the specified atmospheric pressure (in hPa), and sea-level pressure (in hPa).

readHumidity() function returns the relative humidity from the sensor.

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:

  • ESP32 Publish Sensor Readings to Google Sheets
  • Low Power Weather Station Datalogger (MicroPython)
  • ESP32/ESP8266 Insert Data into MySQL Database using PHP and Arduino IDE
  • ESP8266 and Node-RED with MQTT (Publish and Subscribe)
  • What is MQTT and How It Works

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

Thanks for reading.

BME280 — датчик атмосферного давления, влажности и температуры

Сегодня расскажу о датчике BME280 с помощью которого можно получить показания влажности, температуры, атмосферного давления и высоту (расчетную). Данный датчик прост, предварительно откалиброван и для подключения не требуется дополнительных компонентов.

Общие сведения

Рассмотрим модуль поближе, в правой части расположен датчик BME280 фирмы Bosch (это приемник таких датчиков, как BMP180, BMP085). Данный датчик измеряет влажность, температуру и давление с помощью данных показаний осуществляется расчет высоты, но эти показания не точные, подробно о датчике можно посмотреть в документации. На обратной стороне установлен стабилизатор напряжения LM6206 на 3.3 В и преобразователь уровней I2C, поэтому можно подключить модуль к микроконтроллерам с 3.3 В или 5 В логикой, не боясь.

Назначение контактов:► VCC, GND — питание модуля 3.3 В или 5 В ► SCL — линия тактирования (Serial CLock)► SDA — линия данных (Serial Data)

Данный модуль работает по двухпроводному интерфейсу I2C, адрес по умолчанию 0x76, но есть возможность изменить на адрес 0x77. Если присмотреться на модуль, рядом с датчиком расположены контакты, по умолчанию левый и средний контакт замкнуты проводником. Необходимо острым предметом перерезать проводник и установить припоем перемычку между центральный и правым контактом,тем самым установив адрес 0x77. При необходимости можно вернуть адрес 0x76.

Подключение датчика давления BME280 к Arduino

Необходимые детали:► BME280 — датчик атмосферного давления, влажности и температуры x 1 шт.► Arduino UNO R3 (DCCduino, CH340G)x 1 шт.► Провод DuPont 10x, 2,54 мм, 20 см, F-F (Female — Female) x 1 шт.

Подключение:В данном примере используем датчик BME280 и плату Arduino UNO R3, все получение показание отправлять в «Мониторинг порта», принципе и все, осталось собрать схему по рисунку ниже. Для интерфейса I2C на плате arduino предусмотрено только два вывода A4 и A5, другие вывода не поддерживают I2C, так что учтите при проектирование.

Программа:Для датчика BME280 разработана библиотека «Adafruit BME280 Library» с помощью которой можно упростить работу с датчиком. Так же, для работы датчика необходима дополнительная библиотека «Adafruit Unified Sensor«. Скачать библиотеки можно в конце статьи или можно скачать через «Менеджер библиотек» в среде разработки IDE Arduino.

Источник

Sample Sketch

Bosch BME280 I2C Sample Sketch
(Download)

12345678910111213141516171819202122232425262728293031323334

#include <Wire.h>
#include «cactus_io_BME280_I2C.h»
// Create BME280 object
BME280_I2C bme; // I2C using address 0x77
// or BME280_I2C bme(0x76); // I2C using address 0x76
void setup() {
Serial.begin(9600);
Serial.println(«Bosch BME280 Pressure — Humidity — Temp Sensor | cactus.io»);
if (!bme.begin()) {
Serial.println(«Could not find a valid BME280 sensor, check wiring!»);
while (1);
}
bme.setTempCal(-1);// Temp was reading high so subtract 1 degree
Serial.println(«Pressure\tHumdity\t\tTemp\ttTemp»);
}
void loop() {
bme.readSensor();
Serial.print(bme.getPressure_MB()); Serial.print(» mb\t»); // Pressure in millibars
Serial.print(bme.getHumidity()); Serial.print(» %\t\t»);
Serial.print(bme.getTemperature_C()); Serial.print(» *C\t»);
Serial.print(bme.getTemperature_F()); Serial.println(» *F»);
// Add a 2 second delay.
delay(2000); //just here to slow down the output.
}

Library

The cactus_io_BME280_SPI library provides the following functions:

  • BME280_SPI(int cspin) Creates an object using hardware SPI
  • or BME280_SPI(int cspin, int mosipin, int misopin, int sckpin) Creates an object using software SPI
  • begin() Called to initialise the sensor after the object is created
  • setTempCal(float) Allows you to define a temp calibration offset if it reads high
  • readSensor() Called to read data from the sensor
  • getTemperature_C() Returns a float value in degrees celsius
  • getTemperature_F() Returns a float value in degrees fahrenheit
  • getHumidity() Returns a float as a percentage humidity
  • getPressure_MB() Returns a float in millibars
  • getPressure_HP() Returns a float in hectapascals

Принцип действия барометра на BMP280, BMP180, BME280

Датчики давления работают на преобразовании давления в движение механической части. Состоит датчик давления из преобразователя с чувствительным элементом, корпуса, механических элементов (мембран, пружин) и электронной схемы.

Датчик BMP280 создан специально для приложений, где требуются малые размеры и пониженное потребление  энергии. К таким приложениям относятся навигационные системы, прогноз погоды, индикация вертикальной скорости и другие. Датчик обладает высокой точностью, хорошей стабильностью и линейностью. Технические характеристики датчика BMP280:

  • Габариты 2 х 2,5 х 0,95 мм.
  • Давление 300-1100гПа;
  • Температуры от 0С до 65 С;
  • Поддержка интерфейсов I2C и SPI;
  • Напряжение питания 1,7В – 3,6В;
  • Средний ток 2,7мкА;
  • 3 режима работы – режим сна, режим FORCED (проведение измерения, считывание значения, переход в спящий режим), режим NORMAL (перевод датчика в циклическую работу – то есть устройство самостоятельно через установленное время выходит из режима сна, проводит измерения, считывает показания, сохраняет измеренные значения и переходит снова в режим сна).

Датчик BMP180 – это дешевый и простой в применении сенсорный датчик, который измеряет атмосферное давление и температуру. Используется обычно для определения высоты и в метеостанциях. Состоит устройство из пьезо-резистивного датчика, термодатчика, АЦП, энергонезависимой памяти, ОЗУ и микроконтроллера.

Технические характеристики датчика BMP180:

  • Пределы измеряемого давления 225-825 мм рт. ст.
  • Напряжение питания 3,3 – 5В;
  • Ток 0,5мА;
  • Поддержка интерфейса I2C;
  • Время срабатывания 4,5мс;
  • Размеры 15 х 14 мм.

Датчик bme280 содержит в себе 3 устройства – для измерения давления, влажности и температуры. Разрабатывался для малого потребления тока, высокой надежности и долгосрочной стабильной работы.

Технические характеристики датчика bme280:

  • Размеры 2,5 х 2,5 х 0,93 мм;
  • Металлический LGA-корпус, оснащенный 8-ю выходами;
  • Напряжение питания 1,7 – 3,6В;
  • Наличие интерфейсов I2C и SPI;
  • Потребляемый ток в режиме ожидания 0,1 мкА.

Если сравнивать все устройства между собой, то датчики очень похожи. По сравнению со своим предшественником, к которым относится BMP180, более новый датчик BMP280 заметно меньше по размерам. Его восьмиконтактный миниатюрный корпус требует аккуратности во время монтажа. Также устройство поддерживает интерфейсы I2C и SPI, в отличие от предшественников, которые поддерживали только I2C. По логике работы датчика изменений практически нет, была только усовершенствована температурная стабильность и увеличено разрешение АЦП.  Датчик BME280, измеряющий температуру, влажность и давление, также похож на BMP280. Отличие между ними заключается в размерах корпуса, так как BME280 имеет датчик влажности, который немного увеличивает габариты. Количество контактов и их расположение на корпусе совпадают.

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, you use the ESP32 SPI pins. For SPI communication on the ESP32 you can use either the HSPI or VSPI pins, as shown in the following table.

SPI MOSI MISO CLK CS
HSPI GPIO 13 GPIO 12 GPIO 14 GPIO 15
VSPI GPIO 23 GPIO 19 GPIO 18 GPIO 5

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.

I2C

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 depending on whether you’re using hardware or software SPI (hardware SPI uses the ESP32 default HSPI pins; software SPI uses the pins defined on the code).

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 ESP32, 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.

Динамическая загрузка данных датчиков с помощью AJAX

Если ваша веб-страница много весит, то полное ее обновление не слишком практично. Лучше использовать асинхронный Javascript и Xml (AJAX), чтобы мы могли запрашивать данные с сервера асинхронно (в фоновом режиме), не обновляя страницу.

Для выполнения AJAX на веб-страницах в JavaScript обычно используется объект . Он тихо выполняет GET-запрос на сервер и обновляет элемент на странице. AJAX – это не новая технология или другой язык, а просто существующие технологии, используемые по-новому. Кроме того, AJAX также позволяет:

  • запрашивать данные с сервера после загрузки страницы;
  • получать данные с сервера после загрузки страницы;
  • отправлять данные на сервер в фоновом режиме.

Ниже приведен скрипт AJAX, который мы будем использовать. Поместите этот скрипт непосредственно перед закрывающим тегом .

Скрипт начинается с тега , так как AJAX-скрипт – это не что иное, как javascript, и поэтому нужно писать его в теге . Чтобы данная функция вызывалась повторно, мы будем использовать функцию javascript . Она принимает два параметра: функцию для выполнения и интервал времени (в миллисекундах), через который выполнять указанную функцию.

Сердцем этого скрипта является функция . Внутри этой функции создается объект. Данный объект используется для запроса данных с веб-сервера.

Функция вызывается каждый раз, когда изменяется . Свойство хранит состояние . Возможны следующие значения:

  • 0: запрос не инициализирован;
  • 1: установлено подключение к серверу;
  • 2: запрос получен;
  • 3: обработка запроса;
  • 4: запрос завершен, и ответ готов.

Свойство содержит статус объекта . Возможны следующие значения:

  • 200: OK;
  • 403: запрещено;
  • 404: страница не найдена.

Когда равен 4, а – 200, ответ готов. Теперь обновляется содержимое элемента (содержащего значения температуры, влажности, давления и высоты).

Затем HTTP-запрос инициируется с помощью функций и .

Подключение модуля BME280 к Arduino UNO

Давайте подключим модуль BME280 к Arduino.

Подключение довольно простое. Начните с соединения выводов GND на модуле и на плате Arduino, затем подключите вывод VIN к выводу 5V на Arduino.

Теперь остаются выводы, которые используются для связи I2C

Обратите внимание, что у разных плат Arduino для I2C используются разные выводы. На платах Arduino с разводкой R3 SDA (линия передачи данных) и SCL (линия синхронизации) находятся на разъеме выводов рядом с выводом AREF

Они также известны как A5 (SCL) и A4 (SDA).

Если у вас Arduino Mega, выводы будут отличаться! Вам необходимо использовать цифровые выводы 21 (SCL) и 20 (SDA). В таблице ниже приведены выводы, использующиеся для I2C на разных платах Arduino.

Выводы шины I2C на разных платах Arduino
  SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

Следующая диаграмма показывает, как всё подключить.

Рисунок 7 – Схема подключения модуля BME280 к Arduino