Knob
Knob is the component that provides the software PCNT, it can be used on chips(esp32c2, esp32c3) that do not have PCNT hardware capabilities. By using knob you can quickly use a physical encoder, such as the EC11 encoder.
Applicable Scenarios
This is suitable for low-speed rotary knob counting scenarios where the pulse rate is less than 30 pulses per second, such as the EC11 encoder. It is suitable for scenarios where 100% accuracy of pulse counting is not required.
Note
For precise or fast pulse counting, please use the hardware PCNT function. The hardware PCNT is supported by ESP32, ESP32-C6, ESP32-H2, ESP32-S2, ESP32-S3 chips.
Hardware Design
The reference design for the rotary encoder is shown below:
Knob Event
Each knob has the 5 events in the following table.
Events |
Trigger Conditions |
---|---|
KNOB_LEFT |
Left |
KNOB_RIGHT |
Right |
KNOB_H_LIM |
Count reaches maximum limit |
KNOB_L_LIM |
Count reaches the minimum limit |
KNOB_ZERO |
Count back to 0 |
Each knob can have Callback usage.
Callbacks: Each event of a knob can have a callback function registered for it, and the callback function will be called when the event is generated. This approach is efficient and real-time, and no events are lost.
Attention
No blocking operations such as TaskDelay in the callback function
Configuration items
KNOB_PERIOD_TIME_MS : Scan cycle
KNOB_DEBOUNCE_TICKS : Number of de-shaking
KNOB_HIGH_LIMIT : The highest number that can be counted by the knob
KNOB_LOW_LIMIT : The lowest number that can be counted by the knob
Application Examples
Create Knob
// 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");
}
Register callback function
static void _knob_left_cb(void *arg, void *data)
{
ESP_LOGI(TAG, "KNOB: KNOB_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);
Low Power Support
In light_sleep mode, the esp_timer wakes up the CPU, resulting in high power consumption. The Knob component offers a low power solution through GPIO level wake-up.
Required Configuration:
Enable the enable_power_save option in knob_config_t.
Power Consumption Comparison:
Without low power mode, one rotation within 250ms
With low power mode, one rotation within 250ms
With low power mode, ten rotations within 4.5s
The knob is responsive and consumes less power in low power mode.
Enable and Disable
The component supports enabling and disabling at any time.
// Stop knob
iot_knob_stop();
// Resume knob
iot_knob_resume();
API Reference
Header File
Functions
-
knob_handle_t iot_knob_create(const knob_config_t *config)
create a knob
- Parameters
config – pointer of knob configuration
- Returns
A handle to the created knob
-
esp_err_t iot_knob_delete(knob_handle_t knob_handle)
Delete a knob.
- Parameters
knob_handle – A knob handle to delete
- Returns
ESP_OK Success
ESP_FAIL Failure
-
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.
- Parameters
knob_handle – A knob handle to register
event – Knob event
cb – Callback function
usr_data – user data
- Returns
ESP_OK Success
ESP_FAIL Failure
-
esp_err_t iot_knob_unregister_cb(knob_handle_t knob_handle, knob_event_t event)
Unregister the knob event callback function.
- Parameters
knob_handle – A knob handle to register
event – Knob event
- Returns
ESP_OK Success
ESP_FAIL Failure
-
knob_event_t iot_knob_get_event(knob_handle_t knob_handle)
Get knob event.
- Parameters
knob_handle – A knob handle to register
- Returns
knob_event_t Knob event
-
int iot_knob_get_count_value(knob_handle_t knob_handle)
Get knob count value.
- Parameters
knob_handle – A knob handle to register
- Returns
int count_value
-
esp_err_t iot_knob_clear_count_value(knob_handle_t knob_handle)
Clear knob cout value to zero.
- Parameters
knob_handle – A knob handle to register
- Returns
ESP_OK Success
ESP_FAIL Failure
-
esp_err_t iot_knob_resume(void)
resume knob timer, if knob timer is stopped. Make sure iot_knob_create() is called before calling this API.
- Returns
ESP_OK on success
ESP_ERR_INVALID_STATE timer state is invalid.
-
esp_err_t iot_knob_stop(void)
stop knob timer, if knob timer is running. Make sure iot_knob_create() is called before calling this API.
- Returns
ESP_OK on success
ESP_ERR_INVALID_STATE timer state is invalid
Structures
-
struct knob_config_t
Knob config.
Type Definitions
-
typedef void (*knob_cb_t)(void*, void*)
-
typedef void *knob_handle_t
Enumerations
-
enum knob_event_t
Knob events.
Values:
-
enumerator KNOB_LEFT
EVENT: Rotate to the left
-
enumerator KNOB_RIGHT
EVENT: Rotate to the right
-
enumerator KNOB_H_LIM
EVENT: Count reaches maximum limit
-
enumerator KNOB_L_LIM
EVENT: Count reaches the minimum limit
-
enumerator KNOB_ZERO
EVENT: Count back to 0
-
enumerator KNOB_EVENT_MAX
EVENT: Number of events
-
enumerator KNOB_NONE
EVENT: No event
-
enumerator KNOB_LEFT