#dht22 #driver #temperature-sensor #temperature #temperature-humidity #humidity #data-transfer

无 std dht22-driver

无 std,无依赖,平台无关的 dht22 传感器驱动

2 个版本

0.1.1 2024年1月2日
0.1.0 2024年1月2日

#657硬件支持

MIT/Apache

13KB
169

DHT22

无 std,无依赖,平台无关的 dht22 传感器驱动

特性

  • critical-section 默认使用,以防止中断干扰传感器的基于时序的数据传输协议。虽然建议尽可能使用,但如果以其他方式禁用中断,驱动程序仍然可以可靠地工作。否则,由于时序不匹配而导致的额外无效读取的机会可能是可接受的,因为任何虚假失败都应予以处理。
  • stdstd::error::Error 提供了 DhtError 的实现,允许更便捷的错误处理。当 error_in_core 稳定下来后,这个特性可能会被弃用,甚至可能被移除。

示例使用

示例文件夹中有针对 esp32c3mini1 板的具体示例。此示例也可以使用 wokwi 运行(有关如何运行的详细信息,请参阅相关的 justfile)。

以下是一个不带任何平台特定实现的示例用法。

use dht22_driver::{IOPin, MicroTimer, Microseconds, Dht22};
// Newtype over device specific GPIO pin type
struct Pin;
#[derive(Debug)]
struct SomeMCUSpecificError;
impl IOPin for Pin
{
    type DeviceError = SomeMCUSpecificError;
    fn set_low(&mut self) -> Result<(), Self::DeviceError> {
        todo!()
    }
    fn set_high(&mut self) -> Result<(), Self::DeviceError> {
        todo!()
    }
    fn is_low(&self) -> bool {
        todo!()
    }
    fn is_high(&self) -> bool {
        todo!()
    }
}
// Newtype over device specific clock/timer
struct DeviceTimer;
impl MicroTimer for DeviceTimer {
    fn now(&self) -> Microseconds {
        Microseconds(
            todo!()
        )
    }
}
fn main() -> Result<(), SomeMCUSpecificError> {
    let mut pin = Pin;
    pin.set_high()?;
    let timer = DeviceTimer;
    let mut sensor = Dht22::new(pin, timer);
    loop {
        std::thread::sleep(std::time::Duration::from_secs(2));
        if let Ok(reading) = sensor.read() {
            println!("Humidity: {:?}, Temperature: {:?}", reading.humidity, reading.temperature);    
        }
    }
}

依赖

~32KB