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: