A batteries-included [embedded-hal] [InputPin
] debouncer.
Add the following to your Cargo.toml
:
toml
[dependencies]
unflappable = "0.1"
Create an uninitialized [Debouncer
] in static storage.
rust
use unflappable::{debouncer_uninit, Debouncer, default::ActiveLow};
static DEBOUNCER: Debouncer<PinType, ActiveLow> = debouncer_uninit!();
Initialize the Debouncer
with your input pin, returning the
[Debounced
] pin. Use this pin just as you would any other
[InputPin
], such as passing ownership to another abstraction.
rust
let debounced_pin = unsafe { DEBOUNCER.init(input_pin) }.unwrap();
Regularly poll the Debouncer
, perhaps in an interrupt service routine.
rust
unsafe {
DEBOUNCER.poll()?;
}
API docs are hosted on docs.rs:
[API Documentation]
This crate makes use of trait bounds on a const fn
, which is
currently unstable. Therefore, we require use of the nightly
compiler. When [rust-lang/rust#67792] stabilizes, we will
establish a MSRV policy.
There are at least three debouncing crates targeting embedded Rust development. How does this one compare to the others?
Crate: unflappable
Wraps InputPin
: Yes
Can move wrapped pin: Yes
Algorithm: Integration-based by [Kuhn]
State overhead: u8
Crate: [debounced-pin
]
Wraps InputPin
: Yes
Can move wrapped pin: No
Algorithm: Differentiation-based by [Greensted]
State overhead: u8
+ enum
Crate: [debouncr
]
Wraps InputPin
: No
Can move wrapped pin: N/A
Algorithm: Differentiation-based by [Ganssle]
State overhead: u8
Crate: [debouncing
]
Wraps InputPin
: No
Can move wrapped pin: N/A
Algorithm: Differentiation-based by [Hackaday]
State overhead: u8
+ dynamically-allocated Vec
I'm happy to see any and all contributions, including bug reports, usability suggestions, patches, or angry yet well-intentioned rants. You are encouraged to report issues to the official [issue tracker] and send any questions or patches to the [mailing list]. Pull requests to the GitHub mirror are also acceptable.