2 个版本
0.1.1 | 2024年1月2日 |
---|---|
0.1.0 | 2024年1月2日 |
#657 在 硬件支持
13KB
169 行
DHT22
无 std,无依赖,平台无关的 dht22 传感器驱动
特性
- critical-section 默认使用,以防止中断干扰传感器的基于时序的数据传输协议。虽然建议尽可能使用,但如果以其他方式禁用中断,驱动程序仍然可以可靠地工作。否则,由于时序不匹配而导致的额外无效读取的机会可能是可接受的,因为任何虚假失败都应予以处理。
std
为std::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