한번 돌아가는데 20번 스텝이 있습니다.





코드는 http://bildr.org/2012/08/rotary-encoder-arduino/ 에서 가져왔지만 약간 수정했습니다. 로터리 돌리면 밝기 조정되고 로터리 누르면 밝기가 리셋되면서 red led가 on/off 됩니다.
//From bildr article: http://bildr.org/2012/08/rotary-encoder-arduino/ //these pins can not be changed 2/3 are special pins int encoderPin1 = 2; // interrupt #1 int encoderPin2 = 3; // interrupt #2 int encoderSwitchPin = 4; //push button switch int ledPin1 = 7; int ledPin2 = 9; bool ledStatus = false; int defaultValue = 140; int encoderSet = 0; volatile int lastEncoded = 0; volatile long encoderValue = 0; long lastencoderValue = 0; int lastMSB = 0; int lastLSB = 0; void setup() { Serial.begin (9600); pinMode(encoderPin1, INPUT); pinMode(encoderPin2, INPUT); pinMode(encoderSwitchPin, INPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); digitalWrite(encoderPin1, HIGH); //turn pullup resistor on digitalWrite(encoderPin2, HIGH); //turn pullup resistor on digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on //call updateEncoder() when any high/low changed seen //on interrupt 0 (pin 2), or interrupt 1 (pin 3) attachInterrupt(0, updateEncoder, CHANGE); attachInterrupt(1, updateEncoder, CHANGE); } void loop() { //Do stuff here if (!digitalRead(encoderSwitchPin)) { Serial.println("pushed"); ledStatus = !ledStatus; digitalWrite(ledPin1, ledStatus); encoderValue = 0; } Serial.println(encoderValue); encoderSet = defaultValue + encoderValue * 2; if (encoderSet <0) encoderSet = 0; if (encoderSet > 255) encoderSet = 255; analogWrite(ledPin2, encoderSet); delay(1000); //just here to slow down the output, and show it will work even during a delay } void updateEncoder() { int MSB = digitalRead(encoderPin1); //MSB = most significant bit int LSB = digitalRead(encoderPin2); //LSB = least significant bit int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; lastEncoded = encoded; //store this value for next time }