Подробности работы схемы подключения энкодера были описаны в прошлой статье, а здесь мы разберемся как обработать полученную информацию.
Как запендюрить энкодер на аналоговый вход ESP32 - часть 1
Для этого необходимо проанализировать данные получаемые при работе схемы и программы:
Ступенька возникающая при одновременном замыкании контактов AB-CB совсем короткая, а поскольку схема работает в режиме постоянного опроса её можно иногда и пропустить - тогда:
- Последовательность чисел при вращении туда: 3-2-1 или 3-1;
- Последовательность чисел при вращении обратно: 1-2-3 или 1-3;
- Нажата кнопка: 0;
- Ничего не нажато: 2;
Затолкаем последовательности для вращения в одно 1 байтовое число. (по 2 бита на каждое значение).
Получается четыре различных комбинации, однозначно определяющих куда повернули ручку. От кнопки будем получать событие "клац" (т.е. при нажатии кнопки код выполняется ТОЛЬКО ОДИН раз).
Засунуть анализ стояния удобно в процедуру void - ведь определив, что именно произошло с энкодером оттуда можно вывалиться в любой момент используя оператор return; и встроить её в дальнейшем в механизм прерываний по таймеру.
При повороте энкодера выяснился один неприятный момент - поворачивая ручку до щелчка, можно её чуть-чуть перекрутить, что закинет 1 лишний ложный (3-2 или 1-2) импульс в систему. При этом ручка может неожиданно сменить направление вращения. Чтобы избавиться от этого неприятного момента, в программу пришлось добавить таймер, который будет удалять этот "чутьНедоПерекрут, примерно через 100 мс. после того как ручку оставили в покое.
Код процедуры получился не сильно сложный,
Для того, чтобы не пропустить события при вращении энкодера рукой, вызывать процедуру необходимо примерно каждые 1-2 мс.
Результат работы программы:
Теперь можно попробовать встроить процедуру в прерывание по таймеру, но это уже в следующей статье.
Код доступен тут - у кого есть энкодер и ESP32 можете побаловаться.
Оглавление канала тут:
Всем удачи!