ロータリーエンコーダは可変抵抗と違って無限に回転できるものが多いです。今回はこんな感じのロータリーエンコーダを使います。
リンク
ロータリーエンコーダの使い方
2番ピンと3番ピンにロータリーエンコーダのAとBをつなぎ、GNDを共有します。(Uno, Nano, Mini ,またそれらの互換ボードでは2番ピン、3番ピンのみで使えます。)その他のボードについてはこの表で確認してください。

以下のスケッチで動きます。1クリックあたりCountの値が4変化します。
#define PIN_A 2
#define PIN_B 3
const int8_t ENCODER_TABLE[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
volatile bool StatePinA = 1;
volatile bool StatePinB = 1;
volatile uint8_t State = 0;
volatile long Count = 0;
void setup() {
pinMode(PIN_A, INPUT_PULLUP);
pinMode(PIN_B, INPUT_PULLUP);
attachInterrupt(0, ChangePinAB, CHANGE);
attachInterrupt(1, ChangePinAB, CHANGE);
Serial.begin(9600);
}
void loop() {
update_value();
Serial.println(value);
delay(10);
}
void ChangePinAB(){
StatePinA = PIND & 0b00000100;
StatePinB = PIND & 0b00001000;
State = (State<<1) + StatePinA;
State = (State<<1) + StatePinB;
State = State & 0b00001111;
Count += ENCODER_TABLE[State];
}
void update_value(){
noInterrupts();
value = Count;
interrupts();
}
2番ピン3番ピン以外で使いたい場合はUno以外のボードを使いましょう。
下の表はピン変化割り込みが使えるピンとボードの関係です。
| ボード | 使えるピン |
| Uno, Nano, Min | 2,3 |
| Due , Uno WiFi Rev.2, 101 | 全てのデジタルピン |
| Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
| Micro, Leonardo | 0, 1, 2, 3, 7 |
| Zero | 4番ピン以外のデジタルピン |
| MKR | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
2つ以上のロータリーエンコーダを使う場合
タイマ割り込みを使えば、Arduino Unoで無理やり複数のロータリーエンコーダを使うっことができます。
より正確に測りたい場合は、 Arduino Dueを使った方が良いかと思います。Arduino Due はすべてのピンでピン変化割り込みが使えるので、全てのピンで複数のロータリーエンコーダを使うことが出来ます。Arduino Dueは 32bit マイコンでArduino Unoよりも処理が早いので、取りこぼしも減ると思います。
リンク

コメント
割り込み処理のミスについてあれこれと・・・ご一読いただければ。
http://igarage.cocolog-nifty.com/blog/2022/03/post-fbb7ad.html