Rotary encoder (shaft encoder) adalah komponen pengukuran arah putaran. Komponen ini memiliki dua pin keluaran yang menghasilkan sinyal pulsa yang diproses dahulu untuk mendapatkan arah putarannya.
Sinyal rotary encoder:

Rotary encoder tersedia dalam bermacam type, dan tipe yang digunakan dalam program ini ada type potensio rotary encoder.

Sinyal keluaran dari type ini terlihat dapat digambarkan sbb:

komponen aplikasi sketch menu rotary encoder berbasis arduino:
- Arduino Uno
- LCD 16×2 backpack I2C
- Momentary Rotary Encoder
Skema arduino menu menggunakan rotary encoder:

Sketch menu arduino ini menggunakan external interrupt. untuk arduino uno hanya bisa menggunakan pin 2 dan 3, sedangkan arduino mega bisa menggunakan pin 2, 3, 18, 19, 20 dan 21.
program/aplikasi arduino menu arduino dengan lcd I2c 16×2 menggunakan rotary encoder:
#define pinRotaryEncoderCLK 2
#define pinRotaryEncoderDT 3
#define pinRotaryEncoderSwitch 4
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2); // coba juga alamat 0x27 (tergantung seri back pack)
uint8_t maskSensorA;
uint8_t maskSensorB;
uint8_t *pinSensorA;
uint8_t *pinSensorB;
volatile bool encoderAFlag = 0;
volatile bool encoderBFlag = 0;
int8_t nilaiEncoder = 0;
int nilaiSetting[4];
byte setMode;
void setup() {
Serial.begin(9600);
Serial.println("Menu rotary encoder");
Serial.println("https://www.project.semesin.com/");
Serial.println();
pinMode(pinRotaryEncoderCLK, INPUT_PULLUP);
pinMode(pinRotaryEncoderDT, INPUT_PULLUP);
pinMode(pinRotaryEncoderSwitch, INPUT_PULLUP);
Wire.begin();
Wire.beginTransmission(0x3F);
if (Wire.endTransmission())
{
lcd = LiquidCrystal_I2C(0x27, 16, 2);
}
lcd.begin();
lcd.backlight();
attachInterrupt(digitalPinToInterrupt(pinRotaryEncoderCLK), encoderARising, RISING);
attachInterrupt(digitalPinToInterrupt(pinRotaryEncoderDT), encoderBRising, RISING);
maskSensorA = digitalPinToBitMask(pinRotaryEncoderCLK);
pinSensorA = portInputRegister(digitalPinToPort(pinRotaryEncoderCLK));
maskSensorB = digitalPinToBitMask(pinRotaryEncoderDT);
pinSensorB = portInputRegister(digitalPinToPort(pinRotaryEncoderDT));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("A:0 C:0");
lcd.setCursor(0, 1);
lcd.print("B:0 D:0");
}
void loop() {
if (nilaiEncoder != 0)
{
Serial.println(nilaiEncoder);
nilaiSetting[setMode] += nilaiEncoder;
nilaiEncoder = 0;
lcd.setCursor(((setMode / 2) * 8) + 2, setMode % 2);
lcd.print(nilaiSetting[setMode]);
lcd.print(" ");
}
if (!digitalRead(pinRotaryEncoderSwitch))
{
delay(50);
setMode = (setMode + 1) % 4;
while (!digitalRead(pinRotaryEncoderSwitch));
Serial.println(setMode);
}
}
void encoderARising() {
if ((*pinSensorB & maskSensorB) && encoderAFlag)
{
nilaiEncoder = -1;
encoderAFlag = false;
encoderBFlag = false;
}
else
{
encoderBFlag = true;
}
}
void encoderBRising() {
if ((*pinSensorA & maskSensorA) && encoderBFlag)
{
nilaiEncoder = 1;
encoderAFlag = false;
encoderBFlag = false;
}
else
{
encoderAFlag = true;
}
}
library yang digunakan:
penggunaan aplikasi sketch menu rotary encoder:
- tekan knob untuk memilih menu setting
- putar knob ke untuk mengganti nilai setting
Dokumentasi menu rotary encoder lcd i2c:
