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" rp2040-boot2 = "0.2.0"
hd44780-driver = "0.4.0" hd44780-driver = "0.4.0"
pio-proc = "0.1.0" pio-proc = "0.1.0"
dht11 = "0.1.0" dht-sensor = "0.2.1"
[features] [features]
rt = ["rp2040-pac/rt"] 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. //! 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. //! 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 /// if your board has a different frequency
const XTAL_FREQ_HZ: u32 = 12_000_000u32; 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 { struct InOutPin {
inner: DynPin, inner: DynPin,
} }
impl InOutPin {
fn new(inner: DynPin) -> Self {
Self { inner }
}
}
impl InputPin for InOutPin { impl InputPin for InOutPin {
type Error = rp2040_hal::gpio::Error; type Error = rp2040_hal::gpio::Error;
fn is_high(&self) -> Result<bool, <Self as embedded_hal::digital::v2::InputPin>::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 { impl OutputPin for InOutPin {
type Error = rp2040_hal::gpio::Error; type Error = rp2040_hal::gpio::Error;
fn set_low(&mut self) -> Result<(), <Self as embedded_hal::digital::v2::OutputPin>::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.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> { 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(); self.inner.into_pull_up_input();
Ok(()) Ok(())
} }
@ -73,8 +90,8 @@ impl OutputPin for InOutPin {
/// The `#[entry]` macro ensures the Cortex-M start-up code calls this function /// The `#[entry]` macro ensures the Cortex-M start-up code calls this function
/// as soon as all global variables are initialised. /// as soon as all global variables are initialised.
/// ///
/// The function configures the RP2040 peripherals, then toggles a GPIO pin in /// The function configures the RP2040 peripherals, assigns GPIO 28 to the
/// an infinite loop. If there is an LED connected to that pin, it will blink. /// DHT11 driver, and takes a single measurement.
#[entry] #[entry]
fn main() -> ! { fn main() -> ! {
// Grab our singleton objects // 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()); let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().integer());
// Configure GPIO 25 as an output // Use GPIO 28 as an InOutPin
let pin = pins.gpio0.into_push_pull_output(); let mut pin = InOutPin::new(pins.gpio28.into());
let pin = InOutPin { inner: pin.into() }; pin.set_high().ok();
// Create an instance of the DHT11 device
let mut dht11 = Dht11::new(pin);
// Perform a sensor reading // 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)] #[allow(clippy::empty_loop)]
loop { loop {