
Интернет-магазин «Неглупый Дом»
Классическая база для любого устройства с настройками: энкодер KY-040 листает список пунктов на LCD1602 вращением, а встроенная кнопка энкодера подтверждает выбор текущего пункта.
KY-040 — это поворотный энкодер с двумя цифровыми выходами (CLK и DT), которые при вращении переключаются в определённой последовательности. Сравнивая, какой из двух сигналов изменился первым, можно определить не только сам факт вращения, но и его направление — по часовой стрелке или против. Именно так в коде определяется, увеличивать или уменьшать номер выбранного пункта меню.
В отличие от потенциометра, энкодер не имеет конечных положений и не "упирается" в край — можно крутить бесконечно в любую сторону, что удобно для циклического меню (после последнего пункта снова переходим к первому, как и реализовано через `% menuCount`). Кнопка SW — это просто механическая кнопка, встроенная в сам энкодер и срабатывающая при нажатии на ручку.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int clkPin = 2;
const int dtPin = 3;
const int swPin = 4;
LiquidCrystal_I2C lcd(0x27, 16, 2);
String menuItems[] = {"Яркость", "Температура", "Режим", "Выход"};
const int menuCount = 4;
int selected = 0;
int lastClk;
void showMenu() {
lcd.setCursor(0, 0);
lcd.print("> ");
lcd.print(menuItems[selected]);
lcd.print(" ");
}
void setup() {
Serial.begin(9600);
pinMode(clkPin, INPUT);
pinMode(dtPin, INPUT);
pinMode(swPin, INPUT);
lastClk = digitalRead(clkPin);
lcd.init();
lcd.backlight();
showMenu();
}
void loop() {
int clk = digitalRead(clkPin);
if (clk != lastClk) {
// сравниваем CLK и DT, чтобы определить направление вращения
if (digitalRead(dtPin) != clk) {
selected = (selected + 1) % menuCount; // по часовой стрелке
} else {
selected = (selected - 1 + menuCount) % menuCount; // против часовой стрелки
}
showMenu();
Serial.print("Выбран пункт: ");
Serial.println(menuItems[selected]);
}
lastClk = clk;
if (digitalRead(swPin) == HIGH) {
lcd.setCursor(0, 1);
lcd.print("Selected! ");
Serial.println("Подтверждено нажатием кнопки");
delay(500); // простая защита от дребезга и повторного срабатывания
}
}
Массив `menuItems` — это готовый шаблон: замените строки на свои пункты настроек, а внутри блока «Selected!» подставьте реальное действие для каждого пункта.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 314 ₽ 283 ₽ (экономия 31 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.