Как работает энкодер?

Есть esp32. Есть модуль энкодера, в котором пины CLK и DT подтянуты к верхнему уровню. Антидребезговых фильтров нет. Соединены банально:
" + " → +3,3В
GND → GND
CLK → pin10
DT → pin9

Тестовый скетч:

#define CLK 10
#define DAT 9

bool flag = true;

void enc_interrupt() {
  if (!flag)
    return;
  flag = false;

  Serial.print("clk changed. clk = ");
  Serial.println(digitalRead(CLK));
}

void setup() {
  Serial.begin(115200);
  pinMode(CLK, INPUT);
  pinMode(DAT, INPUT);

  attachInterrupt(CLK, enc_interrupt, CHANGE);
}

void loop() {
  delay(1000);
  Serial.print("clk = ");
  Serial.println(digitalRead(CLK));
  flag = true;
}

Если энкодер не трогать, то, как и ожидается, в СериалМоитор выводится:
clk = 1
clk = 1

Далее я ожидаю, что при вращении энкодера в СериалМонитор будет выводитьсяclk
clk = 1
clk = 1
changed. clk = 0

При вращении налево так и происходит. А вот при вращении на право выдается:
clk = 1
clk = 1
clk changed. clk = 1

Получается пародоксальная ситуация, на пине CLK была единица, а потом она поменялась на… опять единицу.
Подскажите, пожалуйста, чего конкретно я не понимаю, и почему так происходит? В чем разница в данном случае при вращении налево и направо?
Поведение достаточно стабильно и замена энкодера на аналогичный на результат не влияет.

Забыл уточнить что esp32 на самом деле esp32c3 Super Mini. Но в данном случае, полагаю, это не принципиально.

Там совсем о другом.
Или Вы имеете ввиду

Уберите, для начала, вывод в сериал из прерывания

3 лайка

Там о работе с энкодером. В #30 посте приводится ссылка на неплохую библиотеку

Нет

У меня нет проблемы в работе с энкодером. Он работает нормально, если его подключить нормально и использовать “неплохую библиотеку”.
У меня вопрос, как он работает? Ключевое: почему возникает ситуация, когда на пине была единица и во время срабатывания на этом пине прерывания типа CHANGE на нем снова единица. Причем поведение зависит от направления вращения энкодера.

Энкодер на прерываниях пинов должен получать прерывания от обоих пинов, а не только от одного.

Естественно, иначе как понять в какую сторону Вы крутите энкодер?!

Предлагаете прочитать вам лекцию о его устройстве и принципах работы? Или научить вас пользоваться гуглом?

судя по картинке такого быть не может

1 лайк

Чой-та не может, если он только CLK слушает?

1 лайк

на одношелчковом какая разница?

Действительно, зачем там два пина?

1 лайк

состояние CLK жеж смотрит, что CW что CCW поведение будет одинаковым

Хоть кто-то прочитал, в чем суть вопроса.

дай распечатку на 10 щелчков туда и обратно

Нет. Вопрос вполне конкретный. Если не знаете ответ, или нет желания его давать, я Вас не заставляю.

20:03:44.872 → clk = 1
20:03:45.893 → clk = 1
20:03:46.878 → clk = 1
20:03:47.062 → clk changed. clk = 0
20:03:47.917 → clk = 1
20:03:48.928 → clk = 1
20:03:49.412 → clk changed. clk = 0
20:03:49.927 → clk = 1
20:03:50.928 → clk = 1
20:03:51.205 → clk changed. clk = 0
20:03:51.921 → clk = 1
20:03:52.829 → clk changed. clk = 0
20:03:52.922 → clk = 1
20:03:53.930 → clk = 1
20:03:54.257 → clk changed. clk = 0
20:03:54.941 → clk = 1
20:03:55.931 → clk = 1
20:03:56.483 → clk changed. clk = 0
20:03:56.936 → clk = 1
20:03:57.924 → clk = 1
20:03:58.654 → clk changed. clk = 0
20:03:58.932 → clk = 1
20:03:59.945 → clk = 1
20:04:00.785 → clk changed. clk = 0
20:04:00.913 → clk = 1
20:04:01.936 → clk = 1
20:04:02.873 → clk changed. clk = 0
20:04:02.918 → clk = 1
20:04:03.918 → clk = 1
20:04:04.460 → clk changed. clk = 0
20:04:04.956 → clk = 1
20:04:05.937 → clk = 1
20:04:06.956 → clk = 1
20:04:07.164 → clk changed. clk = 1
20:04:07.927 → clk = 1
20:04:08.933 → clk = 1
20:04:09.511 → clk changed. clk = 1
20:04:09.961 → clk = 1
20:04:10.960 → clk = 1
20:04:11.956 → clk = 1
20:04:12.002 → clk changed. clk = 1
20:04:12.943 → clk = 1
20:04:13.981 → clk = 1
20:04:14.028 → clk changed. clk = 1
20:04:14.947 → clk = 1
20:04:15.990 → clk = 1
20:04:16.067 → clk changed. clk = 1
20:04:16.952 → clk = 1
20:04:17.977 → clk = 1
20:04:18.281 → clk changed. clk = 1
20:04:19.008 → clk = 1
20:04:20.000 → clk = 1
20:04:20.481 → clk changed. clk = 1
20:04:20.989 → clk = 1
20:04:21.962 → clk = 1
20:04:22.598 → clk changed. clk = 1
20:04:22.967 → clk = 1
20:04:23.968 → clk = 1
20:04:25.018 → clk = 1
20:04:25.609 → clk changed. clk = 1
20:04:25.996 → clk = 1
20:04:27.002 → clk = 1
20:04:27.589 → clk changed. clk = 1
20:04:27.997 → clk = 1
20:04:28.982 → clk = 1
20:04:30.006 → clk = 1
20:04:31.002 → clk = 1

Три раза влево, три раза вправо.

UPD: по 10 же просили)

Да, я прочитал. Вы не знаете, как работает энкодер. Гуглится на раз, информации в интернетах - тонны

Яндекс
Гугл

Вам реально проще спрашивать об очевидных вещах на форумах, чем поискать информацию самостоятельно?