
Интернет-магазин «Неглупый Дом»
В других проектах на сайте энкодер KY-040 плавно задаёт значение ЦАП или считает полные обороты. Здесь используется только сам факт направления вращения: один щелчок по часовой стрелке в любой момент включает реле, один щелчок против часовой — выключает, независимо от того, сколько щелчков было до этого.
Определение направления такое же, как и в остальных проектах с этим энкодером: по тому, какой из двух сигналов (CLK или DT) изменился первым, определяется, в какую сторону повёрнута ручка. Разница — в реакции кода: вместо накопления щелчков в счётчик (как для оборотов) или изменения числового значения (как для ЦАП) здесь каждое отдельное направление сразу и однозначно устанавливает одно из двух фиксированных состояний реле — включено при вращении по часовой, выключено при вращении против, без промежуточных состояний и без памяти о предыдущих щелчках.
Такое поведение удобно там, где нужен явный физический жест "включить"/"выключить" через поворот, а не кнопка — например, как альтернатива тумблеру, но с тактильной обратной связью щелчка энкодера при каждом повороте.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
const int CLK_PIN = 2;
const int DT_PIN = 3;
const int RELAY_PIN = 4;
int lastClkState;
void setup() {
Serial.begin(9600);
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
lastClkState = digitalRead(CLK_PIN);
}
void loop() {
int clkState = digitalRead(CLK_PIN);
if (clkState != lastClkState) {
if (digitalRead(DT_PIN) != clkState) {
digitalWrite(RELAY_PIN, HIGH); // по часовой стрелке — включить
Serial.println("Реле включено");
} else {
digitalWrite(RELAY_PIN, LOW); // против часовой — выключить
Serial.println("Реле выключено");
}
}
lastClkState = clkState;
}
Дополнительных библиотек не требуется — только `digitalRead()` и `digitalWrite()`. В отличие от проекта со счётчиком оборотов, здесь важен только знак каждого отдельного шага, а не их накопленное количество.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 192 ₽ 173 ₽ (экономия 19 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.