mirror of
https://github.com/italicsjenga/rp-hal-boards.git
synced 2025-01-23 09:46:33 +11:00
use dht-sensor crate and fix comments
This commit is contained in:
parent
bb6b7706f9
commit
f6b2e3365e
2 changed files with 31 additions and 14 deletions
|
@ -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"]
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue