旋钮

[English]

Knob 是提供软件 PCNT 的组件,可以用在没有 PCNT 硬件功能的芯片(esp32c2, esp32c3)上。使用 Knob 可以快速适配物理编码器,如 EC11 编码器。

适用的场景

适用于每秒脉冲数小于 30 个的低速旋钮计数场景。例如 EC11 编码器。 适用于对脉冲数不要求 100% 准确的场景。

注解

如需精确或快速的脉冲计数,请使用 硬件 PCNT 功能 。硬件 PCNT 支持的芯片 ESP32, ESP32-C6, ESP32-H2, ESP32-S2, ESP32-S3。

旋钮事件

每个旋钮拥有下表的 5 个事件:

事件

触发条件

KNOB_LEFT

左旋

KNOB_RIGHT

右旋

KNOB_H_LIM

计数达到最高限制

KNOB_L_LIM

计数达到最低限制

KNOB_ZERO

计数变成零

每个旋钮都可以有 回调 的使用方式:

  • 回调:一个旋钮的每个事件都可以为其注册一个回调函数,产生事件时回调函数将会被调用。这种方式的效率和实时性高,不会丢失事件。

注意

回调函数中不能有 TaskDelay 等阻塞的操作

配置项

  • KNOB_PERIOD_TIME_MS : 扫描周期

  • KNOB_DEBOUNCE_TICKS : 消抖次数

  • KNOB_HIGH_LIMIT : 旋钮所能计数的最高数字

  • KNOB_LOW_LIMIT : 旋钮所能计数的最低数字

应用示例

创建旋钮

// create knob
knob_config_t cfg = {
    .default_direction =0,
    .gpio_encoder_a = GPIO_KNOB_A,
    .gpio_encoder_b = GPIO_KNOB_B,
};
s_knob = iot_knob_create(&cfg);
if(NULL == s_knob) {
    ESP_LOGE(TAG, "knob create failed");
}

注册回调函数

static void _knob_left_cb(void *arg, void *data)
{
    ESP_LOGI(TAG, "KONB: KONB_LEFT,count_value:%"PRId32"",iot_knob_get_count_value((button_handle_t)arg));
}
iot_knob_register_cb(s_knob, KNOB_LEFT, _knob_left_cb, NULL);

API Reference

Header File

Functions

knob_handle_t iot_knob_create(const knob_config_t *config)

create a knob

Return

A handle to the created knob

Parameters
  • config: pointer of knob configuration

esp_err_t iot_knob_delete(knob_handle_t knob_handle)

Delete a knob.

Return

  • ESP_OK Success

  • ESP_FAIL Failure

Parameters
  • knob_handle: A knob handle to delete

esp_err_t iot_knob_register_cb(knob_handle_t knob_handle, knob_event_t event, knob_cb_t cb, void *usr_data)

Register the knob event callback function.

Return

  • ESP_OK Success

  • ESP_FAIL Failure

Parameters
  • knob_handle: A knob handle to register

  • event: Knob event

  • cb: Callback function

  • usr_data: user data

esp_err_t iot_knob_unregister_cb(knob_handle_t knob_handle, knob_event_t event)

Unregister the knob event callback function.

Return

  • ESP_OK Success

  • ESP_FAIL Failure

Parameters
  • knob_handle: A knob handle to register

  • event: Knob event

knob_event_t iot_knob_get_event(knob_handle_t knob_handle)

Get knob event.

Return

knob_event_t Knob event

Parameters
  • knob_handle: A knob handle to register

int iot_knob_get_count_value(knob_handle_t knob_handle)

Get knob count value.

Return

int count_value

Parameters
  • knob_handle: A knob handle to register

esp_err_t iot_knob_clear_count_value(knob_handle_t knob_handle)

Clear knob cout value to zero.

Return

  • ESP_OK Success

  • ESP_FAIL Failure

Parameters
  • knob_handle: A knob handle to register

Structures

struct knob_config_t

Knob config.

Public Members

uint8_t default_direction

0:positive increase 1:negative increase

uint8_t gpio_encoder_a

Encoder Pin A

uint8_t gpio_encoder_b

Encoder Pin B

Type Definitions

typedef void (*knob_cb_t)(void *, void *)
typedef void *knob_handle_t

Enumerations

enum knob_event_t

Knob events.

Values:

KNOB_LEFT = 0

EVENT: Rotate to the left

KNOB_RIGHT

EVENT: Rotate to the right

KNOB_H_LIM

EVENT: Count reaches maximum limit

KNOB_L_LIM

EVENT: Count reaches the minimum limit

KNOB_ZERO

EVENT: Count back to 0

KNOB_EVENT_MAX

EVENT: Number of events