BME280, ардуино и BluePill

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

Оставьте комментарий

Создайте подобный сайт на WordPress.com
Начало работы