Barometer

A barometer is a scientific instrument that is used to measure air pressure in a certain environment. The absolute barometric pressure sensor can measure pressure from 300 Pascal to 1100 hPa.

MetaWear RPro and Cpro, MMR, MMC, MTR, and MetaEnvironment boards come with a Bosch barometer.

The specific barometer model varies between the boards although both barometers are nearly identical save for a few settings. Bosch barometer functions are defined in the barometer_bosch.h header file where functions containing baro_bosch are barometer agnostic where as functions with baro_bmp280 and baro_bme280 are for those specific barometers.

Users can programatically determine which barometer is on their board with the mbl_mw_metawearboard_lookup_module function.

let gyroType = mbl_mw_metawearboard_lookup_module(board, MBL_MW_MODULE_BAROMETER)
switch UInt8(gyroType) {
    case MBL_MW_MODULE_BARO_TYPE_BMP280:
        print("BMP280 barometer")
        break
    case MBL_MW_MODULE_BARO_TYPE_BME280:
        print("BME280 barometer")
        break
    case UInt8(MBL_MW_MODULE_TYPE_NA):
        print("no barometer")
        break
    default:
        print("unknown barometer")
        break
}

Sensor Configuration

The Bosch barometers have 3 configurable parameters:

  • Oversampling

  • Infinite impulse filter (iir) coefficient

  • Standby time

These operational parameters work in conjunction to control the noise, output resolution, and sampling rate. When you are done setting the configuration, call mbl_mw_baro_bosch_write_config to write the changes to the sensor.

// Set oversampling to ultra high resolution
mbl_mw_baro_bosch_set_oversampling(board, MBL_MW_BARO_BOSCH_OVERSAMPLE_ULTRA_HIGH)

// Set standby time to 62.5ms or closest valid value
mbl_mw_baro_bosch_set_standby_time(board, 62.5f)

// Set iir filter coefficient
mbl_mw_baro_bosch_set_iir_filter(board, MBL_MW_BARO_BOSCH_IIR_FILTER_AVG_4)

// Write configuration to the sensor
mbl_mw_baro_bosch_write_config(board)

Pressure Sampling

Pressure data is represented as a float and is in units of Pascals. To receive pressure data, simply subscribe or log the pressure data signal and then start the sensor.

#include "metawear/core/datasignal.h"

void setup_pressure_stream(MblMwMetaWearBoard* board) {
    auto data_handler = [](const MblMwData* data) -> void {
        // Cast value to float*
        printf("%.3fPa\n", *((float*) data->value));
    };
    auto pa_signal= mbl_mw_baro_bosch_get_pressure_data_signal(board);

    mbl_mw_datasignal_subscribe(pa_signal, data_handler);
    mbl_mw_baro_bosch_start(board);
}

Altitude Sampling

Altitude data is represented as a float and is in units of meters. To receive altitude data, simply subscribe or log the altitude data signal and then start the sensor.

mbl_mw_baro_bosch_set_oversampling(device.board, MBL_MW_BARO_BOSCH_OVERSAMPLING_ULTRA_LOW_POWER)
mbl_mw_baro_bosch_set_iir_filter(device.board, MBL_MW_BARO_BOSCH_IIR_FILTER_OFF)
mbl_mw_baro_bmp280_set_standby_time(device.board, MBL_MW_BARO_BMP280_STANDBY_TIME_0_5ms)
mbl_mw_baro_bosch_write_config(device.board)

let signal = mbl_mw_baro_bosch_get_altitude_data_signal(device.board)!
mbl_mw_datasignal_subscribe(signal, bridge(obj: self)) { (context, obj) in
    let altitude: Float = obj!.pointee.valueAs()
    print(String(format: "%.3f", altitude))
}
mbl_mw_baro_bosch_start(device.board)

streamingCleanup[signal] = { // Callback from user
    mbl_mw_baro_bosch_stop(self.device.board)
    mbl_mw_datasignal_unsubscribe(signal)
}