| Crates.io | button-driver |
| lib.rs | button-driver |
| version | 0.2.5 |
| created_at | 2023-06-04 18:30:16.625828+00 |
| updated_at | 2025-11-16 16:47:47.857957+00 |
| description | Advanced button handling crate |
| homepage | |
| repository | https://github.com/maxwase/button-driver |
| max_upload_size | |
| id | 882484 |
| size | 36,135 |
This crate is a button driver for embedded Rust projects.
It offers various usage scenarios, supports ESP, embedded_hal, embassy, wasm and no_std targets.
This crate aims to be as flexible as possible to support various HALs and use-cases.
For more examples consider looking into the examples folder.
You can easily flash/run them using cargo run command! Use trunk serve to run the wasm example.
For ESP32C3 with std:
Required features: std, embedded_hal
use std::time::Instant;
use button_driver::{Button, ButtonConfig};
use esp_idf_hal::{gpio::PinDriver, prelude::Peripherals};
use esp_idf_sys::EspError;
use log::info;
fn main() -> Result<(), EspError> {
esp_idf_svc::log::EspLogger::initialize_default();
let peripherals = Peripherals::take().unwrap();
let pin = PinDriver::input(peripherals.pins.gpio9)?;
let mut button = Button::<_, Instant>::new(pin, ButtonConfig::default());
loop {
button.tick();
if let Some(dur) = button.held_time() {
info!("Total holding time {:?}", dur);
if button.is_clicked() {
info!("Clicked + held");
} else if button.is_double_clicked() {
info!("Double clicked + held");
} else if button.holds() == 2 && button.clicks() > 0 {
info!("Held twice with {} clicks", button.clicks());
} else if button.holds() == 2 {
info!("Held twice");
}
} else {
if button.is_clicked() {
info!("Click");
} else if button.is_double_clicked() {
info!("Double click");
} else if button.is_triple_clicked() {
info!("Triple click");
} else if let Some(dur) = button.current_holding_time() {
info!("Held for {:?}", dur);
}
}
button.reset();
}
}
High-level state machine diagram