Энкодер – общее название устройств, преобразующих одну величину в другую. В данном случае энкодер – это устройство, преобразующее вращательное механическое движение в цифровой сигнал, а сам энкодер в этом случае называется "поворотным" (вращательным, круговым). Рассмотренный ниже инкрементальный поворотный энкодер с кнопкой служит очень удобным органом управления для электронного устройства и заменяет сразу несколько кнопок или джойстик, обеспечивая быструю навигацию по пунктам меню и изменение настроек: например в некоторых 3D принтерах с огромным сложным меню с кучей настроек навигация производится при помощи одного только энкодера! По сути похож на потенциометр, но не имеет ограничения по углу поворота, а само вращение рукоятки - "ступенчатое", что позволяет тактильно ощущать каждый шаг изменения значения.
![]() |
В наборе GyverKIT | START | IOT | EXTRA |
---|---|---|---|---|
Энкодер | ✔ | ✔ |
Особенности данного модуля:
- Качественный инкрементальный энкодер с кнопкой
- 20 "щелчков" на один оборот
- Выведено питание (5V, GND), два пина энкодера (S1, S2) и пин кнопки (KEY)
- Работает также от 3.3V (для Wemos)
- Все логические пины подтянуты к VCC резисторами на плате
- RC цепи гашения дребезга на выводах энкодера
Подключение к Arduino #
Модуль подключается на питание, логические выводы – на любые цифровые пины. В случае с Wemos – на все кроме D8, так как подтяжка к VCC помешает МК запуститься. Подключу выводы энкодера на D2 и D3, а кнопку – на D4:
Программирование #
Алгоритмы опроса энкодера разобраны в отдельном уроке.
Библиотеки #
В рамках примеров и проектов будем использовать библиотеку EncButton, она позволяет работать как отдельно с энкодером, так и с энкодером+кнопкой для сложных сценариев управления и выбора. Её можно установить/обновить из встроенного менеджера библиотек Arduino по названию EncButton. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Для работы библиотеки нужно вызывать метод tick()
в loop()
и опрашивать нужные события. Их там много - смотрите документацию.
Меняем значение переменной
/*
Меняем значение переменной при помощи энкодера
Обычный поворот +-1
"Нажатый" поворот +-5
*/
#include <EncButton.h>
EncButton enc(2, 3, 4); // выводы энкодера на 2 и 3, кнопка на 4
void setup() {
Serial.begin(115200);
}
int val = 0; // будем управлять этой переменной
void loop() {
// опрос энкодера происходит тут
enc.tick();
// вправо
if (enc.right()) {
val += 1;
Serial.println(val);
}
// влево
if (enc.left()) {
val -= 1;
Serial.println(val);
}
// вправо нажатый
if (enc.rightH()) {
val += 5;
Serial.println(val);
}
// влево нажатый
if (enc.leftH()) {
val -= 5;
Serial.println(val);
}
}
Меняем яркость и состояние светодиода
/*
Меняем яркость светодиода на пине 13 (программный ШИМ)
Клик - переключить состояние (вкл выкл)
*/
#include <EncButton.h>
EncButton enc(2, 3, 4); // выводы энкодера на 2 и 3, кнопка на 4
void setup() {
// пин 13 как выход (для мигания светодиодом)
pinMode(13, OUTPUT);
}
int bright = 128; // храним яркость
bool state = 1; // состояние светодиода
void loop() {
// опрос энкодера происходит тут
enc.tick();
// передаём яркость, умноженную на state (0 или 1)
// то есть получится bright или 0 в зависимости от state
softPWM(13, bright * state);
// вправо - увеличиваем на 10
if (enc.right()) bright = constrain(bright + 10, 0, 255);
// влево - уменьшаем на 10
if (enc.left()) bright = constrain(bright - 10, 0, 255);
// клик - переключаем состояние по клику
if (enc.click()) state = !state;
}
// софт шим
void softPWM(byte pin, byte val) {
static byte count;
count++;
if (count == 0 && val != 0) digitalWrite(pin, 1);
if (count == val) digitalWrite(pin, 0);
}
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
- Поддержать автора за работу над уроками