#embassy #async #embedded-hal #hc-sr04 #sensors #no-std-driver

no-std hcsr04_async

A no-std driver for the HC-SR04 ultrasonic sensor using async and Embassy

4 releases

0.2.0 Sep 20, 2024
0.1.2 Sep 14, 2024
0.1.1 Sep 8, 2024
0.1.0 Sep 7, 2024

#420 in Embedded development

Download history 68/week @ 2024-09-01 357/week @ 2024-09-08 300/week @ 2024-09-15 40/week @ 2024-09-22

765 downloads per month

MIT license

20KB
237 lines

ci Docs Latest version License

hcsr04_async

Driver for HC-SR04 ultrasonic distance measuring device for async no-std Rust using Embassy.

The driver is designed to work with Celsius and Fahrenheit temperatures and centimeters and inches for distance measurements.

Features

  • blocking_trigger: (Recommended) This feature enables blocking behavior for the trigger pulse, ensuring more accurate timing. It's recommended for most use cases unless you have specific reasons to avoid blocking operations.

Note that this only makes the blocking trigger pulse of 10us blocking, the remainder will still be async.

Note

Due to the non-blocking nature of this driver there is a probabiity that either the trigger pulse or the echo measurement get impacted by other async tasks. If this becomes a problem You must either use a blocking driver or You can attempt to run this driver in a higher priority task.

Example

#![no_std]
#![no_main]

use defmt::*;
use embassy_executor::Spawner;
use embassy_rp::gpio::{Input, Level, Output, Pull};
use embassy_time::{Duration, Timer};
use hcsr04_async::{Config, DistanceUnit, Hcsr04, TemperatureUnit};
use {defmt_rtt as _, panic_probe as _};

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p = embassy_rp::init(Default::default());
    info!("Running!");

    let trigger = Output::new(p.PIN_13, Level::Low);
    let echo = Input::new(p.PIN_28, Pull::None);

    let config = Config {
        distance_unit: DistanceUnit::Centimeters,
        temperature_unit: TemperatureUnit::Celsius,
    };

    let mut sensor = Hcsr04::new(trigger, echo, config);

    // The temperature of the environment, if known, can be used to adjust the speed of sound.
    // If unknown, an average estimate must be used.
    let temperature = 24.0;

    loop {
        let distance = sensor.measure(temperature).await;
        match distance {
            Ok(distance) => {
                info!("Distance: {} cm", distance);
            }
            Err(e) => {
                info!("Error: {:?}", e);
            }
        }
        Timer::after(Duration::from_secs(1)).await;
    }
}

Dependencies

~3MB
~61K SLoC