#传感器 #嵌入式HAL驱动 #温度 #湿度

no-std dht-sensor

基于嵌入式HAL的DHT11/DHT22传感器驱动

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嵌入式开发

Download history 78/week @ 2024-03-13 98/week @ 2024-03-20 82/week @ 2024-03-27 123/week @ 2024-04-03 100/week @ 2024-04-10 75/week @ 2024-04-17 193/week @ 2024-04-24 108/week @ 2024-05-01 64/week @ 2024-05-08 55/week @ 2024-05-15 112/week @ 2024-05-22 60/week @ 2024-05-29 95/week @ 2024-06-05 54/week @ 2024-06-12 73/week @ 2024-06-19 165/week @ 2024-06-26

392 每月下载量
用于 rp2040-hal

MIT 许可证

12KB
181

DHT11/DHT22传感器驱动

crates.io Docs

此库提供了一个适用于DHT11和DHT22传感器的跨平台驱动程序。

使用以下两个函数之一获取读数: dht11::Reading::readdht22::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::readdht22::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