#define ENC_A 2 // Пин CLK энкодера
#define ENC_B 3 // Пин DT энкодера
#define ENC_SW 4 // Пин кнопки энкодера
volatile int position = 0; // Позиция энкодера
volatile bool p0, p1; // Предыдущее состояние пинов энкодера
void pollEnc(bool e0, bool e1) {
// Проверяем изменение состояния энкодера
if (p0 ^ p1 ^ e0 ^ e1) {
// Вычисляем направление вращения
if (p1 ^ e0) position++;
else position--;
p0 = e0;
p1 = e1;
}
}
void isrA() {
pollEnc(!p0, p1); // Инвертируем p0
}
void isrB() {
pollEnc(p0, !p1); // Инвертируем p1
}
void setup() {
Serial.begin(115200);
pinMode(ENC_A, INPUT_PULLUP);
pinMode(ENC_B, INPUT_PULLUP);
pinMode(ENC_SW, INPUT_PULLUP);
// Инициализируем начальное состояние энкодера
p0 = digitalRead(ENC_A);
p1 = digitalRead(ENC_B);
// Подключаем прерывания по изменению состояния пинов энкодера
attachInterrupt(digitalPinToInterrupt(ENC_A), isrA, CHANGE);
attachInterrupt(digitalPinToInterrupt(ENC_B), isrB, CHANGE);
}
void loop() {
static bool lastButtonState = HIGH;
bool buttonState = digitalRead(ENC_SW);
// Проверяем нажатие кнопки (активно LOW)
if (lastButtonState == HIGH && buttonState == LOW) {
Serial.println("Button pressed");
}
lastButtonState = buttonState;
// Выводим текущую позицию энкодера
Serial.print("Position: ");
Serial.println(position);
delay(1000); // Небольшая задержка для удобства чтения
}