From 8f5fcdc8ec29a74f8bd90f9edd93484570813b37 Mon Sep 17 00:00:00 2001 From: Ilya Rodichev Date: Sat, 25 Jan 2025 19:22:32 +0300 Subject: [PATCH] enable IIR filtering for BME280 --- airrohr-firmware/airrohr-firmware.ino | 3 ++- airrohr-firmware/bmx280_i2c.cpp | 2 ++ airrohr-firmware/bmx280_i2c.h | 30 +++++++++++++++++++++------ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/airrohr-firmware/airrohr-firmware.ino b/airrohr-firmware/airrohr-firmware.ino index 7b6b4cb47..9ea796237 100644 --- a/airrohr-firmware/airrohr-firmware.ino +++ b/airrohr-firmware/airrohr-firmware.ino @@ -5408,7 +5408,8 @@ static bool initBMX280(char addr) BMX280::MODE_FORCED, BMX280::SAMPLING_X1, BMX280::SAMPLING_X1, - BMX280::SAMPLING_X1); + BMX280::SAMPLING_X1, + BMX280::IIR_16); return true; } else diff --git a/airrohr-firmware/bmx280_i2c.cpp b/airrohr-firmware/bmx280_i2c.cpp index 562953569..b89d9a657 100644 --- a/airrohr-firmware/bmx280_i2c.cpp +++ b/airrohr-firmware/bmx280_i2c.cpp @@ -129,6 +129,7 @@ void BMX280::setSampling(sensor_mode mode, sensor_sampling tempSampling, sensor_sampling pressSampling, sensor_sampling humSampling, + iir_filter iirFilter, standby_duration duration) { _measReg.mode = mode; @@ -140,6 +141,7 @@ void BMX280::setSampling(sensor_mode mode, config _configReg; _configReg.t_sb = duration; + _configReg.filter = iirFilter; // making sure sensor is in sleep mode before setting configuration // as it otherwise may be ignored diff --git a/airrohr-firmware/bmx280_i2c.h b/airrohr-firmware/bmx280_i2c.h index e7138f8fc..bc2fd6c65 100644 --- a/airrohr-firmware/bmx280_i2c.h +++ b/airrohr-firmware/bmx280_i2c.h @@ -50,6 +50,19 @@ class BMX280 { SAMPLING_X16 = 0b101 }; + /**************************************************************************/ + /*! + @brief IIR filter + */ + /**************************************************************************/ + enum iir_filter { + IIR_NONE = 0b000, + IIR_2 = 0b001, + IIR_4 = 0b010, + IIR_8 = 0b011, + IIR_16 = 0b100 + }; + /**************************************************************************/ /*! @brief power modes @@ -82,6 +95,7 @@ class BMX280 { sensor_sampling tempSampling = SAMPLING_X16, sensor_sampling pressSampling = SAMPLING_X16, sensor_sampling humSampling = SAMPLING_X16, + iir_filter iirFilter = IIR_NONE, standby_duration duration = STANDBY_MS_0_5); void takeForcedMeasurement(); @@ -146,14 +160,18 @@ class BMX280 { // 111 = 20 ms uint8_t t_sb : 3; ///< inactive duration (standby time) in normal mode - // unused - don't set - uint8_t none : 1; ///< unused - don't set + // Controls the time constant of the IIR filter + // 000 = off + // 001 = 2 + // 010 = 4 + // 011 = 8 + // 100, others = 16 + uint8_t filter : 3; ///< Controls the time constant of the IIR filter + uint8_t none : 1; ///< unused - don't set uint8_t spi3w_en : 1; ///< unused - don't set - - uint8_t _unused : 3; - + /// @return combined config register - uint8_t get() { return (t_sb << 5); } + uint8_t get() { return (t_sb << 5) | (filter << 2); } }; /**************************************************************************/