volatile int encoderPosition = 0; // Використовуємо volatile для змінних, які змінюються всередині переривань
const int encoderPinA = 34;
const int encoderPinB = 35;

// Функція для обробки переривання від енкодера
void handleEncoder() {
  static unsigned long lastInterruptTime = 0; // Захист від дребезгу
  unsigned long interruptTime = millis();

  // Перевірка на дребезг (наприклад, 5 мс)
  if (interruptTime - lastInterruptTime > 5) {
    if (digitalRead(encoderPinA) == digitalRead(encoderPinB)) {
      encoderPosition++;
    } else {
      encoderPosition--;
    }
    lastInterruptTime = interruptTime;
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(encoderPinA, INPUT_PULLUP);
  pinMode(encoderPinB, INPUT_PULLUP);
  // Налаштування переривання на зміну стану піна A
  attachInterrupt(digitalPinToInterrupt(encoderPinA), handleEncoder, CHANGE);
}

void loop() {
  // Виведення позиції енкодера
  static int lastReportedPos = 0; // Остання позиція, яку ми повідомили
  if (encoderPosition != lastReportedPos) {
    Serial.println(encoderPosition);
    lastReportedPos = encoderPosition;
  }
}