Подключение энкодера KY-040 к ESP32
Энкодер с кнопкой
KY-040 к ESP32 — три сигнальных вывода: CLK, DT и SW (кнопка), плюс питание 3,3 В и земля. Для CLK и DT на ESP32 подходит любой GPIO с прерыванием, то есть почти любой.
Схема подключения энкодера KY-040 к ESP32
| KY-040 | ESP32 |
|---|---|
| CLK | GPIO18 |
| DT | GPIO19 |
| SW | GPIO21 |
| VCC | 3V3 |
| GND | GND |
Схема из примера «Энкодер 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
- На модуле KY-040 стоят подтяжки 10 кОм к VCC: при питании 3,3 В сигналы нормальные для ESP32, а при 5 В они подадут на входы 5 В.
- Не используйте GPIO34–39 с
INPUT_PULLUP: у них нет внутренних подтяжек.
В железе
На модуле стоят подтягивающие резисторы 10 кОм на CLK и DT, а на SW — не у всех: для кнопки включайте
INPUT_PULLUP.Частые ошибки при подключении к ESP32
- Питать KY-040 от 5 В: подтяжки на модуле выдают 5 В на входы ESP32.
- Считывать энкодер опросом в
loop()сdelay(): быстрые повороты теряются, нужны прерывания. - Опрос в
loopсdelay()— пока скетч ждёт, щелчки пропадают. - Каждый щелчок считается дважды или через раз — контакты дребезжат. Помогает конденсатор 10–100 нФ на землю или программный фильтр по времени.
- Кнопка SW без подтяжки — в отпущенном состоянии вход висит и «нажимается» сам.
- Направление перепутано — поменяйте местами CLK и DT в коде, а не провода.
Ещё по теме
Другие детали для ESP32
HC-SR04DHT22 (AM2302)BME280DS3231SSD1306 OLED 0,96″LCD 1602 с I2CMAX7219TM1637MPU6050 (GY-521)Модуль релеWS2812B (NeoPixel)Клавиатура 4×4HX711ФоторезисторМодуль microSDRGB-светодиодСервопривод SG9074HC595ИК-приёмник (VS1838B)TFT ST7735 1,8″Шаговый двигательКнопкаПотенциометрПьезопищалкаСветодиодDS18B20Ползунковый переключательHC-SR501TTP223Датчик влажности почвыMQ-2LM35Джойстик KY-023DHT11HTU21DSN65HVD230