1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#[derive(Debug, Copy, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
/// List of SCD4x sensor commands.
pub enum Command {
/// Start periodic measurement, signal update interval is 5 seconds.
StartPeriodicMeasurement,
/// Read sensor output. The measurement data can only be read out
/// once per signal update interval as the buffer is emptied upon read-out.
ReadMeasurement,
/// Stop periodic measurement and return to idle mode for sensor configuration or to safe energy.
StopPeriodicMeasurement,
/// The temperature offset has no influence on the SCD4x CO2 accuracy. Setting the
/// temperature offset of the SCD4x inside the customer device correctly allows
/// the user to leverage the RH and T output signal.
SetTemperatureOffset,
/// Get current temperature offset.
GetTemperatureOffset,
/// Set the height above sea level. Should be done while the sensor is in idle mode.
SetSensorAltitude,
/// Get the height above sea level.
GetSensorAltitude,
/// Set ambient pressure.
SetAmbientPressure,
/// Perform forced recalibration
PerformForcedRecalibration,
/// Set the current state (enabled / disabled) of the automatic self-calibration.
/// By default, ASC is enabled.
SetAutomaticSelfCalibrationEnabled,
/// Get the current state of the automatic self-calibration.
GetAutomaticSelfCalibrationEnabled,
/// Set the target background (lower-bound) CO2 level the sensor expects to measure
SetAutomaticSelfCalibrationTarget,
/// Get the target background (lower-bound) CO2 level
GetAutomaticSelfCalibrationTarget,
/// Start low power periodic measurement, signal update interval is approximately 30 seconds.
StartLowPowerPeriodicMeasurement,
/// Is data ready for read-out?
GetDataReadyStatus,
/// Save to non-volatile memory configuration settings
/// such as the temperature offset, sensor altitude and the ASC enabled/disabled parameter.
PersistSettings,
/// Reading out the serial number can be used to identify the chip and to verify the presence of the sensor.
GetSerialNumber,
/// This feature can be used as an end-of-line test to check sensor functionality
/// and the customer power supply to the sensor.
PerformSelfTest,
/// Resets all configuration settings stored in the EEPROM and erases the
/// FRC and ASC algorithm history.
PerformFactoryReset,
/// Reinitializes the sensor by reloading user settings from EEPROM.
Reinit,
/// Allows on-demand measurements
#[cfg(feature = "scd41")]
MeasureSingleShot,
/// Allows on-demand, non-blocking measurements
#[cfg(feature = "scd41")]
MeasureSingleShotNonBlocking,
/// On-demand measurement of CO2 concentration, relative humidity and temperature.
#[cfg(feature = "scd41")]
MeasureSingleShotRhtOnly,
/// Put the sensor from idle to sleep mode to reduce current consumption.
#[cfg(feature = "scd41")]
PowerDown,
/// Wake up sensor from sleep mode to idle mode.
#[cfg(feature = "scd41")]
WakeUp,
}
impl Command {
// Command, execution time ms, possibility to execute during measurements.
pub fn as_tuple(self) -> (u16, u32, bool) {
match self {
Self::StartPeriodicMeasurement => (0x21B1, 1, false),
Self::ReadMeasurement => (0xEC05, 1, true),
Self::StopPeriodicMeasurement => (0x3F86, 500, true),
Self::SetTemperatureOffset => (0x241D, 1, false),
Self::GetTemperatureOffset => (0x2318, 1, false),
Self::SetSensorAltitude => (0x2427, 1, false),
Self::GetSensorAltitude => (0x2322, 1, false),
Self::SetAmbientPressure => (0xE000, 1, true),
Self::PerformForcedRecalibration => (0x362F, 400, false),
Self::SetAutomaticSelfCalibrationEnabled => (0x2416, 1, false),
Self::GetAutomaticSelfCalibrationEnabled => (0x2313, 1, false),
Self::SetAutomaticSelfCalibrationTarget => (0x243A, 1, false),
Self::GetAutomaticSelfCalibrationTarget => (0x233F, 1, false),
Self::StartLowPowerPeriodicMeasurement => (0x21AC, 0, false),
Self::GetDataReadyStatus => (0xE4B8, 1, true),
Self::PersistSettings => (0x3615, 800, false),
Self::GetSerialNumber => (0x3682, 1, false),
Self::PerformSelfTest => (0x3639, 10_000, false),
Self::PerformFactoryReset => (0x3632, 1200, false),
Self::Reinit => (0x3646, 20, false),
#[cfg(feature = "scd41")]
Self::MeasureSingleShot => (0x219D, 5000, false),
#[cfg(feature = "scd41")]
Self::MeasureSingleShotNonBlocking => (0x219D, 1, false),
#[cfg(feature = "scd41")]
Self::MeasureSingleShotRhtOnly => (0x2196, 50, false),
#[cfg(feature = "scd41")]
Self::PowerDown => (0x36E0, 1, false),
#[cfg(feature = "scd41")]
Self::WakeUp => (0x36F6, 20, false),
}
}
}