滑鼠拆下來的滾輪編碼器
時序為
→ CW
A ----------- ------------- HIGH
---------- LOW
← CCW
B -------- ---------------- HIGH
---------- LOW
A B
1 1↓CW
1 0
0 0
0 1
1 1
1 0
0 0
0 1↑CCW
程式碼參考底下網址來源修改而來
沒中斷版本
參考來源:
http://www.arduino.cn/thread-2423-1-1.html
http://www.geek-workshop.com/thread-373-1-1.html
2015/05/24 更新
恩..多一顆按鈕
CLK 當作A
DT 當B
時序為
→ CW
A ----------- ------------- HIGH
---------- LOW
← CCW
B -------- ---------------- HIGH
---------- LOW
A B
1 1↓CW
1 0
0 0
0 1
1 1
1 0
0 0
0 1↑CCW
程式碼參考底下網址來源修改而來
#define ENCODER_A_PIN 2 #define ENCODER_B_PIN 3 unsigned long time = 0; long position = 0; long num = 0; void setup() { pinMode(ENCODER_A_PIN,INPUT); pinMode(ENCODER_B_PIN,INPUT); attachInterrupt(0, RotaryEncoder, LOW); Serial.begin(9600); time = millis(); } void loop() { while (num != position) { num = position; Serial.println(num); } } void RotaryEncoder(){ int temp =digitalRead(ENCODER_B_PIN); if ((millis() - time) > 3) { if ( temp == LOW) { position++; }else{ if ( temp == HIGH) position--; } } time = millis(); }
沒中斷版本
int trigger=0; void RotaryEncoder(){ int tempA =digitalRead(ENCODER_A_PIN); int tempB =digitalRead(ENCODER_B_PIN); if ((millis() - time) > 3) { if(tempA==LOW && trigger==HIGH){ if ( tempB == LOW) { position++; }else{ if ( tempB == HIGH) position--; } } trigger=tempA; time = millis(); } }
參考來源:
http://www.arduino.cn/thread-2423-1-1.html
http://www.geek-workshop.com/thread-373-1-1.html
2015/05/24 更新
恩..多一顆按鈕
CLK 當作A
DT 當B
#define ENCODER_A_PIN 2 #define ENCODER_B_PIN 3 #define SW_PIN 4 unsigned long time = 0; volatile long position = 0; volatile long num = 0; void setup() { pinMode(ENCODER_A_PIN,INPUT_PULLUP); pinMode(ENCODER_B_PIN,INPUT_PULLUP); pinMode(SW_PIN, INPUT_PULLUP); // 輸入模式並啟用內建上拉電阻 attachInterrupt(0, RotaryEncoder, LOW); Serial.begin(9600); time = millis(); } void loop() { if(digitalRead(SW_PIN) == LOW){ // 按下開關,歸零 position = 0; Serial.println("count reset to 0"); delay(300); } while (num != position) { num = position; Serial.println(num); } } void RotaryEncoder(){ int temp =digitalRead(ENCODER_B_PIN); if ((millis() - time) > 3) { if ( temp == LOW) { position++; }else{ if ( temp == HIGH) position--; } } time = millis(); }
留言
張貼留言