Ви не увійшли.
Или делай все входы INPUT_PULLUP.
Без подтяжки к плюсу какую пульсацию ты ожидаешь?
Вот это забыл исправь и всё заработает!
pinMode(pin_DT, INPUT);
digitalWrite(pin_DT,HIGH); // Кнопка подтянута к +5
pinMode(pin_CLK, INPUT);
digitalWrite(pin_CLK,HIGH); // Кнопка подтянута к +5
pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
я модулями с подтяжками не пользуюсь, использую самый обычный EC-11.
Схему подключения увидеть не помешало бы
Накормил внука и уложил спать, есть время продолжить.
Еще раз ( десятый ) перепроверил подключение. Запустил скетч ( очередной проверочный )
/*
Rotary Encoder - Interrupt Example
The circuit:
* encoder pin A to Arduino pin 2
* encoder pin B to Arduino pin 3
* encoder ground pin to ground (GND)
*/
#include "Rotary.h"
Rotary r = Rotary(2, 3);
void setup() {
Serial.begin(57600);
r.begin();
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
}
void loop() {
}
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result == DIR_NONE) {
// do nothing
}
else if (result == DIR_CW) {
Serial.println("ClockWise");
}
else if (result == DIR_CCW) {
Serial.println("CounterClockWise");
}
}
Если меняю CLK и DT местами, меняется
ClockWise
CounterClockWise
Без подключения + не работает совсем.
Подключение кнопки ( CW ) в данном варианте ни на что не влияет.
В другом скетче кнопкой можно обнулять показания. Обнуляет.
#define pin_CLK 2
#define pin_DT 3
#define pin_Btn 4
unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
int EncoderA, EncoderB, EncoderAPrev, counter;
bool ButtonPrev;
eEncoderState GetEncoderState() {
// Считываем состояние энкодера
eEncoderState Result = eNone;
CurrentTime = millis();
if (CurrentTime >= (LastTime + 5)) {
// Считываем не чаще 1 раза в 5 мс для уменьшения ложных срабатываний
LastTime = CurrentTime;
if (digitalRead(pin_Btn) == LOW ) {
if (ButtonPrev) {
Result = eButton; // Нажата кнопка
ButtonPrev = 0;
}
}
else {
ButtonPrev = 1;
EncoderA = digitalRead(pin_DT);
EncoderB = digitalRead(pin_CLK);
if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
if (EncoderB) Result = eRight; // B=1 => энкодер вращается по часовой
else Result = eLeft; // B=0 => энкодер вращается против часовой
}
EncoderAPrev = EncoderA; // запомним текущее состояние сигнала A
}
}
return Result;
}
void setup() {
pinMode(pin_DT, INPUT);
pinMode(pin_CLK, INPUT);
pinMode(pin_Btn, INPUT_PULLUP); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
Serial.begin(115200);
counter = 0;
}
void loop() {
switch (GetEncoderState()) {
case eNone: return;
case eLeft: {
counter--;
break;
}
case eRight: {
counter++;
break;
}
case eButton: {
counter = 0;
break;
}
}
Serial.println(counter);
}
Но во всех вариантах показания меняются только на каждом втором повороте энкодера.
На Ардуино еще по шине I2C подключен дисплей 1602 и синтезатор.
Все.
Скорее всего, вы напутали с подключением и повторяете ошибку многократно.
Собрал синтезатор на Si5351A + Ардуино Уно+ энкодер KY-040 + дисплей.
Подключил, прошил, все заработало, НО ! Повернул энкодер на один шаг - ничего, на второй шаг - данные изменились. И так все время. Что вправо, что влево. Показания изменяются только на каждый второй поворот энкодера.
Я обратился к автору программы, он ответил, что у него и у всех, кто повторял эту схему, все работает. Прислал мне несколько программ для проверки энкодера - на всех их энкодер работает точно также. Я заменил энкодер на точно такой же ( купил их 3 штуки ) - ничего не поменялось. Все работает четко, не сбоит, нет ложных срабатываний, но показания изменяются только на каждый второй поворот энкодера.
Можете чем-то помочь ?