Arduino | 旋轉編碼器模組使用(3)---使用中斷並加入按鈕歸零


 Arduino | 旋轉編碼器模組使用(3)---使用中斷並加入按鈕歸零

關鍵字:arduino旋轉編碼器模組。
延續上一篇<Arduino | 旋轉編碼器模組使用(2)---使用中斷>,此篇加入旋轉編碼器上的按鈕控制,讓按鈕按下時,可以清空計數。

腳位說明

腳位說明
CLK相當於A相
DT相當於B相
SW編碼器按鈕腳位(編碼器上有開關的功能,可以按壓)
+正電源
GND接地

腳位觸發變化

通電後,CLK、DT、SW都是高電位(HIGH),當觸發時會變低電位(LOW),而SW(按鈕)被按下時變為低電位(LOW)。


程式接腳

腳位

連接Arduino開發板腳位
CLK
<--->
Arduino Pin2
DT
<--->
Arduino Pin7
SW
<--->
Arduino Pin6
+
<--->
正電源 5V or 3.3V
GND
<--->
接地
SW按鈕的作用,黑修斯是用來將計數歸零,讀者可以自行規劃用途。


程式碼

程式亦可到GitHub下載。

/* Arduino Rotary Encoder Tutorial
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 時間:2018/06/20
* 作者:黑修斯 (陳建仲)
* 檔名:encoder_hu03
* 版本:v01
* 說明:旋轉編碼器模組加入中斷來計算,減少丟步(遺失訊號),另外加入sw按鈕功能,用於清除計數。
*/
#define sw 6 //定義 sw = 6
#define outputA 2 //定義 outputA = 2
#define outputB 7 //定義 outputB = 7
int counter = 0; //定義 counter 為 int 類型變數,且初始值為0
int aState; //定義 aState 為 int 類型變數
int aLastState; //定義 aLastState 為 int 類型變數
//初始化設定↓↓↓
void setup() {
pinMode (sw,INPUT);
pinMode (outputA,INPUT); //埠口模式設定:outputA 設為 輸入
pinMode (outputB,INPUT); //埠口模式設定:outputB 設為 輸入
attachInterrupt (0, test, CHANGE); //啟用中斷函式(中斷0,test函式,CHANGE模式)
Serial.begin (9600); //Serial通訊鮑率設為9600
aLastState = digitalRead (outputA); //將初始outputA的讀取值 設給 aLastState
}
//主程式運作區↓↓↓
void loop() {
Serial.print("Position: "); //透過serial印出字串 Position:
Serial.println(counter); //透過serial印出 counter 值
clear_count();
}
//test函式
void test(){
aState = digitalRead(outputA); //將outputA的讀取值 設給 aState
if (aState != aLastState){ //條件判斷,當aState 不等於 aLastState時發生
if (digitalRead(outputB) != aState) { //條件判斷,當outputB讀取值 不等於 aState時發生
counter ++; //計數器+1
} else {
counter --; //計數器-1
}
}
aLastState = aState; //將aState 最後的值 設給 aLastState
}
void clear_count(){ //用於計數清除的副程式
if (digitalRead(sw) == LOW){ //當sw 為低電位時條件成立
counter = 0 ;
}
}

計數歸零

按下按鈕後,會將計數歸零,如下圖:



轉貼本文時,需註明來自黑修斯隨手札記原創作者 hughes chen(黑修斯),及附上原文連結,同時 禁止修改,禁止商業使用 。

張貼留言

1 留言

  1. 可以把Serial.println(counter);放在else{ counter--;} Serial.println(counter);},就不會一直跳了!

    回覆刪除

不一定能即時回覆問題,有時間會盡量答覆。