#button #esp32 #switch #no-std

no-std button-driver

高级按钮处理库

6 个版本

0.2.1 2024年6月9日
0.2.0 2024年5月26日
0.1.4 2024年3月28日
0.1.3 2023年11月26日
0.1.1 2023年6月4日

#251嵌入式开发

Download history 2/week @ 2024-04-09 125/week @ 2024-05-21 23/week @ 2024-05-28 157/week @ 2024-06-04 35/week @ 2024-06-11

每月464 次下载

MIT 许可证

26KB
548 代码行

按钮驱动程序

crates doc

该库是嵌入式 Rust 项目的按钮驱动程序。它提供各种使用场景,支持 ESP、embedded_halembassyno_std 目标。

该库旨在尽可能灵活,以支持各种 HAL 和用例。

示例

更多示例请参考 示例文件夹。您可以使用 cargo run 命令轻松烧录它们!

针对带有 std 的 ESP32C3

所需特性:stdesp

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

待办事项

  1. async 支持
  2. 防抖策略 支持

算法

高级状态机图

button-driver-state-machine

依赖项

~0–6.5MB
~30K SLoC