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;fnmain() -> Result<(),EspError>{
esp_idf_svc::log::EspLogger::initialize_default();let peripherals = Peripherals::take().unwrap();let pin = PinDriver::input(peripherals.pins.gpio9)?;letmut button = Button::<_,Instant>::new(pin,ButtonConfig::default());loop{
button.tick();ifletSome(dur) = button.held_time(){info!("Total holding time {:?}", dur);if button.is_clicked(){info!("Clicked + held");}elseif button.is_double_clicked(){info!("Double clicked + held");}elseif button.holds() == 2 && button.clicks() > 0{info!("Held twice with {} clicks", button.clicks());}elseif button.holds() == 2{info!("Held twice");}}else{if button.is_clicked(){info!("Click");}elseif button.is_double_clicked(){info!("Double click");}elseif button.is_triple_clicked(){info!("Triple click");}elseifletSome(dur) = button.current_holding_time(){info!("Held for {:?}", dur);}}
button.reset();}}High-level state machine diagram