Подключение датчика BME280 к Arduino
В этом руководстве мы подробно разберем, как использовать модуль датчика BME280 с Arduino для считывания давления, температуры, влажности и оценки высоты. Вы узнаете как подключить датчик, установить необходимые библиотеки и написать простой скетч для отображения показаний датчика.
Обзор модуля датчика BME280
Датчик BME280 считывает барометрическое давление, температуру и влажность. Также, поскольку давление меняется с высотой, можно также примерно оценить и высоту. Существует несколько версий этого модуля, различающихся используемым протоколом связи I2C или SPI для обмена данными с микроконтроллером.
BME280 c I2C интерфесом
Этот датчик использует протокол связи I2C, поэтому подключение очень простое. Вы подключаете датчик BME280 к контактам Arduino, как показано в таблице ниже:
BME280 | Arduino UNO | Arduino MINI | Arduino Mega | Arduino Micro | Arduino Nano |
VIN | 5V | 5V | 5V | 5V | 5V |
GND | GND | GND | GND | GND | GND |
SCL | A5 | A7 | 21 | 1 | A5 |
SDA | A4 | A6 | 20 | 2 | A4 |
BME280 с SPI интерфейсом
Существуют и другие версии этого датчика, которые могут использовать протоколы связи SPI или I2C, например, модуль, показанный на следующем рисунке:
Для подключения датчика по SPI подключите его к следующим контактам Arduino
BME280 | Arduino Nano | Arduino UNO | Arduino Mega | Arduino Mini |
SCK (SPI Clock) | Pin 13 | Pin 13 | Pin 52 | Pin 17 |
SDO (MISO) | Pin 12 | Pin 12 | Pin 50 | Pin 16 |
SDI (MOSI) | Pin 11 | Pin 11 | Pin 51 | Pin 15 |
CS (Chip Select) | Pin 10 | Pin 10 | Pin 53 | Pin 14 |
Схема подключения
Подключите датчик BME280 к плате Arduino, как показано на следующей принципиальной схеме.
Установка необходимых библиотек
Для считывания показаний датчика нам нужно установить в Arduino IDE несколько дополнительных библиотек. Это Adafruit_BME280 и Adafruit Unified Sensor. Как это сделать мы сейчас подробно рассмотрим.
Установка библиотеки Adafruit BME280
Чтобы получить показания от модуля датчика BME280, вам необходимо использовать библиотеку Adafruit_BME280. Выполните следующие шаги, чтобы установить её в Arduino IDE:
Перейдите в Скетч> Подключить библиотеку> Управление библиотеками. Должен открыться менеджер библиотек.
Найдите “adafruit bme280” в окне поиска и установите её.
Установка библиотеки Adafruit Unifed Sensor
Чтобы использовать библиотеку BME280, вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги, чтобы установить её в Arduino IDE:
Перейдите в Скетч> Подключить библиотеку> Управление библиотеками. Должен открыться менеджер библиотек. Введите “Adafruit Unified Sensor” в поле поиска. Прокрутите до конца, чтобы найти библиотеку и установить её.
После установки библиотек перезапустите Arduino IDE.
Считывание давления, температуры и влажности
Чтобы прочитать давление, температуру и влажность, мы будем использовать пример скетча из библиотеки. Для этого откройте Arduino IDE и перейдите в Файл> Примеры> Adafruit BME280 Library> bme280test.
/***************************************************************************
This is a library for the BME280 humidity, temperature & pressure sensor
Designed specifically to work with the Adafruit BME280 Breakout
----> http://www.adafruit.com/products/2650
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
to interface. The device's I2C address is either 0x76 or 0x77.
Adafruit invests time and resources providing this open source code,
please support Adafruit andopen-source hardware by purchasing products
from Adafruit!
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
BSD license, all text above must be included in any redistribution
See the LICENSE file for details.
***************************************************************************/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
unsigned long delayTime;
void setup() {
Serial.begin(9600);
while(!Serial); // time to get serial running
Serial.println(F("BME280 test"));
unsigned status;
// default settings
status = bme.begin();
// You can also pass in a Wire library object like &Wire2
// status = bme.begin(0x76, &Wire2)
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1) delay(10);
}
Serial.println("-- Default Test --");
delayTime = 1000;
Serial.println();
}
void loop() {
printValues();
delay(delayTime);
}
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("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
Как работает код
В данном разделе мы подробно разберем как работает код данной программы
Подключение библиотек и первичная настройка
Код начинается с включения необходимых библиотек: библиотеки wire для использования I2Cибиблиотек Adafruit_Sensor и Adafruit_BME280 для взаимодействия с датчиком BME280.
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Поскольку мы собираемся использовать интерфейс I2C, следующие строки, определяющие выводы SPI, можно закомментировать
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
Далее создаем переменную SEALEVELPRESSURE_HPA
#define SEALEVELPRESSURE_HPA (1013.25)
Эта переменная сохраняет давление на уровне моря в гектопаскалях (эквивалентно милибару). Эта переменная используется для оценки высоты для данного давления путем сравнения его с давлением на уровне моря. В этом примере используется значение по умолчанию, но для получения более точных результатов замените это значение текущим давлением на уровне моря в вашем регионе.
В этом примере по умолчанию используется протокол связи I2C. Как вы можете видеть, вам просто нужно создать объект Adafruit_BME280 с именем bme.
Adafruit_BME280 bme; // I2C
Чтобы использовать SPI, вам нужно закомментировать предыдущую строку и раскомментировать одну из следующих строк.
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
Раздел Setup()
В setup () запускаем последовательный порт со скоростью 9600 бод:
Serial.begin(9600);
И инициализируем датчик
status = bme.begin();
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Вывод значений
В цикле loop() функция printValues() считывает значения с BME280 и выводит результаты в монитор последовательного порта.
void loop() {
printValues();
delay(delayTime);
}
Считывание температуры, влажности, давления и оценки высоты выполняем используя следующие методы объекта bme:
- bme.readTemperature() – считывает температуру в градусах Цельсия;
- bme.readHumidity() – считывает абсолютную влажность;
- bme.readPressure() – считывает давление в ГПа (гектопаскаль = миллибар);
- bme.readAltitude(SEALEVELPRESSURE_HPA) – оценивает высоту в метрах на основе давления на уровне моря.
Демонстрация работы
Загрузите скетч в плату Arduino
Откройте монитор последовательного порта со скоростью передачи данных 9600 бод.
Если все предыдущие шаги были выполнены верно вы должны увидеть показания датчиков
Подведение итогов
BME280 обеспечивает простой и недорогой способ получения показаний давления, температуры и влажности. Датчик взаимодействует через протокол связи I2C, что означает, что вам просто нужно подключить датчик к контактам Arduino I2C.
Написание кода для получения показаний датчика также очень просто благодаря библиотеке BME280_Adafruit. Вам просто нужно использовать методы readTemperature(), readHumidity() и readPressure(). Вы также можете оценить высоту, используя метод readAltitude().