ESP-IDF: компонент Knob для подключения поворотного энкодера
Добавил(а) microsin
Knob это компонент, который предоставляет программный PCNT, его можно использовать на недорогих чипах (наподобие esp32c2, esp32c3), у которых нет аппаратной фичи PCNT. Благодаря компоненту knob вы можете быстро подключить и использовать физический энкодер (knob), такой как EC11.
Применение Knob подойдет для сценариев подключения низкоскоростных поворотных энкодеров, где частота импульсов не превышает 30 импульсов в секунду (обычный энкодер для пользовательского интерфейса, такой как EC11). В таких сценариях допускается не 100% точность подсчета импульсов.
Примечание: для точного или быстрого подсчета импульсов используйте аппаратный PCNT, который поддерживается чипами ESP32, ESP32-C6, ESP32-H2, ESP32-S2, ESP32-S3.
Энкодер подключается по следующей простой схеме:
Примечание: компонент Knob подключает на входах фаз энкодера внутренний pull-up, ток замыкания на GND составляет порядка 0.07 мА. Сигнал C от кнопки энкодера в компоненте Knob не обрабатывается. Для обработки кнопки необходимо подключать отдельный обработчик, например на основе OneButton [2].
[События Knob Event]
Каждый knob имеет 5 событий, перечисленных в следующей таблице:
Событие
Условия генерации события
KNOB_LEFT
Поворот влево.
KNOB_RIGHT
Поворот вправо.
KNOB_H_LIM
Счетчик импульсов достиг верхнего предела.
KNOB_L_LIM
Счетчик импульсов достиг нижнего предела.
KNOB_ZERO
Счетчик вернулся к позиции 0.
Каждому knob можно привязать функцию обратного вызова (callback) для обработки событий. Причем каждое событие может иметь отдельный callback, вызываемый при возникновении этого события. Такой способ эффективен в реальном времени, так что ни одно событие не потеряется.
[Элементы конфигурации]
KNOB_PERIOD_TIME_MS: длительность цикла сканирования. KNOB_DEBOUNCE_TICKS: количество импульсов накопления для подавления дребезга. KNOB_HIGH_LIMIT: максимальное значение количества импульсов, которое может быть подсчитано. KNOB_LOW_LIMIT: минимальное значение количества импульсов, которое может быть подсчитано.
Аналогично подключается callback для события KNOB_RIGHT. Пример вывода в лог:
...
I (2171) : KNOB: KNOB_LEFT,count_value:-2
I (2221) : KNOB: KNOB_LEFT,count_value:-3
I (2231) : KNOB: KNOB_LEFT,count_value:-4
I (2281) : KNOB: KNOB_LEFT,count_value:-5
I (2291) : KNOB: KNOB_LEFT,count_value:-6
I (2761) : KNOB: KNOB_RIGHT,count_value:-5
I (2781) : KNOB: KNOB_RIGHT,count_value:-4
I (2871) : KNOB: KNOB_RIGHT,count_value:-3
I (2891) : KNOB: KNOB_RIGHT,count_value:-2
I (3011) : KNOB: KNOB_RIGHT,count_value:-1
I (3041) : KNOB: KNOB_RIGHT,count_value:0
I (3181) : KNOB: KNOB_RIGHT,count_value:1
I (3201) : KNOB: KNOB_RIGHT,count_value:2
I (3371) : KNOB: KNOB_RIGHT,count_value:3
[Поддержка пониженного энергопотребления]
В режиме light_sleep таймер esp_timer выводит CPU из сна, что приводит к повышенному потреблению энергии. Компонент Knob предоставляет поддержку режима пониженного потребления через функцию пробуждения от изменения уровня на ножке порта (GPIO level wake-up).
Для использования этой функции разрешите опцию enable_power_save в структуре конфигурации knob_config_t.
Потребление энергии в течение без low power mode, одно вращение в течение 250 мс:
В режиме low power, одно вращение в течение 250 мс:
В режиме low power, 10 вращений в течение 4.5 с:
Таким образом, компонент Knob в режиме low power mode обеспечивает значительное экономию энергии.
[Разрешение и запрет Knob]
Поддержка компонента может быть в любой момент разрешена и запрещена.
// Остановка knob:
iot_knob_stop(); // Возобновление работы knob:
iot_knob_resume();
[API компонента Knob]
Для использования компонента необходимо подключение заголовка components/knob/include/iot_knob.h:
#include"iot_knob.h"
В сдедующей таблице приведено краткое описание API-функций. Полное описание параметров этих функций, используемых структур и определений типов см. в документации [1].
Функция
Описание
iot_knob_create
Создает экземпляр компонента Knob.
iot_knob_delete
Удалит экземпляр компонента, созданный ранее вызовом iot_knob_create.
iot_knob_register_cb
Зарегистрирует функцию обратного вызова (callback) для события.
iot_knob_unregister_cb
Отменит регистрацию функции обратного вызова.
iot_knob_get_event
Получение события.
iot_knob_get_count_value
Получение значения счетчика.
iot_knob_clear_count_value
Сброс в 0 значения счетчика.
iot_knob_resume
Возобновление работы таймера экземпляра Knob, если таймер остановлен. Перед вызовом этой функции обязательно должна быть вызвана функция iot_knob_create().
iot_knob_stop
Остановка работы таймера экземпляра Knob, если таймер работает. Перед вызовом этой функции обязательно должна быть вызвана функция iot_knob_create().