
Интернет-магазин «Неглупый Дом»
В другом проекте на сайте энкодер KY-040 плавно задаёт значение ЦАП MCP4725, шаг за шагом. Здесь та же механика вращения используется иначе: Arduino считает не отдельные шаги, а именно полные обороты вала, подавая короткий звуковой сигнал каждый раз, когда счётчик шагов набирает полный круг.
Определение направления вращения такое же, как и в проекте с ЦАП: по сдвигу фаз сигналов CLK и DT определяется, в какую сторону повернули ручку, и счётчик шагов увеличивается или уменьшается на единицу. Разница — в том, что происходит дальше: вместо немедленного применения каждого шага к какому-то значению код просто накапливает шаги, и когда их количество достигает числа, соответствующего одному полному обороту механизма энкодера (обычно 20 щелчков на оборот у большинства моделей KY-040, но может отличаться), подаёт сигнал зуммером и сбрасывает счётчик шагов для следующего оборота.
Количество щелчков на один полный оборот зависит от конкретной механической конструкции энкодера — у разных моделей и производителей это число может быть другим, поэтому его стоит подобрать вручную, посчитав реальные щелчки за один видимый полный оборот ручки вашего экземпляра.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему. Число щелчков на оборот
// (STEPS_PER_REV) зависит от конкретного экземпляра энкодера — посчитайте
// реальные щелчки за один видимый полный оборот ручки и подставьте сюда.
const int CLK_PIN = 2;
const int DT_PIN = 3;
const int BUZZER_PIN = 8;
const int STEPS_PER_REV = 20; // типичное значение для KY-040, проверьте на своём экземпляре
int stepCount = 0;
unsigned int revolutions = 0;
int lastClkState;
void setup() {
Serial.begin(9600);
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
lastClkState = digitalRead(CLK_PIN);
}
void loop() {
int clkState = digitalRead(CLK_PIN);
if (clkState != lastClkState) {
if (digitalRead(DT_PIN) != clkState) {
stepCount++;
} else {
stepCount--;
}
if (abs(stepCount) >= STEPS_PER_REV) {
revolutions++;
stepCount = 0;
tone(BUZZER_PIN, 2000, 100);
Serial.print("Оборотов: ");
Serial.println(revolutions);
}
}
lastClkState = clkState;
}
Дополнительных библиотек не требуется — только `digitalRead()` и `tone()`. Если сигнал звучит заметно раньше или позже реального полного оборота ручки — поправьте `STEPS_PER_REV` под свой экземпляр.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 157 ₽ 141 ₽ (экономия 16 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.