🛒
0 товаров
0 руб.

Интернет-магазин «Неглупый Дом»


🔢 Проект: счётчик полных оборотов энкодера KY-040 со звуковым сигналом

В другом проекте на сайте энкодер KY-040 плавно задаёт значение ЦАП MCP4725, шаг за шагом. Здесь та же механика вращения используется иначе: Arduino считает не отдельные шаги, а именно полные обороты вала, подавая короткий звуковой сигнал каждый раз, когда счётчик шагов набирает полный круг.

Как это работает

Определение направления вращения такое же, как и в проекте с ЦАП: по сдвигу фаз сигналов CLK и DT определяется, в какую сторону повернули ручку, и счётчик шагов увеличивается или уменьшается на единицу. Разница — в том, что происходит дальше: вместо немедленного применения каждого шага к какому-то значению код просто накапливает шаги, и когда их количество достигает числа, соответствующего одному полному обороту механизма энкодера (обычно 20 щелчков на оборот у большинства моделей KY-040, но может отличаться), подаёт сигнал зуммером и сбрасывает счётчик шагов для следующего оборота.

Количество щелчков на один полный оборот зависит от конкретной механической конструкции энкодера — у разных моделей и производителей это число может быть другим, поэтому его стоит подобрать вручную, посчитав реальные щелчки за один видимый полный оборот ручки вашего экземпляра.

Пошаговая сборка

Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.

  1. KY-040: CLK → D2, DT → D3, VCC → 5V, GND → GND (кнопку SW для этого проекта подключать не нужно).
  2. Зуммер: сигнал → D8, GND → GND.

Скетч

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему. Число щелчков на оборот
// (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: Электронные модули.

← 🔄 регулировка скорости DC-мотора потенциомет…🕹️ включение реле резким отклонением джойстик… →

🎁 Купить весь комплект со скидкой 10%

Все 2 товара сразу в корзину: 157 ₽ 141 ₽ (экономия 16 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина


Поиск



Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA