#dht #hal #sensors #dht22 #dht11 #driver #humidity

无 std dht-hal-drv

基于 HAL 的数字湿度和温度传感器 DHT11、DHT21、DHT22 的驱动程序

4 个版本

0.2.2 2021 年 12 月 6 日
0.2.1 2020 年 1 月 15 日
0.2.0 2019 年 10 月 16 日
0.1.0 2019 年 10 月 11 日

#1605 in 嵌入式开发

自定义许可协议

17KB
124

基于 HAL 的 DHT 传感器驱动程序

crates.io Released API docs

Adafruit 的数字湿度和温度传感器 (DHT) 在各种 DIY 项目中得到了广泛的应用。

此驱动程序支持以下传感器版本:DHT11、DHT21、DHT22。

我在 Raspberry Pi 3 和 STM32 Blue Pill 板上测试了它。所有特定平台的实现都可在示例目录中找到。

许可

此产品受 几乎 MIT 许可协议 保护,但带有 plumbus 异常。


lib.rs:

基于 HAL 的数字湿度和温度传感器 (DHT) 驱动程序

由于 HAL API 和一些硬件实现中存在一些限制,因此使用该传感器有些棘手。

DHT 使用一个引脚进行通信,该引脚应工作在开漏(开连接)模式下。对于没有此类引脚实现的硬件,您应模拟其行为。

您可以通过以下方式获取读数

  • 使用单个函数读取所有数据
  • 使用拆分函数进行初始化和读取,在调用之间将引脚转换为不同的模式

请注意,DHT 初始化过程有一些注意事项。在下一次读取之前必须接近 1 秒的延迟。在此期间,DHT 电路中的上拉电阻将拉高数据引脚,这将准备 DHT 进行下一次读取周期。

应考虑延迟实现问题。在某些平台上,以某些微秒数睡眠意味着“至少睡眠 N 微秒”。例如,在 RPi 上使用 std::thread::sleep 不会起作用。对于此类情况,应使用 dht_split_read 而不使用延迟或其他睡眠实现,如 spin_sleep

示例

使用开漏引脚

let delay; // Something that implements DelayUs trait
let open_drain_pin; // Open drain pin, should be in open mode by default
// Need to create closure with HW specific delay logic that DHT driver is not aware of
let mut delay_us = |d| delay.delay_us(d);

// ... Some code of your APP ... //
let result = dht_read(DhtType::DHT11, &mut open_drain_pin, &mut delay_us);
// ... Other code of your APP ... //

使用 dht_split_* 函数

如果您的设备没有开漏引脚,需要模拟它或您的 CPU 慢,不想在读取时使用延迟,则此方法很有用。

use dht_hal_drv::{dht_split_init, dht_split_read, DhtError, DhtType, DhtValue};

// ... Some code of your APP ... //

let delay; // Something that implements DelayUs trait
let pin_in; // Pin configured as input floating

// Should create closure with
// custom HW specific delay logic that DHT driver is not aware of
let mut delay_us = |d| delay.delay_us(d);

// pin to output mode
let mut pin_out = pin_in.into_push_pull_output();

// Initialize DHT data transfer
// Before reading begins MCU must send signal to DHT which would initiate data transfer from DHT.
dht_split_init(&mut pin_out, &mut delay_us);

// You can check dht_split_init response for errors if you want

// WARNING there should be no additional logic between dht_split_init and dht_split_read

// Should convert pin back to input floating
let mut pin_in = pin_out.into_floating_input(cr);

// Now let's read some data
// Here you can pass empty delay_us closure to skip using delays on slow CPU
let readings = dht_split_read(DhtType::DHT11, &mut pin_in, &mut delay_us);

// ... Other code of your APP ... //

可以在源代码库中找到特定硬件平台的示例。

灵感来源

依赖项

~71KB