Fix line requests in take_measurement

This commit is contained in:
FliegendeWurst 2023-09-24 12:36:50 +02:00
parent 5cfe8fe3ec
commit c17424a686
2 changed files with 13 additions and 6 deletions

View File

@ -31,6 +31,10 @@ fn main() {
.unwrap(); .unwrap();
while temps.len() < 5 && attempts < 10 { while temps.len() < 5 && attempts < 10 {
if let Ok((rh, temp)) = raspi_oled::am2302_reading(&line) { if let Ok((rh, temp)) = raspi_oled::am2302_reading(&line) {
// TODO: try out gpio_am2302_rs!
//if let Ok(reading) = gpio_am2302_rs::try_read(26) {
//let rh = reading.humidity as i64;
//let temp = (reading.temperature * 10.0) as i64;
if rh > 0 && temp < 500 { if rh > 0 && temp < 500 {
rhs.push(rh); rhs.push(rh);
temps.push(temp); temps.push(temp);
@ -43,10 +47,13 @@ fn main() {
// median = hopefully no faulty readings // median = hopefully no faulty readings
temps.sort(); temps.sort();
rhs.sort(); rhs.sort();
let rh = rhs[rhs.len() / 2];
let temp = temps[temps.len() / 2];
println!("info: acquired {} readings (temps {:?}, rhs {:?}), using rh {} and temp {}", temps.len(), temps, rhs, rh, temp);
database database
.execute( .execute(
"INSERT INTO sensor_readings (time, humidity, celsius) VALUES (?1, ?2, ?3)", "INSERT INTO sensor_readings (time, humidity, celsius) VALUES (?1, ?2, ?3)",
params![time.as_secs(), rhs[rhs.len() / 2], temps[temps.len() / 2]], params![time.as_secs(), rh, temp],
) )
.unwrap(); .unwrap();
} }

View File

@ -76,6 +76,7 @@ fn read_events(line: &gpio_cdev::Line, timeout: std::time::Duration) -> Result<V
} }
} }
if events.len() < 81 { if events.len() < 81 {
println!("error: only got {} events", events.len());
return Err(SensorError::Timeout); return Err(SensorError::Timeout);
} }
Ok(events) Ok(events)
@ -162,15 +163,14 @@ impl From<gpio_cdev::Error> for SensorError {
} }
pub fn am2302_reading(line: &Line) -> Result<(u16, u16), SensorError> { pub fn am2302_reading(line: &Line) -> Result<(u16, u16), SensorError> {
line.request(LineRequestFlags::OUTPUT, 1, "rust-am2302").unwrap(); let out = line.request(LineRequestFlags::OUTPUT, 1, "rust-am2302").unwrap();
out.set_value(1)?;
sleep(Duration::from_millis(500)); sleep(Duration::from_millis(500));
set_max_priority(); set_max_priority();
// set low for 20 ms // set low for 20 ms
if let Err(e) = line.request(LineRequestFlags::OUTPUT, 0, "rust-am2302") { out.set_value(0)?;
set_normal_priority();
return Err(SensorError::Io(e));
}
sleep(Duration::from_millis(3)); sleep(Duration::from_millis(3));
drop(out);
let events = read_events(&line, Duration::from_secs(1)); let events = read_events(&line, Duration::from_secs(1));
println!("{:?} {:?}", events, events.as_ref().map(|x| x.len())); println!("{:?} {:?}", events, events.as_ref().map(|x| x.len()));