Подключение энкодера KY-040 к ESP32

Энкодер с кнопкой

KY-040 к ESP32 — три сигнальных вывода: CLK, DT и SW (кнопка), плюс питание 3,3 В и земля. Для CLK и DT на ESP32 подходит любой GPIO с прерыванием, то есть почти любой.

Схема подключения энкодера KY-040 к ESP32

KY-040ESP32
CLKGPIO18
DTGPIO19
SWGPIO21
VCC3V3
GNDGND

Схема из примера «Энкодер KY-040: счётчик щелчков и кнопка».

Энкодер KY-040: счётчик щелчков и кнопка

Открыть пример целиком

Выводы KY-040

ВыводНазначение
CLKвыход A
DTвыход B — по нему определяют направление
SWкнопка на валу, замыкает на GND
VCCпитание (для подтягивающих резисторов модуля)
GNDобщий провод

Код для ESP32

// Энкодер KY-040 на ESP32.
//
// Два контакта внутри замыкаются со сдвигом: по часовой стрелке первым
// опускается CLK, против — DT. На спаде CLK достаточно посмотреть на
// DT: единица — по часовой.
//
// У ESP32 прерывание вешается на любой вывод, а обработчик должен
// лежать в IRAM (IRAM_ATTR): прерывание может прийти, пока флеш занята,
// и код из флеша тогда не выполнится.
//
// На схеме: возьмите ручку мышью и тяните по кругу — по часовой или
// против; кнопки ↺ ↻ под ручкой — по щелчку (держите — повторяются);
// колесо мыши над ручкой — тоже поворот; середина ручки — кнопка.

const int CLK = 18, DT = 19, SW = 21;

volatile long position = 0;

void IRAM_ATTR onClk() {
  if (digitalRead(DT)) position++; else position--;
}

void setup() {
  Serial.begin(115200);
  pinMode(CLK, INPUT);        // подтяжка на CLK и DT стоит на модуле
  pinMode(DT, INPUT);
  pinMode(SW, INPUT_PULLUP);  // на кнопке её нет
  attachInterrupt(CLK, onClk, FALLING);
  Serial.println("крутите ручку; нажатие — сброс");
}

long shown = 0;
bool lastSw = HIGH;

void loop() {
  long p = position;          // long на ESP32 читается за одну команду
  if (p != shown) {
    Serial.printf("%s  позиция %ld\n", p > shown ? "по часовой  " : "против часовой", p);
    shown = p;
  }
  bool sw = digitalRead(SW);
  if (sw == LOW && lastSw == HIGH) {
    position = 0;
    Serial.println("сброс");
  }
  lastSw = sw;
  delay(5);
}

Скетч можно править и запускать в симуляторе без платы и установки среды.

Что учесть на ESP32

В железе

На модуле стоят подтягивающие резисторы 10 кОм на CLK и DT, а на SW — не у всех: для кнопки включайте INPUT_PULLUP.

Частые ошибки при подключении к ESP32

Другие детали для ESP32