mirror of
https://codeberg.org/icewind/pms700x.git
synced 2026-06-03 10:04:13 +02:00
passive mode fixes and more return data
This commit is contained in:
parent
c19154ead8
commit
53ba8ebae3
1 changed files with 40 additions and 12 deletions
52
src/lib.rs
52
src/lib.rs
|
|
@ -32,29 +32,47 @@ const MAX_RESPONSE_SIZE: usize = 32;
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct SensorData {
|
pub struct SensorData {
|
||||||
|
/// PM1.0 concentration in µg/m³, corrected for standard atmosphere
|
||||||
|
pm10: u16,
|
||||||
|
/// PM25 concentration in µg/m³, corrected for standard atmosphere
|
||||||
|
pm25: u16,
|
||||||
|
/// PM10 concentration in µg/m³, corrected for standard atmosphere
|
||||||
|
pm100: u16,
|
||||||
|
/// PM1.0 concentration in µg/m³, in current atmosphere
|
||||||
|
pm10_atmos: u16,
|
||||||
|
/// PM25 concentration in µg/m³, in current atmosphere
|
||||||
|
pm25_atmos: u16,
|
||||||
|
/// PM10 concentration in µg/m³, in current atmosphere
|
||||||
|
pm100_atmos: u16,
|
||||||
/// Number of >0.3µm particles per 0.1L
|
/// Number of >0.3µm particles per 0.1L
|
||||||
pm03_concentration: u16,
|
pm03_count: u16,
|
||||||
/// Number of >0.5µm particles per 0.1L
|
/// Number of >0.5µm particles per 0.1L
|
||||||
pm05_concentration: u16,
|
pm05_count: u16,
|
||||||
/// Number of >1.0µm particles per 0.1L
|
/// Number of >1.0µm particles per 0.1L
|
||||||
pm10_concentration: u16,
|
pm10_count: u16,
|
||||||
/// Number of >2.5µm particles per 0.1L
|
/// Number of >2.5µm particles per 0.1L
|
||||||
pm25_concentration: u16,
|
pm25_count: u16,
|
||||||
/// Number of >5.0µm particles per 0.1L
|
/// Number of >5.0µm particles per 0.1L
|
||||||
pm50_concentration: u16,
|
pm50_count: u16,
|
||||||
/// Number of >10.0µm particles per 0.1L
|
/// Number of >10.0µm particles per 0.1L
|
||||||
pm100_concentration: u16,
|
pm100_count: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SensorData {
|
impl SensorData {
|
||||||
pub fn from_raw(raw: &[u8; MAX_RESPONSE_SIZE]) -> Self {
|
pub fn from_raw(raw: &[u8; MAX_RESPONSE_SIZE]) -> Self {
|
||||||
SensorData {
|
SensorData {
|
||||||
pm03_concentration: u16::from_be_bytes([raw[16], raw[17]]),
|
pm10: u16::from_be_bytes([raw[4], raw[5]]),
|
||||||
pm05_concentration: u16::from_be_bytes([raw[18], raw[19]]),
|
pm25: u16::from_be_bytes([raw[6], raw[7]]),
|
||||||
pm10_concentration: u16::from_be_bytes([raw[20], raw[21]]),
|
pm100: u16::from_be_bytes([raw[8], raw[9]]),
|
||||||
pm25_concentration: u16::from_be_bytes([raw[22], raw[23]]),
|
pm10_atmos: u16::from_be_bytes([raw[10], raw[11]]),
|
||||||
pm50_concentration: u16::from_be_bytes([raw[24], raw[25]]),
|
pm25_atmos: u16::from_be_bytes([raw[12], raw[13]]),
|
||||||
pm100_concentration: u16::from_be_bytes([raw[26], raw[27]]),
|
pm100_atmos: u16::from_be_bytes([raw[14], raw[15]]),
|
||||||
|
pm03_count: u16::from_be_bytes([raw[16], raw[17]]),
|
||||||
|
pm05_count: u16::from_be_bytes([raw[18], raw[19]]),
|
||||||
|
pm10_count: u16::from_be_bytes([raw[20], raw[21]]),
|
||||||
|
pm25_count: u16::from_be_bytes([raw[22], raw[23]]),
|
||||||
|
pm50_count: u16::from_be_bytes([raw[24], raw[25]]),
|
||||||
|
pm100_count: u16::from_be_bytes([raw[26], raw[27]]),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -100,6 +118,7 @@ impl<Error, Serial: Read<u8, Error = Error> + Write<u8, Error = Error>, SensorMo
|
||||||
}
|
}
|
||||||
|
|
||||||
self.command_writer.write(&mut self.serial)?;
|
self.command_writer.write(&mut self.serial)?;
|
||||||
|
self.serial.flush()?;
|
||||||
if expect_answer {
|
if expect_answer {
|
||||||
self.reader.fill_data(&mut self.serial)?;
|
self.reader.fill_data(&mut self.serial)?;
|
||||||
}
|
}
|
||||||
|
|
@ -116,16 +135,25 @@ impl<Error, Serial: Read<u8, Error = Error> + Write<u8, Error = Error>, SensorMo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the sensor into active mode
|
||||||
pub fn into_active(mut self) -> Result<Pms700X<Error, Serial, Active>, Error> {
|
pub fn into_active(mut self) -> Result<Pms700X<Error, Serial, Active>, Error> {
|
||||||
nb::block!(self.send_command(Command::SetMode, 1, true))?;
|
nb::block!(self.send_command(Command::SetMode, 1, true))?;
|
||||||
Ok(self.into_mode())
|
Ok(self.into_mode())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the sensor into passive mode
|
||||||
|
///
|
||||||
|
/// Note that after setting the sensor into passive mode, you should wait about 30-50ms
|
||||||
|
/// before trying to read the sensor data or the sensor will not respond
|
||||||
pub fn into_passive(mut self) -> Result<Pms700X<Error, Serial, Passive>, Error> {
|
pub fn into_passive(mut self) -> Result<Pms700X<Error, Serial, Passive>, Error> {
|
||||||
nb::block!(self.send_command(Command::SetMode, 0, true))?;
|
nb::block!(self.send_command(Command::SetMode, 0, true))?;
|
||||||
Ok(self.into_mode())
|
Ok(self.into_mode())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the sensor to sleep or wake it up
|
||||||
|
///
|
||||||
|
/// After waking up the sensor you should wait about 30s before reading the sensor data to wait
|
||||||
|
/// for the sensor to stabilize
|
||||||
pub fn set_sleeping(
|
pub fn set_sleeping(
|
||||||
&mut self,
|
&mut self,
|
||||||
sleeping: Sleep,
|
sleeping: Sleep,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue