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}