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 传感器驱动程序
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