Работа с инкрементальными энкодерами.

#define encoder1PinA 2                  // А  пин 2 прерывание
#define encoder1PinB 4                  // B  пин 4
#define encoder2PinA 3                  // А  пин 3 преравание
#define encoder2PinB 5                  // B  пин 5

volatile long encoder1Pos = 0;        //  переменная по подсчету импульсов
volatile long encoder2Pos = 0;        //  переменная по подсчету импульсов

void setup() {
pinMode(encoder1PinA, INPUT);
pinMode(encoder1PinB, INPUT);
pinMode(encoder2PinA, INPUT);
pinMode(encoder2PinB, INPUT);
attachInterrupt(0, Encoder1, RISING); // прерывание вызывается только при смене значения на порту с LOW на HIGH
attachInterrupt(1, Encoder2, RISING); // прерывание вызывается только при смене значения на порту с LOW на HIGH

Serial.begin (9600);

}

void Encoder1()
{
  if (digitalRead(encoder1PinA) == HIGH)
{
  if (digitalRead(encoder1PinB) == LOW)
  {
    encoder1Pos = encoder1Pos + 1;         // по часовой стрелке
  }
  else
  {
    encoder1Pos = encoder1Pos - 1;         // против часовой стрелки
  }
}

}

void Encoder2()
{
if (digitalRead(encoder2PinA) == HIGH)
{
  if (digitalRead(encoder2PinB) == LOW)
  {
    encoder2Pos = encoder2Pos + 1;         // по часовой стрелке
  }
  else
  {
    encoder2Pos = encoder2Pos - 1;         // против часовой стрелки
  }
}

}





void loop ()
{
Serial.print(encoder1Pos);
Serial.print("        ");
Serial.print(encoder2Pos);
Serial.println("");


}