
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
|
<--->
|
接地
|
程式碼
程式亦可到GitHub下載。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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 留言
可以把Serial.println(counter);放在else{ counter--;} Serial.println(counter);},就不會一直跳了!
回覆刪除不一定能即時回覆問題,有時間會盡量答覆。