use dht-sensor crate and fix comments

This commit is contained in:
Jan Niehusmann 2022-01-28 20:57:51 +00:00
parent bb6b7706f9
commit f6b2e3365e
2 changed files with 31 additions and 14 deletions

View file

@ -45,7 +45,7 @@ panic-halt = "0.2.0"
rp2040-boot2 = "0.2.0"
hd44780-driver = "0.4.0"
pio-proc = "0.1.0"
dht11 = "0.1.0"
dht-sensor = "0.2.1"
[features]
rt = ["rp2040-pac/rt"]

View file

@ -1,8 +1,9 @@
//! # GPIO 'Blinky' Example
//! # DHT11 Example
//!
//! This application demonstrates how to control a GPIO pin on the RP2040.
//! This application demonstrates how to read a DHT11 sensor on the RP2040.
//!
//! It may need to be adapted to your particular board layout and/or pin assignment.
//! In this example, the DHT11 data pin should be connected to GPIO28.
//!
//! See the `Cargo.toml` file for Copyright and licence details.
@ -40,12 +41,21 @@ pub static BOOT2: [u8; 256] = rp2040_boot2::BOOT_LOADER_W25Q080;
/// if your board has a different frequency
const XTAL_FREQ_HZ: u32 = 12_000_000u32;
use dht11::Dht11;
use dht_sensor::{dht11, DhtReading};
/// A wrapper for DynPin, implementing both InputPin and OutputPin, to simulate
/// an open-drain pin as needed by the wire protocol the DHT11 sensor speaks.
/// https://how2electronics.com/interfacing-dht11-temperature-humidity-sensor-with-raspberry-pi-pico/
struct InOutPin {
inner: DynPin,
}
impl InOutPin {
fn new(inner: DynPin) -> Self {
Self { inner }
}
}
impl InputPin for InOutPin {
type Error = rp2040_hal::gpio::Error;
fn is_high(&self) -> Result<bool, <Self as embedded_hal::digital::v2::InputPin>::Error> {
@ -59,10 +69,17 @@ impl InputPin for InOutPin {
impl OutputPin for InOutPin {
type Error = rp2040_hal::gpio::Error;
fn set_low(&mut self) -> Result<(), <Self as embedded_hal::digital::v2::OutputPin>::Error> {
// To actively pull the pin low, it must also be configured as a (readable) output pin
self.inner.into_readable_output();
self.inner.set_low()
// In theory, we should set the pin to low first, to make sure we never actively
// pull it up. But if we try it on the input pin, we get Err(Gpio(InvalidPinType)).
self.inner.set_low()?;
Ok(())
}
fn set_high(&mut self) -> Result<(), <Self as embedded_hal::digital::v2::OutputPin>::Error> {
// To set the open-drain pin to high, just disable the output driver by changing the
// pin to input mode with pull-up. That way, the DHT11 can still pull the data line down
// to send its response.
self.inner.into_pull_up_input();
Ok(())
}
@ -73,8 +90,8 @@ impl OutputPin for InOutPin {
/// The `#[entry]` macro ensures the Cortex-M start-up code calls this function
/// as soon as all global variables are initialised.
///
/// The function configures the RP2040 peripherals, then toggles a GPIO pin in
/// an infinite loop. If there is an LED connected to that pin, it will blink.
/// The function configures the RP2040 peripherals, assigns GPIO 28 to the
/// DHT11 driver, and takes a single measurement.
#[entry]
fn main() -> ! {
// Grab our singleton objects
@ -110,15 +127,15 @@ fn main() -> ! {
let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().integer());
// Configure GPIO 25 as an output
let pin = pins.gpio0.into_push_pull_output();
let pin = InOutPin { inner: pin.into() };
// Create an instance of the DHT11 device
let mut dht11 = Dht11::new(pin);
// Use GPIO 28 as an InOutPin
let mut pin = InOutPin::new(pins.gpio28.into());
pin.set_high().ok();
// Perform a sensor reading
let _measurement = dht11.perform_measurement(&mut delay).unwrap();
let _measurement = dht11::Reading::read(&mut delay, &mut pin);
// In this case, we just ignore the result. A real application
// would do something with the measurement.
#[allow(clippy::empty_loop)]
loop {