Очередная забавная штучка с АлиЭкспрес. Встречайте мега комбайн от 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 или с нашего сайта и BME280 c GitHub , наш сайта.
Подключение к шине 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); }