Trait bsec::bme::BmeSensor[][src]

pub trait BmeSensor {
    type Error: Debug;
    fn start_measurement(
        &mut self,
        settings: &BmeSettingsHandle<'_>
    ) -> Result<Duration, Self::Error>;
fn get_measurement(&mut self) -> Result<Vec<Input>, Self::Error>; }
Expand description

Trait to implement for your specific hardware to obtain measurements from the BME sensor.

Example

An rudimentary implementation for the BME680 sensor with the bme680 crate might look like this:

use bme680::{Bme680, OversamplingSetting, PowerMode, SettingsBuilder};
use bsec::{Input, InputKind};
use bsec::bme::{BmeSensor, BmeSettingsHandle};
use embedded_hal::blocking::{delay::DelayMs, i2c};
use std::fmt::Debug;
use std::time::Duration;

pub struct Bme680Sensor<I2C, D>
where
    D: DelayMs<u8>,
    I2C: i2c::Read + i2c::Write
{
    bme680: Bme680<I2C, D>,
}

impl<I2C, D> BmeSensor for Bme680Sensor<I2C, D>
where
    D: DelayMs<u8>,
    I2C: i2c::Read + i2c::Write,
    <I2C as i2c::Read>::Error: Debug,
    <I2C as i2c::Write>::Error: Debug,
{
    type Error = bme680::Error<<I2C as i2c::Read>::Error, <I2C as i2c::Write>::Error>;

    fn start_measurement(
        &mut self,
        settings: &BmeSettingsHandle,
    ) -> Result<std::time::Duration, Self::Error> {
        let settings = SettingsBuilder::new()
            .with_humidity_oversampling(OversamplingSetting::from_u8(
                settings.humidity_oversampling(),
            ))
            .with_temperature_oversampling(OversamplingSetting::from_u8(
                settings.temperature_oversampling(),
            ))
            .with_pressure_oversampling(OversamplingSetting::from_u8(
                settings.pressure_oversampling(),
            ))
            .with_run_gas(settings.run_gas())
            .with_gas_measurement(
                Duration::from_millis(settings.heating_duration().into()),
                settings.heater_temperature(),
                20,
            )
            .build();
        self.bme680
            .set_sensor_settings(settings)?;
        let profile_duration = self.bme680.get_profile_dur(&settings.0)?;
        self.bme680.set_sensor_mode(PowerMode::ForcedMode)?;
        Ok(profile_duration)
    }

    fn get_measurement(&mut self) -> nb::Result<Vec<Input>, Self::Error> {
        let (data, _state) = self.bme680.get_sensor_data()?;
        Ok(vec![
            Input {
                sensor: InputKind::Temperature,
                signal: data.temperature_celsius(),
            },
            Input {
                sensor: InputKind::Pressure,
                signal: data.pressure_hpa(),
            },
            Input {
                sensor: InputKind::Humidity,
                signal: data.humidity_percent(),
            },
            Input {
                sensor: InputKind::GasResistor,
                signal: data.gas_resistance_ohm() as f32,
            },
        ])
    }
}

Associated Types

type Error: Debug[src]

Expand description

Error type if an operation with the sensor fails.

Loading content...

Required methods

fn start_measurement(
    &mut self,
    settings: &BmeSettingsHandle<'_>
) -> Result<Duration, Self::Error>
[src]

Expand description

Starts a sensor measurement.

Use settings to configure your BME sensor as requested by the BSEC algorithm.

Shoud return the duration after which the measurement will be available or an error.

fn get_measurement(&mut self) -> Result<Vec<Input>, Self::Error>[src]

Expand description

Read a finished sensor measurement.

Returns the sensor measurements as a vector with an item for each physical sensor read.

To compensate for heat sources near the sensor, add an additional output to the vector, using the sensor type super::InputKind::HeatSource and the desired correction in degrees Celsius.

Loading content...

Implementors

impl BmeSensor for FakeBmeSensor[src]

type Error = UnitError

fn start_measurement(
    &mut self,
    _: &BmeSettingsHandle<'_>
) -> Result<Duration, UnitError>
[src]

fn get_measurement(&mut self) -> Result<Vec<Input>, UnitError>[src]

impl<I2C, D> BmeSensor for Bme680Sensor<I2C, D> where
    D: DelayMs<u8>,
    I2C: Read + Write,
    <I2C as Read>::Error: Debug,
    <I2C as Write>::Error: Debug
[src]

type Error = Error<<I2C as Read>::Error, <I2C as Write>::Error>

fn start_measurement(
    &mut self,
    settings: &BmeSettingsHandle<'_>
) -> Result<Duration, Self::Error>
[src]

fn get_measurement(&mut self) -> Result<Vec<Input>, Self::Error>[src]

Loading content...