Gy-bmp280-3.3 pressure sensor module arduino tutorial

Представленные на рынке модели

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

Наименование Питание (V) Точность Разрешение
(hPa)
Диапазон (hPa) Рабочая температура
(°C)
Интерфейсы Примечание
SPI I2C UEXT
Атмосферные
MOD-BMP085 1.8–3.6 0.03 hPa 0.01 300–1100 (от 500 м ниже уровня моря до 9 км. высоты –40..+85 + + Измерение температуры
GY-BMP280 3.3 0.12 hPa 0.0016 300–1100 –40..+85 + + Измерение температуры до +65, с точностью 0.01
MD-PS002 5V ±0.2% –100–+150 –40..+125 + Только не агрессивные среды
Жидкостные
MS5803-02BA 1.8–3.6 20 см жидкости 30–1100
(10–2000)
–40..+85 + +
MS5803-07BA 1.8–3.6 0–7 мбар
(70 м погружения)
–20..+85 + +
Open-Smart 5V G1/4 0-1.2 MPa Hydraulic Pressure Sensor for Non-Corrosive Water 5 1.5 % 1–2.4 мбар (max 3) 0..+85 Собственный коннектор, соединяемый к I2C через резистор, датчик оснащен термометром

Конечно, в приведенном списке числятся далеко не все существующие модели. В нем указаны только те, которые обладают определенной популярностью и затребованы пользователями.

Примеры

Первым делом стоит удостовериться в работоспособности датчика и узнать его адрес, он может быть и . Загружаем следующий код:

#include <Wire.h>
void setup() {
  Serial.begin(9600);
  Serial.println("Start scan");
}

void loop() {
  for (uint8_t i = 1; i < 128; i++) {
    Wire.beginTransmission(i);
    if (!Wire.endTransmission()) Serial.println(i, HEX);
  }
  Serial.println("...");
  delay(5000);
}

Открываем монитор порта:

  • Если вывелось только Start scan и ничего больше – датчик бракованный и не будет работать
  • Если это рабочий BMP/BME – получим вывод такого вида:

Значит датчик ответил по адресу 0x76. Может ответить по 0x77.

Если вывод имеет вид

Значит Ардуино не находит датчиков на линии. Либо датчик подключен неправильно, либо бракованный.

Далее откроем базовый пример из библиотеки, который опрашивает значения с датчика. В можно передать адрес, который мы узнали из предыдущего скетча-сканера (не забываем префикс 0x). Загружаем и открываем порт:

#include <GyverBME280.h>
GyverBME280 bme;

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  
  // запуск датчика и проверка на работоспособность
  if (!bme.begin(0x76)) Serial.println("Error!");
}

void loop() {
  // температура
  Serial.print("Temperature: ");
  Serial.println(bme.readTemperature());

  // влажность
  Serial.print("Humidity: ");
  Serial.println(bme.readHumidity());

  // давление
  Serial.print("Pressure: ");
  Serial.println(bme.readPressure());

  Serial.println();
  delay(1000);
}
  • Если выведется только слово Start – датчик бракованный и из-за этого программа зависла
  • Если выведется Error! – датчик бракованный или адрес не соответствует, вернись к предыдущему пункту
  • Корректно выводятся все три параметра

Датчик рабочий, и это BME280

Выводится температура и давление, влажность – 0

Датчик рабочий, и это BMP280, т.е. без влажности.

Код Arduino, считывание показаний температуры, относительной влажности воздуха и атмосферного давления

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

Вот как выглядит вывод в мониторе последовательного порта.

Рисунок 11 – Вывод показаний датчика BME280. Температура, относительная влажность, атмосферное давление и высота над уровнем моря

Объяснение кода

Скетч начинается с подключения четырех библиотек, а именно, Wire.h, SPI.h, Adafruit_Sensor.h и Adafruit_BME280.h.

Затем мы определяем переменную , необходимую для вычисления высоты, и создаем объект библиотеки , чтобы мы могли получить доступ к функциям, связанным с ней.

В функции мы инициализируем последовательную связь с компьютером и вызываем функцию .

Функция в качестве параметра принимает адрес модуля на шине I2C. Если ваш модуль имеет другой адрес I2C или вы изменили его, вам нужно указать его правильно. Эта функция инициализирует интерфейс I2C с заданным адресом и проверяет правильность идентификатора чипа. Затем она программно перезапускает микросхему и ждет окончания калибровки датчика после запуска.

В зацикленном фрагменте кода для считывания значений температуры, относительной влажности и атмосферного давления из модуля BME280 мы используем следующие функции:

  • функция возвращает от датчика температуру;
  • функция возвращает от датчика атмосферное давление;
  • функция вычисляет высоту (в метрах) исходя из текущего атмосферного давления (в гПа) и давления на уровне моря (в гПа);
  • функция возвращает от датчика относительную влажность воздуха.

Подключение 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 в альтиметр. Если вы знаете давление на уровне моря, библиотека может рассчитать текущее атмосферное давление в высоту.

I2C pullups

SDI is a bi directional open drain pin and must have a pullup attached.

There is no need for a pullup on SCK as it is input; In I2C mode the device
is only ever a slave and does not do clock stretching. I tested this using a
resistor drop down (5V to 3V) using 1k connected to a 1k5 then to ground. With
the SCK input connected to the top of the 1k5 — it works fine.

Note: You can only leave out one pull up resistor if you use
the BMP280 on its own since I2C requires pullups so that the bus can be
released for other devices.

Note: The SDI and SCK pins are not true open drain pins and only SDI and
SDO are implemented as bi-directional.

Table 29 in the datasheet (Pin description) shows what is going on:

Different libraries give the same result

Here the adafruit library was given the actual forecast sea level pressure
to get an altitude. I don’t think it is too accurate because you have to have
the actual ground level pressure value at your location. where I am is about
23m above sea level not 2m see the readings below!

The I2C Sensor library does not let you change the default value of
1013.25mb so you would need to go and write some code to allow accurate height
measurement adjustment.

Different libraries Adafruit and I2C library (same result)

07:41 13/8/17 forecast pressure 1020mbar avg sea level pressure
I2C Sensor LIB: Probe BMP280: Sensor found
 HeightPT1: 1.82 m; Height: 20.03 Pressure: 101758.00 Pa; T: 23.27 C
 HeightPT1: 3.50 m; Height: 20.28 Pressure: 101755.00 Pa; T: 23.34 C
 HeightPT1: 5.01 m; Height: 20.12 Pressure: 101757.00 Pa; T: 23.33 C

07:42 13/8/17 Adafruit library  forecast pressure 1020mbar
Temperature = 23.70 *C
Pressure = 101755.11 Pa
Approx altitude = 20.27 m

Note: The I2C sensor library code averages the 1st 10 readings (see example
2 below) so the left hand values are not stable (until 10 values are gathered)
the next measurement is the unaveraged height reading (20.03).

Interestingly there is a difference in temperature readings; Maybe one of
the library code implementations is not right.

Warning: Getting a calibrated height using a predicted
forecast pressure reading is not accurate as it will be slightly different at
your location, so it is best to design code to store the value (when you are at
ground level — by pressing a dedicated button, or gather the data on power up).
Then use this value as the calibration value for measuring relative height from
ground level.

Why your BMP280 won’t start

If you’re like me, and you have a breakout board without level shifters, and
you create some using a few components (see the schematic on this page), to get
I2C mode going, and then burn the example code into the Arduino uno r3. You
then wonder why it’s doing absolutely nothing!

As a typical engineer you give it a go and then — it’s time to read the
manual! — this is always a last resort unless there is a danger of blowing up a
$800 component! In which case read the manual first.

It turns out that the communication mode of the BMP280 is set on power up by
the state of various control inputs.

One «gotcha» is that an OUTPUT in SPI mode turns into an INPUT in I2C
mode!

SPI mode uses more pins to define its interface and one of these unused the
outputs (in SPI mode) is used as an input in I2C mode!. If you have a breakout
board then these control inputs are left floating, meaning its just not going
to work unless you set them before power up.

Warning: Holding any interface pin high while VDDIO
is switched off will damage the chip due to current flow through protection
diode. This could happen if you are designing a complex power management system
where control pins are connected to the processor and power to the chip is
controlled separately.

Conversely, if VDD is off and VDDIO is supplied,
control pins at the chip are held at high-z (inactive).

Install the BMP280 Arduino Driver

Open the Arduino IDE and use the top menu to navigate to Sketch → Include Library → Manage Libraries… which will open the Library Manager dialog box.

In the Library Manager dialog box, enter BMP280 in the filter field to find the BMP280 driver as shown in the image below.

Arduino IDE Library Manager Dialog Box

Click the Adafruit BMP280 Library item and then use the install button that appears to install it. Also click the I2C-Sensor-Lib iLib item and install it for I²C communications with the BMP280 module.

Installation of the BMP280 Arduino driver is shown in the video below.

https://youtube.com/watch?v=-glJ6xTZXUA

Can’t see the video? View on YouTube →

Testing the Pressure Module with Arduino

When the BMP280 driver library is installed in the Arduino IDE, a test sketch is available under the Examples menu item that can be used for testing the BMP280 pressure sensor module. Find the test sketch in the Arduino IDE by selecting File → Examples → Adafruit BMP280 Library → bmp280test from the top menu.

I²C Interface Test

By default the test sketch uses the I²C interface, so no changes to the sketch are necessary. The BMP280 driver library accesses the sensor at I²C address 0x77, which is the address of the module if the wiring described above is correct.

To run the test sketch, simply load it to the Arduino and then open the Arduino IDE Serial Monitor window to see the pressure, altitude and temperature read from the sensor. Make sure that the Serial Monitor window is set to use a baud rate of 9600.

SPI Interface Test

Open the same test sketch used for the I²C above in the Arduino IDE by selecting File → Examples → Adafruit BMP280 Library → bmp280test from the top menu.

Software SPI

For software SPI, comment out the I2C line near the top of the test sketch and uncomment the line that specifies the software SPI pins as shown in the code below.

#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);

The default software SPI pins are defined at the top of this code. If you are using different pins, change the pin numbers here.

Hardware SPI

For hardware SPI, the pressure sensor module must be connected to the hardware SPI pins of the Arduino being used. At the top of the test sketch, comment out the I2C line and uncomment the line that specifies only the chip select line as shown in the code below.

#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);

BMP_CS has a default pin number of 10 as defined near the top of this code. If you are using a different pin for SPI chip select, change it here. The other pin numbers defined at the top of this code are not used when hardware SPI is selected because hardware SPI is only found on specific Arduino pins.

Running the Test Sketch with SPI

Run the test sketch the same way as done for I2C: load it to the Arduino and then open the Arduino IDE Serial Monitor window to see the pressure, altitude and temperature read from the sensor. Make sure that the Serial Monitor window is set to use a baud rate of 9600.

Books that may interest you:

Software

The hookup and Arduino Sketch is for connecting a single Adafruit BME280 breakout board using either address 0x77 or 0x76.

You will need to download the cactus.io BME280_I2C library to work with this sample sketch. The library supports reading the barometric pressure,
humidity and temperature from the sensor.

To get the data from the sensor we need to call bme.readSensor(). We can then call the various functions to get the temperature, humidity and pressure.

The sensor returns the temperature in degrees celsius by design. We can call the method in the BME280 library called getTemperature_C to get the celsius
value or getTemperature_F for the value in fahrenheit.

The barometric pressure from the sensor is returned in Pascals. 100 Pascals = 1hPa = 1 millibar. The library method getPressure_P will return the
value in Pascals. The method getPressure_MB will return the value in millibars.

When we create the BME280 object in the sketch we can use the default which is BME280_I2C bme which will create an object using the default 0x77 address.
To create an object using the alternative address (0x76) we need to declare it as BME280_I2C bme(0x76).

We have found that when the BME280 is enclosed inside a case or nearby a circuit board the heat generated by voltage regulators can affect the temperature
reading from the BME280. We have included a function in the library that allows us to apply a temperature calibration offset to the value returned by getTemperature_C
or _F. Basically it justs adds the calibration offset. So if the temperature is reading 2 degrees high then we use this function:

bme.setTempCal(-2);   which will subtract 2 degrees from the temperture reading.

The default calibration offset is 0. So you only have to use this function if you want to apply a calibration value other than 0.

  • The sketch Supports only I2C bus connection.
  • The sketch Supports only one sensor connected.
  • Its blocking code.

Что измеряет сенсор

Давление — некая физическая величина численно равная перпендикулярно направленной силе действующей на единицу площади поверхности. Сам датчик можно представить своеобразными очень чувствительными весами. Последнее замечание сделано по причине того, что и вода, и газы тоже имеют свою массу, которая влияет на поверхность под ними. На практике, за счет указанного фактора, можно определить глубину погружения (чем ниже, тем больше вес слоя воды) или высоту подъема в атмосферу (чем выше — тем меньше плотность, а значит и слабее воздействие). Кроме того, в отношении давления воздуха не стоит забывать о погодных колебаниях. Резкое падение названой характеристики атмосферы — к дождю или буре.

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

Собственно, детектор Ардуино о котором идет речь, и измеряет силу воздействия на единицу площади сенсорного элемента прибора. Правда, в большинстве выпускаемых моделей, описанное — не все их функциональные возможности. Бонусом, у многих идет замер температуры окружающей среды, а у некоторых еще и влажности или ускорения.

How to use BMP280?

Connect the power supply pins Vcc and GND to 3.3 volts and ground of a circuit. Now, you need to select the digital interface. For I²C, connect chip select pin (CSB) to Vcc otherwise connect it to the ground or leave it unconnected. Set the I²C address. If you want to set 0x77 address, connect the SDO pin to Vcc. To set 0x76 address, leave the pin unconnected. This module does not contain any onboard voltage regulator or a level shifter. Therefore, for connecting it to devices whose operating voltage is 5V or any voltage other than 3.3V, you need a level shifter and voltage regulator.

Interfacing With Arduino

We have used a 2N7000 bidirectional level shifter module for connecting the 3.3V module to a 5V Arduino. This transistor is performing a function of level shifting. It performs a bidirectional conversion of 3.3V logic of sensor module to 5V and 5V logic of Arduino to 3.3V. Connect the Vcc pin of a module with a 3.3V pin or Arduino.

I²C Interfacing

For I²C interfacing, connect

  • pin1 to 3.3V pin of Arduino
  • pin2 to the ground pin of Arduino
  • pin3 to analog pin 5 or SCL pin using level shifter circuit
  • Pin4 to analog pin 4 or SDA pin using level shifter circuit
  • Pin5 is left unconnected
  • Pin6 to pin1 of sensor module

SPI Interfacing

For SDO and SCL pin use level shifter circuit or any other module performing conversion between the two voltages. Power the module from 3.3 V pin of Arduino.

Connect the sensor to the SPI pins on the ICSP header of Arduino as follows:

  • Pin3 to Arduino’s pin13
  • Pin6 to MISO pin12 and MOSI pin11 of Arduino
  • Pin5 to Arduino’s pin10.

Connections for pin 1 and 2 are the same.

Работа NRF24L01

NRF24L01 — это цифровой приемопередатчик с SPI-подключением, способный передавать и принимать данные в диапазоне 24 ГГц ISM (ISM — промышленный, научный и медицинский; Industrial, Scientific, Medical).

NRF24L01

Это тот же самый диапазон, который используется Bluetooth и WiFi, и не требует лицензирования, так как он маломощный. Это устройство с питанием от 3 В, но линии данных соответствуют 5 В, поэтому преобразование не требуется. Вы можете управлять его VCC выводом прямо с вывода 3,3 В Arduino Uno.

Интерфейс SPI работает со скоростью до 10 Мбит/с. Каждый модуль работает на одной и той же частоте или канале в диапазоне от 2,400 до 2,525 ГГц. Внутри каждого канала имеется 6 «линий», позволяющих установить до 6 связей в каждом канале. Это означает, что один мастер может прослушивать 6 ведомых устройств, все на одном канале, но на разных «линиях».

Использование стороннего аналогового датчика давления

Редко, но все же случаются ситуации, когда по каким-либо причинам использовать в схеме специализированный сенсор, рассчитанный на работу конкретно с Ардуино, не получается. Скажем, его невозможно найти сразу в близлежащих магазинах электроники, а ждать посылку долго. Выходом могут стать датчики давления, применяемые в автомобильной электронике. Их тоже можно связать непосредственно с микроконтроллером.

Примером послужит WABCO 4410400130 — сенсор указанного плана, используемый на большегрузных фурах. Единственное, требующее внимания в представленной схеме — питание у элемента раздельно с Arduino. В последнем, просто нет требуемых для запуска датчика +24 В. В связи с чем и приходится использовать дополнительный блок энергообеспечения, с правильными и достаточными характеристиками питания — 8–32 V постоянного тока, при минимуме 400 mА мощности.

Что касается соединения сенсора напрямую к плате микроконтроллера — в нем на выходе не более 5 В. И чем больше давление, тем меньший ток будет поступать на аналоговые контакты логического устройства. Вот только, на всякий случай, рекомендуется проверить изначальный выход мультиметром, с целью контроля варианта «пробития» сенсора, с возникновением обстоятельств беспрепятственного связывания OUT с минусом или плюсом питающей детектор линии.

Пример скетча получения информации с аналогового датчика:

Теперь, что касается данных получаемых на выходе скетча. Нужно провести их градацию с использованием классического манометра, оценив какие цифры идут от сенсора при разном давлении и ввести соответствующую формулу в тело программы.

И в окончании, технические характеристики WABCO 4410400130, для сравнения с похожими датчиками Arduino:

  • Тип: пьезоэлемент
  • Питание: 8–32 V
  • Рабочая температура: −40..+80 °С
  • Диапазон измерения: от 0 до 10 bar
  • Точность: 0.2–0.3 %
  • Предельное давление разрушения: 16 bar

Принцип действия барометра на 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 имеет датчик влажности, который немного увеличивает габариты. Количество контактов и их расположение на корпусе совпадают.

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

Для работы с датчиком 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.

Overview

The BME280 from Bosch Sensortec is a integrated environmental sensor designed for the mobile market. It a low power consumption design that combines high linearity and high
accuracy sensors for pressure, humidity and temperature.

The BME280 supports either SPI or I2C interface to communicate with the micro controller.

Because of the small size of the sensor, the best way to use this sensor is with a breakout board. The Adafruit breakout board is used here.

In this hookup we are only connecting one device to the Arduino using the I2C bus. We can use either address (0x77 or 0x76). It reads the barometric pressure, humidity and
temperature and displays it on the console.

Constructor & Destructor Documentation

BMP280 ( int  bus = ,
int  addr = ,
int  cs =  
)

BMP280 constructor.

This driver supports both the BMP280 and the BME280. The BME280 adds a humidity sensor. The device type is detected automatically by querying the chip id register.

This device can support both I2C and SPI. For SPI, set the addr to -1, and specify a positive integer representing the Chip Select (CS) pin for the cs argument. If you are using a hardware CS pin, then you can connect the proper pin to the hardware CS pin on your MCU and supply -1 for cs. The default operating mode is I2C.

Parameters
bus I2C or SPI bus to use.
addr The I2C address for this device. Use -1 for SPI.
cs The gpio pin to use for the SPI Chip Select. Use -1 for I2C, or for SPI with a hardware controlled pin.
Exceptions
std::runtime_error on failure.

Here is the caller graph for this function:

~BMP280 ( )
virtual

BMP280 Destructor.

Here is the call graph for this function:

Описание библиотеки для работы с датчиком. Пример скетча

Для работы с датчиком BMP180 существуют различные библиотеки, упрощающие работу. К ним относятся SFE_BMP180, Adafruit_BMP085. Эти же библиотеки подходят для работы с датчиком BMP080.  Для датчика bmp280 используется похожая библиотека Adafruit_BMP280.

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


status = pressure.startTemperature();// Считываются данные с датчика о температуре

if(status!=0){

delay(status); // Ожидание

status = pressure.getTemperature(T); // Сохранение полученных данных о температуре

if(status!=0){

Serial.print("Temperature: "); // Выведение на экран слова «Температура»

Serial.print(T,2); // Вывод на экран значения температуры.

Serial.println("deg C, "); //Печать символа градуса Цельсия.

Затем нужно получить информацию об атмосферном давлении.


status = pressure.startPressure(3); // происходит считывание давления

if(status!=0){

delay(status); // Ожидание

status = pressure.getPressure(P,T); // получение давления, сохранение

if(status!=0){

Serial.print("Absolute pressure: "); // Вывод на экран слов «Атмосферное давление»

Serial.print(P,2); // Вывод на экран значения переменной mBar

Serial.print(" mbar, "); // Вывод на экран текста "mBar"

Serial.print(P*0.7500637554192,2); // вывод на экран значения в mmHg (мм.рт.ст.)

Serial.println(" mmHg");} // вывод на экран единицы измерения давления "mmHg" (мм. Рт.ст.).

После загрузки скетча в окне мониторинг порта появятся данные о температуре и атмосферном давлении.

Датчик BME280 также показывает давление и температуру, дополнительно он может считывать показания о влажности, который по умолчанию выключен. При необходимости можно произвести настройки датчика и начать считывать показания о влажности. Диапазон измерения от 0 до 100%. Библиотека, которая нужна для работы с датчиком, называется Adafruit_BME280.

Код похож на тот, что описан выше, только к нему еще добавляются строки для определения влажности.


void printValues() {

Serial.print("Temperature = ");

Serial.print(bme.readTemperature());

Serial.println(" C"); //определение температуры, вывод ее на экран в градусах Цельсия.

Serial.print("Pressure = ");

Serial.print(bme.readPressure() / 100.0F);

Serial.println(" hPa"); //определение давления, вывод его на экран

Serial.print("Humidity = ");

Serial.print(bme.readHumidity());

Serial.println(" %"); //определение влажности в процентах, вывод измеренного значения на экран.

Serial.println();

}