Работа энкодера.

VictorArx

★★✩✩✩✩✩
22 Мар 2021
532
86
C++:
#include "RotaryEncoder.h"          // библиотека для энкодера
RotaryEncoder encoder(A2, A3);  // пины подключение энкодера (DT, CLK)

static int pos = 0;  // задаем начальное положение энкодера
int newPos;

void setup() {
  Serial.begin(9600);
  Serial.println(pos);  // выводим на монитор начальное значение
}

void loop() {
   // проверяем положение ручки энкодера
   encoder.tick();
   newPos = encoder.getPosition();

   // если положение изменилось - выводим на монитор
   if (pos != newPos) {
      Serial.println(newPos);
      pos = newPos;
   }
}
Изучаю работу энкодера. Работу его смотрю в мониторе порта. Код рабочий. Изменения цифр происходит только при двойном щелчке энкодера. Так должно быть или это энкодер бракованый?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Собственно и тут есть выбор шагов:
C++:
 enum class LatchMode {
    FOUR3 = 1, // 4 steps, Latch at position 3 only (compatible to older versions)
    FOUR0 = 2, // 4 steps, Latch at position 0 (reverse wirings)
    TWO03 = 3  // 2 steps, Latch at position 0 and 3
  };
Вызов конструктора:
C++:
 RotaryEncoder(int pin1, int pin2, LatchMode mode = LatchMode::FOUR0);
И получается , что надо писать не
RotaryEncoder encoder(A2, A3);
а
RotaryEncoder encoder(A2, A3,TWO03);
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
532
86
C++:
#define CLK 2
#define DT 3
#define SW 4

#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW,TYPE1);

void setup() {
  Serial.begin(9600);
  enc1.setTickMode(AUTO);
}

void loop() {
  // enc1.tick();  // не нужна, в этом режиме (AUTO) она входит в каждую функцию!

  if (enc1.isTurn()) {     // если был совершён поворот (индикатор поворота в любую сторону)
    // ваш код
  }

  if (enc1.isRight()) Serial.println("Right");         // если был поворот
  if (enc1.isLeft()) Serial.println("Left");

  if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
  if (enc1.isLeftH()) Serial.println("Left holded");

  if (enc1.isPress()) Serial.println("Press");         // нажатие на кнопку (+ дебаунс)
  if (enc1.isRelease()) Serial.println("Release");     // отпускание кнопки (+ дебаунс)
  if (enc1.isHolded()) Serial.println("Holded");       // если была удержана и энк не поворачивался
  //if (enc1.isHold()) Serial.println("Hold");         // возвращает состояние кнопки
}
Скачал библиотеку Гайвера. Теперь работает через один тик энка. Есть одно но. Через несколько поворотов вправо в мониторе порта появляется надпись Left и наоборот при повороте влево появляется надпись Right. Это ошибка библиотеки (замахнулся на самого Уильяма так сказать Шекспира) или попался бракованный энкодер?

Right,Right,Right,Right,Right,Left,Right,Right.
 
Изменено:

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,412
978
58
Марий-Эл
Я не об этом.
Там, при инициализации, есть Type1 и Type2 Нужно попробовать инициализировать с одним и с другим типом.
C++:
Encoder(uint8_t clk, uint8_t dt, int8_t sw = -1, bool type = false); // CLK, DT, SW, тип (TYPE1 / TYPE2) TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип