BME280 – это дешевый и простой в применении датчик, который измеряет температуру, влажность и атмосферное давление.
Технические характеристики:
- Давление в диапазоне 300-1100 гПа
- Влажность в диапазоне 20…80 % RH
- Температура в диапазоне -40…+85 °C
- Поддержка интерфейсов I2C и SPI;
- Напряжение питания 1,7В – 3,6В;
- Средний ток потребления 2,7мкА;
- 3 режима работы – режим сна, режим FORCED (проведение измерения, считывание значения, переход в спящий режим), режим NORMAL (перевод датчика в циклическую работу – то есть устройство самостоятельно через установленное время выходит из режима сна, проводит измерения, считывает показания, сохраняет измеренные значения и переходит снова в режим сна).
Работа с ардуино
Работать можно как по SPI протоколу, так и по I2C. Из-за простоты подключения был выбран последний.
Есть несколько библиотек, написанных для этого сенсора. Мной была выбрана библиотека BME280I2C.h, установить которую можно через Library Manager в Arduino IDE.
Скетч выводит в монитор значения температуры, влажности, давления.
#include <BME280I2C.h>
#include <Wire.h>
#define SERIAL_BAUD 115200
BME280I2C bme; // Default : forced mode, standby time = 1000 ms
// Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
void setup()
{
Serial.begin(SERIAL_BAUD);
while(!Serial) {} // Wait
Wire.begin();
while(!bme.begin())
{
Serial.println("Could not find BME280 sensor!");
delay(1000);
}
// bme.chipID(); // Deprecated. See chipModel().
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
(
Stream* client
)
{
float temp(NAN), hum(NAN), pres(NAN);
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
bme.read(pres, temp, hum, tempUnit, presUnit);
client->print("Temp: ");
client->print(temp);
client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
client->print("\t\tHumidity: ");
client->print(hum);
client->print("% RH");
client->print("\t\tPressure: ");
client->print(pres/133.32); // перевод Па в мм рт.ст.
client->println(" mmHg");
delay(1000);
}
Работа с BluePill
Несмотря на то, что BluePill имеет три I2C интерфейса, из Arduino IDE работает только первый. Поэтому подключаться надо к пинам PB6 и PB7. В остальном и библиотека Wire.h и библиотека BME280I2C.h наботают на BluePill без проблем.
Скетч для BluePill не потребовал никаких изменений. Он полностью идентичен скетчу для Arduino Uno.
#include <BME280I2C.h>
#include <Wire.h>
#define SERIAL_BAUD 115200
BME280I2C bme; // Default : forced mode, standby time = 1000 ms
// Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
void setup()
{
Serial.begin(SERIAL_BAUD);
while(!Serial) {} // Wait
Wire.begin();
while(!bme.begin())
{
Serial.println("Could not find BME280 sensor!");
delay(1000);
}
// bme.chipID(); // Deprecated. See chipModel().
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
(
Stream* client
)
{
float temp(NAN), hum(NAN), pres(NAN);
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
bme.read(pres, temp, hum, tempUnit, presUnit);
client->print("Temp: ");
client->print(temp);
client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
client->print("\t\tHumidity: ");
client->print(hum);
client->print("% RH");
client->print("\t\tPressure: ");
client->print(pres/133.32); // перевод Па в мм рт.ст.
client->println(" mmHg");
delay(1000);
}