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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #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(); 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: