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;
}
}