Все в одном, BME280(BMP280). Датчик температуры, влажности и давления.

Очередная забавная штучка с АлиЭкспрес. Встречайте мега комбайн от BOSCH, цифровой датчик температуры,влажности,давления  BME280.  По мнению некоторых один из самых точных датчиков по недорогой  цене. Имеет SPI (поддерживает 3-4-провода SPI) и I2C интерфейс. Есть у него брат близнец BMP280 , единственное отличие в нем нету датчика влажности. Но давайте по порядку и подробней.

Характеристики :

  • Диапазон измерения давления: 300 – 1100 hPa (±1.0 hPa, 0 . . . 65 °C )
  • Диапазон измерения температуры: от -40  до 85 °C ( ±0.5 °C)
  • Диапазон измерения влажности: 0 — 100 % (20…80 %, 25 °C,  ± 3%) в BMP280 отсутствует!
  • Напряжение питания 3.3 ВНо в готовом модуле из Китая уже стоит стабилизатор и согласование уровней логики.
  • Пиковое потребление 714 µA, в режиме сна 0.3 µA
  • Время старта модуля: 2 ms

Датчик имеет три режима работы : Sleep mode, Forced mode, Normal mode.

  • SLEEP – режим сна,
  • FORCED – режим аналогичен BMP085 и BMP180. То есть, дали команду на измерение, подождали, считали значения, датчик перешел в спящий режим.
  • NORMAL – этот режим наиболее интересен и загоняет датчик в циклическую работу. То есть, он самостоятельно через определенное время, которое можно задать, выходит из режима сна и выполняет измерения, сохраняет данные в регистры памяти и вновь засыпает на указанное время.

Более подробно все это написано в Datasheet(BMP280) и Datasheet(BME280).

Подключение, библиотека, код.

Мне совершенно не хочется разбираться во всех тонкостях работы с этим датчиком. По этому скачаем уже готовую библиотеку ( Adafruit_BMP280_Library )   GitHub или с нашего сайта и BME280GitHub , наш сайта.

Подключение к шине I2C (SCL и SDA контакты). 

Схема подключения достаточно проста:

  • VIN к контакту Arduino  3.3V или 5V
  • GND к контакту Arduino  GND
  • SCK к контакту Arduino Nano SCL (A5)
  • SDA к контакту Arduino Nano SDA (A4)

Тестовый скетч для BMP280 будет выглядеть так:

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

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

Adafruit_BMP280 bmp; // I2C


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

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

/* Настройки по умолчанию */++
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Режим работы */
Adafruit_BMP280::SAMPLING_X2, /* Температура передискретизация */
Adafruit_BMP280::SAMPLING_X16, /* Давление передискретизация */
Adafruit_BMP280::FILTER_X16, /* Фильрация. */
Adafruit_BMP280::STANDBY_MS_500); /* Интервал включения. */
}

void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");

Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure());
Serial.println(" Pa");

Serial.print(F("Приблизительная высота= "));
Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
Serial.println(" m");

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

Возможные параметры :

/** Частота передискретизации датчика. */
/** No over-sampling. */
SAMPLING_NONE 
/** 1x over-sampling. */
SAMPLING_X1 
/** 2x over-sampling. */
SAMPLING_X2 
/** 4x over-sampling. */
SAMPLING_X4  
/** 8x over-sampling. */
SAMPLING_X8  
/** 16x over-sampling. */
SAMPLING_X16  


/** Режимы работы */
/** Sleep mode. */
MODE_SLEEP 
/** Forced mode. */
MODE_FORCED 
/** Normal mode. */
MODE_NORMAL 
/** Software reset. */
MODE_SOFT_RESET_CODE 



/** Уровень фильтрации данных датчиков. */
/** No filtering. */
FILTER_OFF 
/** 2x filtering. */
FILTER_X2 
/** 4x filtering. */
FILTER_X4 
/** 8x filtering. */
FILTER_X8 
/** 16x filtering. */
FILTER_X16 


/** Продолжительность ожидания в ms */
/** 1 ms standby. */
STANDBY_MS_1 
/** 63 ms standby. */
STANDBY_MS_63 
/** 125 ms standby. */
STANDBY_MS_125 
/** 250 ms standby. */
STANDBY_MS_250 
/** 500 ms standby. */
STANDBY_MS_500 
/** 1000 ms standby. */
STANDBY_MS_1000 
/** 2000 ms standby. */
STANDBY_MS_2000 
/** 4000 ms standby. */
STANDBY_MS_4000 /Максимальная задержка по datasheep

Для BME280 тестовый скетч будет таким :

#include <BME280I2C.h>
#include <Wire.h>

#define SERIAL_BAUD 115200

BME280I2C bme;    // Default : forced mode, standby time = 1000 ms
                  // передискретизация = pressure Г—1, temperature Г—1, humidity Г—1, filter off,

//Для примера настройки датчика не по дефолту

BME280I2C::Settings settings(
BME280::OSR_X1,
BME280::OSR_X1,
BME280::OSR_X1,
BME280::Mode_Forced,
BME280::StandbyTime_1000ms,
BME280::Filter_Off,
BME280::SpiEnable_False,
BME280I2C::I2CAddr_0x76 // I2C address. I2C specific.
);

BME280I2C bme(settings);
   Возможные параметры
  • OSR_Off
  • OSR_X1
  • OSR_X2
  • OSR_X4
  • OSR_X8
  • OSR_X16
  • Mode_Sleep
  • Mode_Forced
  • Mode_Normal
  • StandbyTime_500us
  • StandbyTime_62500us
  • StandbyTime_125ms
  • StandbyTime_250ms
  • StandbyTime_50ms
  • StandbyTime_1000ms
  • StandbyTime_10ms
  • StandbyTime_20ms
  • Filter_Off
  • Filter_1
  • Filter_2
  • Filter_4
  • Filter_8
  • Filter_16
//


void setup()
{
  Serial.begin(SERIAL_BAUD);

  while(!Serial) {} // Wait

  Wire.begin();

  while(!bme.begin())
  {
    Serial.println("Could not find BME280 sensor!");
    delay(1000);
  }

  switch(bme.chipModel())
  {
     case BME280::ChipModel_BME280:
       Serial.println("Found BME280 sensor! Success.");
       break;
     case BME280::ChipModel_BMP280:
       Serial.println("Found BMP280 sensor! No Humidity available.");
       break;
     default:
       Serial.println("Found UNKNOWN sensor! Error!");
  }
}

//////////////////////////////////////////////////////////////////
void loop()
{
   printBME280Data(&Serial);
   delay(500);
}

//////////////////////////////////////////////////////////////////
void printBME280Data
{
   float temp(NAN), hum(NAN), pres(NAN);

   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
   BME280::PresUnit presUnit(BME280::PresUnit_Pa);

//
PresUnit_Pa
PresUnit_hPa
PresUnit_inHg
PresUnit_atm
PresUnit_bar
PresUnit_torr
PresUnit_psi
//
   bme.read(pres, temp, hum, tempUnit, presUnit);

   print("Temp: ");
   print(temp);
   print("В°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
   print("\t\tHumidity: ");
   print(hum);
   print("% RH");
   print("\t\tPressure: ");
   print(pres);
   println("Pa");
   delay(1000);
}