步驟1:理論
首先介紹一些理論。 使用按鈕打開燈很簡單,如果按鈕顯示 HIGH (按下時),那么我們可以通過寫連接到的輸出引腳來打開LED 》 HIGH 。按鈕讀取 LOW 后,我們可以再次將輸出引腳設置為 LOW 以關閉LED。這就是我們所說的瞬時的。
對于此設置,我們希望打開或關閉LED。對于上面的簡單示例,這本身就是一個問題,因為Arduino中的循環功能每秒重復數百次。即使最快的按鍵也可以多次打開和關閉。第一個問題我們將使用一個或兩個簡單的布爾值來克服,這將在接下來的幾頁中進行解釋。
第二個問題是長按功能。我們如何觸發此功能而不先觸發短按功能?答案很簡單。按下按鈕時觸發長按功能,釋放按鈕后觸發短按功能。通過在長按功能激活之前在屏幕上釋放一個對象,可以再次在智能手機上觀察到這一點。
在下一步中,我們將創建硬件設置,如果需要,請跳過此設置您已經處于這個階段。..
步驟2:硬件
硬件非常簡單,所以我不會給您帶來太多負擔。
首先是兩個LED。我們將每個陽極連接到Arduino的引腳12和13,然后將陰極接地。
按鈕連接到5V輸出和Arduino的引腳3,然后用10kOhm電阻接地。
第3步:詳細軟件第1部分
現在詳細說明代碼的每個步驟。如果您想直接閱讀完整的代碼,則將在步驟5中找到
。首先讓我們看一下該設置所需的變量,從簡單的引腳參考開始。
p》 int LED1 = 12;
int LED2 = 13;
int button = 3;
接下來,我們需要一些布爾值。這些將用于打開或關閉LED的狀態
boolean LED1State = false;
boolean LED2State = false;
現在另外兩個布爾值。第一個將根據按鈕的狀態進行更改。這將使代碼可以檢測到按下或釋放按鈕后的第一個循環。第二個功能有兩個功能,它將允許代碼停止長按多次激活,并在長按后釋放按鈕時停止激活短按功能。
boolean buttonActive = false;
boolean longPressActive = false;
最后兩個變量。第一個變量用于記錄第一次按下按鈕的時間。第二個變量是您希望按住按鈕的時間長度(以毫秒為單位),以激活長按功能。可以更改為您選擇的圖形。
long buttonTimer = 0;
long longPressTime = 250;
現在進行設置,這又非常簡單,我們只需設置引腳模式即可。
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(button, INPUT);
}
第4步:詳細軟件部分2
現在進入循環。我將對此進行細分一點一點地解釋發生了什么。程序要做的第一件事是讀取按鈕的狀態。這將為我們提供下面的代碼,并允許我們為未按下和按下狀態創建函數,請記住,短按功能在釋放按鈕時發生。
if (digitalRead(button) == HIGH) {
//Button pressed
} else {
//Button not pressed
}
在按下按鈕的部分中,我們要做的第一件事是測試buttonActive變量,在設置時將其設置為false 。如果當前為假,則表示程序正在檢測首次按下的按鈕。這是因為在讀取false之后,我們立即將其設置為true,只有釋放按鈕才能將其設置為false。我們還記錄了按鈕第一次被按下的時間。
if (buttonActive == false) {
buttonActive = true;
buttonTimer = millis();
}
按鈕被按下部分的下一步是測試我們將按鈕按下了多長時間。 。為此,我們測試當前時間,減去第一次按下的時間(以毫秒為單位),然后將其與希望激活長按之前的時間進行比較。
我們還檢查longPressActive布爾值是否為false,因為一旦激活長按功能,我們便會將此布爾值設置為true以停止重復激活。一旦將按鈕按住所需的時間,我們將翻轉LED1State布爾值的狀態,布爾值將相應地翻轉LED相應地連接到 HIGH 或 LOW 的引腳。
if ((millis() - buttonTimer 》 longPressTime) && (longPressActive == false)) {
longPressActive = true;
LED1State = !LED1State;
digitalWrite(LED1, LED1State);
}
移至未按下代碼部分的按鈕。我們將檢查的第一件事是buttonActive布爾值是否為true。如果將其設置為true,則代碼是自釋放按鈕以來的第一次循環。然后它將布爾值設置回false,以允許上面的代碼檢測到再次按下按鈕。
if (buttonActive == true) {
buttonActive = false;
}
在上面的if語句中,在我們檢測到第一個循環時釋放按鈕后,我們接下來將檢查長按功能是否已激活,這將放棄兩個可能的步驟。如果長按被激活,我們只需將longPressActive設置回false即可允許程序再次長按。如果未激活,我們將像第一個那樣翻轉第二個LED的狀態。
if (longPressActive == true) {
longPressActive = false;
} else {
LED2State = !LED2State;
digitalWrite(LED2, LED2State);
}
步驟5:完整代碼
這是準備上傳到Arduino的完整代碼。
int LED1 = 12;
int LED2 = 13;
int button = 3;
boolean LED1State = false;
boolean LED2State = false;
long buttonTimer = 0;
long longPressTime = 250;
boolean buttonActive = false;
boolean longPressActive = false;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(button, INPUT);
}
void loop() {
if (digitalRead(button) == HIGH) {
if (buttonActive == false) {
buttonActive = true;
buttonTimer = millis();
}
if ((millis() - buttonTimer 》 longPressTime) && (longPressActive == false)) {
longPressActive = true;
LED1State = !LED1State;
digitalWrite(LED1, LED1State);
}
} else {
if (buttonActive == true) {
if (longPressActive == true) {
longPressActive = false;
} else {
LED2State = !LED2State;
digitalWrite(LED2, LED2State);
}
buttonActive = false;
}
}
}
步驟6:獎金-兩個按鈕6個功能
如果我們有兩個按鈕怎么辦?那么我們就有6種功能,如下所示。
短按按鈕1
短按按鈕2
短按按鈕1和2
長按按鈕1
長按按鈕2
長按按鈕1和2
該程序的工作方式與第一個代碼相同,但有一些顯著變化。
首先,LED的數量更多,這意味著變量更多,當然還有額外的按鈕。但是最大的改變是激活長按或短按的時間。一旦達到這兩個點中的任何一個,而不是打開或關閉LED,我們就可以針對每種功能采取三種可能的措施。結果六個可能的LED之一點亮或熄滅。為了確定要采取的操作,我們檢查每個按鈕的狀態以及這些要點的狀態,并做出相應的響應。
這是代碼
int LED1 = 8;
int LED2 = 9;
int LED3 = 10;
int LED4 = 11;
int LED5 = 12;
int LED6 = 13;
int button1 = 3;
int button2 = 4;
long buttonTimer = 0;
long buttonTime = 250;
boolean buttonActive = false;
boolean longPressActive = false;
boolean button1Active = false;
boolean button2Active = false;
boolean LED1Active = false;
boolean LED2Active = false;
boolean LED3Active = false;
boolean LED4Active = false;
boolean LED5Active = false;
boolean LED6Active = false;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
}
void loop() {
if (digitalRead(button1) == HIGH) {
if (buttonActive == false) {
buttonActive = true;
buttonTimer = millis();
}
button1Active = true;
}
if (digitalRead(button2) == HIGH) {
if (buttonActive == false) {
buttonActive = true;
buttonTimer = millis();
}
button2Active = true;
}
if ((buttonActive == true) && (millis() - buttonTimer 》 buttonTime) && (longPressActive == false)) {
longPressActive = true;
if ((button1Active == true) && (button2Active == true)) {
LED4Active = !LED4Active;
digitalWrite(LED4, LED4Active);
} else if((button1Active == true) && (button2Active == false)) {
LED5Active = !LED5Active;
digitalWrite(LED5, LED5Active);
} else {
LED6Active = !LED6Active;
digitalWrite(LED6, LED6Active);
}
}
if ((buttonActive == true) && (digitalRead(button1) == LOW) && (digitalRead(button2) == LOW)) {
if (longPressActive == true) {
longPressActive = false;
} else {
if ((button1Active == true) && (button2Active == true)) {
LED1Active = !LED1Active;
digitalWrite(LED1, LED1Active);
} else if ((button1Active == true) && (button2Active == false)) {
LED2Active = !LED2Active;
digitalWrite(LED2, LED2Active);
} else {
LED3Active = !LED3Active;
digitalWrite(LED3, LED3Active);
}
}
buttonActive = false;
button1Active = false;
button2Active = false;
}
}
從這里我們甚至可以為可能的14個LED添加第三個按鈕,或為30個LED添加四個按鈕。也許還有一段時間:)
責任編輯:wv
-
led
+關注
關注
242文章
23140瀏覽量
658515 -
按鈕
+關注
關注
0文章
134瀏覽量
12741
發布評論請先 登錄
相關推薦
評論