4个版本
0.2.1 | 2021年2月26日 |
---|---|
0.2.0 | 2021年2月16日 |
0.1.1 | 2020年1月11日 |
0.1.0 | 2020年1月11日 |
#1955 在 嵌入式开发
392 每月下载量
用于 rp2040-hal
12KB
181 行
DHT11/DHT22传感器驱动
此库提供了一个适用于DHT11和DHT22传感器的跨平台驱动程序。
使用以下两个函数之一获取读数: dht11::Reading::read
和 dht22::Reading::read
。
用法
仅需满足以下前提条件:
Delay
实现类型,例如Cortex-M微控制器通常使用SysTick
。InputOutputPin
实现类型,例如Output<OpenDrain>
从stm32f0xx_hal
。
请参阅 stm32f042示例 以了解如何使用此库的注释示例。
测试
要运行测试,请使用类似以下命令:cargo test --lib --target x86_64-unknown-linux-gnu
。
lib.rs
:
DHT11/DHT22传感器驱动
此库提供了一个适用于DHT11和DHT22传感器的跨平台驱动程序。
使用以下两个函数之一获取读数:dht11::Reading::read
和 dht22::Reading::read
。
用法
仅需满足以下前提条件:
Delay
实现类型,例如Cortex-M微控制器通常使用SysTick
。InputOutputPin
实现类型,例如Output<OpenDrain>
从stm32f0xx_hal
。
当将引脚初始化为输出时,引脚的状态可能取决于所使用的具体芯片。有些可能默认将引脚拉低,导致我们在第一次实际读取时传感器会感到困惑。当传感器连续快速地被轮询时也会发生相同的情况。在这两种情况下,您将得到一个 DhtError::Timeout
。
为了避免这种情况,您可以在初始化时将引脚拉高,并以至少500毫秒的间隔(实验确定)轮询传感器。一些资料表示刷新率为1秒甚至2秒。
示例
请参考stm32f042示例,了解如何使用库的示例。
#![no_std]
#![no_main]
use crate::hal::{delay, gpio, prelude::*, stm32};
use cortex_m_rt::entry;
use cortex_m_semihosting::hprintln;
use panic_halt as _;
use stm32f0xx_hal as hal;
use dht_sensor::*;
#[entry]
fn main() -> ! {
let mut p = stm32::Peripherals::take().unwrap();
let cp = stm32::CorePeripherals::take().unwrap();
let mut rcc = p.RCC.configure().sysclk(8.mhz()).freeze(&mut p.FLASH);
// This is used by `dht-sensor` to wait for signals
let mut delay = delay::Delay::new(cp.SYST, &rcc);
// This could be any `gpio` port
let gpio::gpioa::Parts { pa1, .. } = p.GPIOA.split(&mut rcc);
// An `Output<OpenDrain>` is both `InputPin` and `OutputPin`
let mut pa1 = cortex_m::interrupt::free(|cs| pa1.into_open_drain_output(cs));
// Pulling the pin high to avoid confusing the sensor when initializing
pa1.set_high().ok();
// The DHT11 datasheet suggests 1 second
hprintln!("Waiting on the sensor...").unwrap();
delay.delay_ms(1000_u16);
loop {
match dht11::Reading::read(&mut delay, &mut pa1) {
Ok(dht11::Reading {
temperature,
relative_humidity,
}) => hprintln!("{}°, {}% RH", temperature, relative_humidity).unwrap(),
Err(e) => hprintln!("Error {:?}", e).unwrap(),
}
// Delay of at least 500ms before polling the sensor again, 1 second or more advised
delay.delay_ms(500_u16);
}
}
依赖项
~71KB