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