BME688 (производство Bosch Sensortec) представляет собой первый датчик газа с искусственным интеллектом (ИИ) и встроенными высоколинейными и высокоточными датчиками влажности и температуры. Данный высокоинтегрированный датчик газа способен обнаруживать летучие органические соединения, летучие соединения серы и другие газы, такие как монооксид углерода (CO) и водород в диапазоне ppb (частей на миллиард).

В данном материале мы рассмотрим, как подключить датчик BME688 к Arduino и считывать соответствующую информацию.
Новый датчик BME688 обратно совместим с BME680. В дополнение ко всем функциям BME680, BME688 имеет функцию газового сканера. В стандартной конфигурации наличие летучих соединений серы обнаруживается индикаторным образом. Газовый сканер также можно настроить в отношении чувствительности, селективности, скорости передачи данных и энергопотребления. Инструмент BME AI-Studio позволяет клиентам обучать газовый сканер BME688 их конкретному применению, например, в бытовой технике, продуктах Интернета вещей (IoT) или умном доме.
Датчик газа в BM688 имеет широкую чувствительность и реагирует на большинство летучих соединений, а также на многие другие газы, загрязняющие воздух в помещении. Интенсивность сигнала обычно зависит от химической активности газов. В отличие от датчиков, селективных для одного конкретного компонента, BME688 способен измерять сумму ЛОС/загрязняющих веществ в окружающем воздухе. Это позволяет BME688 обнаруживать, например, выделение газов краской, мебелью и/или мусором, высокие уровни летучих органических соединений из-за приготовления пищи, потребления пищи, выдыхаемого воздуха и/или потоотделения.
На основе датчика BME688 выпускается плата SS-BME688#I2C SKU, которую мы будем использовать в рамках данного проекта.

Подключение данной платы к Arduino производится с помощью интерфейса I2C согласно следующей схеме.

Для организации работы Arduino с датчиком BM688 загрузите библиотеку BME68x Arduino отсюда: https://itbrainpower.net/downloadables/sSense_BME680.zip. Распакуйте библиотеку и установите в папку с библиотеками Arduino. Перезагрузите Arduino IDE.
Создайте папку с именем «ssense_BME688_example». Скопируйте код из BME688, приведенный далее, и вставьте его в один новый файл и сохраните файл как «ssense_BME688_example.ino» в папке, созданной ранее.
#include "sSense_BME680.h"
#define SERIAL_SPEED 19200//;
BME680_Class BME680;
float altitude(const float seaLevel=1013.25)
{
static float Altitude;
int32_t temp, hum, press, gas;
BME680.getSensorData(temp,hum,press,gas);
Altitude = 44330.0*(1.0-pow(((float)press/100.0)/seaLevel,0.1903));
return(Altitude);
}
float calculate_altitude( float pressure, bool metric = true, float seaLevelPressure = 101325)
{
float altitude = NAN;
if (!isnan(pressure) && !isnan(seaLevelPressure)){
altitude = 1000.0 * ( seaLevelPressure - pressure ) / 3386.3752577878;
}
return metric ? altitude * 0.3048 : altitude;
}
float temperatureCompensatedAltitude(int32_t pressure, float temp=21.0 /*Celsius*/, float seaLevel=1013.25)
{
float Altitude;
Altitude = (pow((seaLevel/((float)pressure/100.0)), (1/5.257))-1)*(temp + 273.15) / 0.0065;
return(Altitude);
}
void setup()
{
DebugPort.begin(SERIAL_SPEED);
while(!DebugPort) {delay(10);}
//delay(1000);
DebugPort.println("s-Sense BME68x I2C sensor.");
DebugPort.print("- Initializing BME68x sensor\n");
while (!BME680.begin(I2C_STANDARD_MODE))
{
DebugPort.println("- Unable to find BME68x. Waiting 1 seconds.");
delay(1000);
}
DebugPort.println("- Setting 16x oversampling for all sensors");
BME680.setOversampling(TemperatureSensor,Oversample16);
BME680.setOversampling(HumiditySensor, Oversample16);
BME680.setOversampling(PressureSensor, Oversample16);
DebugPort.println("- Setting IIR filter to a value of 4 samples");
BME680.setIIRFilter(IIR4);
DebugPort.println("- Setting gas measurement to 320C for 150ms");
BME680.setGas(320,150);
DebugPort.println();
}
void loop()
{
//static uint8_t loopCounter = 0;
static int32_t temperature, humidity, pressure, gas;
BME680.getSensorData(temperature,humidity,pressure,gas);
DebugPort.print("\r\nSensor data >>\t\t");
DebugPort.print(temperature/100.0,2);
DebugPort.print("C\t");
DebugPort.print(humidity/1000.0,2);
DebugPort.print("%\t");
DebugPort.print(pressure/100.0,2);
DebugPort.print("hPa\t");
//DebugPort.print(pressure);
//DebugPort.print("Pa ");
DebugPort.print(gas/100.0,2);
DebugPort.println("mOhm");
DebugPort.println("\r\nCalculated altitude");
DebugPort.print("temp comp [CASIO equation]: ");
//temperatureCompensatedAltitude(int32_t pressure, float temp =21.0, const float seaLevel=1013.25)
DebugPort.print(temperatureCompensatedAltitude(pressure, temperature/100.0/*, 1022.0*/),2);
DebugPort.print("m\t");
DebugPort.print("NOAA equation: ");
//float calculate_altitude( float pressure, bool metric = true, float seaLevelPressure = 101325)
DebugPort.print(calculate_altitude((long)pressure,true),2);
//DebugPort.print(calculate_altitude((long)pressure,true, (long)102200.0),2);
DebugPort.print("m\t");
DebugPort.print("WIKI equation: ");
DebugPort.print(altitude(),2);
DebugPort.println("m \r\n");
delay(1000);
}
Скомпилируйте и загрузите код на плату Arduino. Данные датчика можно увидеть в последовательном мониторе Arduino (установите скорость на 19200 бит/с).
В код мы включили некоторую интерпретацию данных датчика (расчет высоты тремя способами): очень простой алгоритм, алгоритм на основе NOAA (функция перенесена из библиотеки BME280/BMP280 Arduino) и реализация расчета высоты CASIO – наиболее точный расчет высоты с алгоритмом температурной компенсации.
И последнее, но не менее важное: IAQ (индекс качества воздуха), селективность сканера целевого газа, данные VOC, VSC и другие функции BME688 могут быть доступны с помощью библиотеки «BSEC fusion library» и других связанных библиотек от Bosch Sensortec.
© digitrode.ru