Датчик BME680 от Bosch дает вам все, что вам нужно, в одном маленьком корпусе. Этот компактный сенсор обладает возможностями измерения температуры, влажности, атмосферного давления и газа. Он может передавать данные по интерфейсу SPI или I2C, при этом все эти возможности можно приобрести по сравнительно небольшой цене.

Как и BME280 и BMP280, этот прецизионный датчик от Bosch может измерять влажность с точностью ±3%, барометрическое давление с абсолютной точностью ±1 гПа и температуру с точностью ± 1,0 °C. Поскольку давление изменяется с высотой, и измерения давления настолько хороши, вы также можете использовать его как высотомер с точностью ±1 метр или выше.
BME680 лучше, чем предыдущие датчики, поскольку в нем содержится небольшой сенсор летучих органических соединений. Нагретый оксид металла изменяет сопротивление в зависимости от летучих органических соединений в воздухе, поэтому его можно использовать для обнаружения газов и спиртов, таких как этанол, спирт и угарный газ, и для измерения качества воздуха. Обратите внимание, что это даст вам одно значение сопротивления, с общим содержанием летучих органических соединений, он не может дифференцировать газы или спирты.
Пожалуйста, обратите внимание, что этот датчик, как и все датчики газа, имеет изменчивость, и для получения точных измерений вы хотите откалибровать его по известным источникам. Тем не менее, для стандартных датчиков окружающей среды, это даст вам хорошее представление о тенденциях и сравнений.
На сегодняшний день имеется немало плат с датчиками BME680, но принцип работы и связи у них всех одинаков.

В этом примере мы подключим датчик BME680 к Arduino и будем считывать данные о температуре, давлении, влажности, газе и высоте. Схема подключения датчика BME680 к Arduino показана далее.

Теперь перейдем к программированию. Вам нужно будет импортировать библиотеки датчиков adafruit и bme680 – вы можете добавить их с помощью менеджера библиотек. В нашем случае датчик использовал адрес 0x76, по умолчанию 0x77, поэтому вам, возможно, придется изменить строку с if (!Bme.begin(0x76)) на if (!Bme.begin ()). Полный код программы представлен далее.
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme; // I2C
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println(F("BME680 test"));
if (!bme.begin(0x76))
{
Serial.println("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop()
{
if (! bme.performReading())
{
Serial.println("Failed to perform reading :(");
return;
}
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.println();
delay(2000);
}
В итоге должно в последовательном мониторе выводиться что-то вроде этого:

© digitrode.ru