7 releases

0.2.2 Nov 17, 2024
0.2.1 Jun 9, 2024
0.2.0 May 26, 2024
0.1.4 Mar 28, 2024
0.1.1 Jun 4, 2023

#284 in Embedded development

Download history 12/week @ 2024-09-24 12/week @ 2024-10-01 1/week @ 2024-10-08 1/week @ 2024-10-15 1/week @ 2024-10-29 4/week @ 2024-11-05 85/week @ 2024-11-12 49/week @ 2024-11-19 9/week @ 2024-11-26

148 downloads per month

MIT license

26KB
534 lines

Button driver

crates doc

This crate is a button driver for embedded Rust projects. It offers various usage scenarios, supports ESP, embedded_hal, embassy and no_std targets.

This crate aims to be as flexible as possible to support various HALs and use-cases.

Examples

For more examples consider looking into the examples folder. You can easily flash them using cargo run command!

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();
    }
}

TODO

  1. async support
  2. Debounce strategies support

Algorithm

High-level state machine diagram

button-driver-state-machine

Dependencies

~0–260KB