Skip to main content

scd41_embedded/
types.rs

1//! Data types.
2
3/// Raw measurement values as returned by the sensor.
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct RawMeasurement {
6    /// CO₂ concentration in ppm.
7    pub co2_ppm: u16,
8    /// Raw temperature ticks.
9    pub temperature_ticks: u16,
10    /// Raw relative humidity ticks.
11    pub humidity_ticks: u16,
12}
13
14/// Converted measurement values.
15#[derive(Debug, Clone, Copy, PartialEq)]
16pub struct Measurement {
17    /// CO₂ concentration in ppm.
18    pub co2_ppm: u16,
19    /// Temperature in °C.
20    pub temperature_c: f32,
21    /// Relative humidity in %RH.
22    pub relative_humidity_percent: f32,
23}
24
25impl Measurement {
26    /// Convert from raw word values.
27    #[must_use]
28    pub fn from_raw(raw: RawMeasurement) -> Self {
29        // Datasheet conversion formulas used by common drivers.
30        // T = -45 + 175 * (ticks / 65535)
31        // RH = 100 * (ticks / 65535)
32        let t = -45.0 + 175.0 * (raw.temperature_ticks as f32) / 65535.0;
33        let rh = 100.0 * (raw.humidity_ticks as f32) / 65535.0;
34
35        Self {
36            co2_ppm: raw.co2_ppm,
37            temperature_c: t,
38            relative_humidity_percent: rh,
39        }
40    }
41}