1前言
事情是這樣的,本來(lái)在準(zhǔn)備公眾號(hào)文章,想著用tinkercad模擬一下自己寫的程序,結(jié)果無(wú)論自己如何調(diào)整程序,都無(wú)法達(dá)到預(yù)期的效果,后來(lái)經(jīng)過(guò)層層排查發(fā)現(xiàn)是被一個(gè)按鍵整破防了。
這種四腳按鍵的四個(gè)引腳在按下之前是兩兩相通的原理圖如下:
我在之前一直認(rèn)為這種按鈕的四個(gè)腳都是獨(dú)立的,并且在按下后四個(gè)腳都會(huì)相通,經(jīng)過(guò)查詢資料發(fā)現(xiàn)原來(lái)自己認(rèn)為的一直都是錯(cuò)的,這里把錯(cuò)誤分享給大家,希望大家引以為戒(應(yīng)該也不會(huì)有人像我一樣傻吧)
2效果演示
所需材料:
連接電路圖:
實(shí)現(xiàn)功能:
1、主持人按下按鈕才能開始搶答,并且閃燈提示;
2、選手A搶答后選手B、C將無(wú)法進(jìn)行搶答;
3、主持人再次點(diǎn)擊按鈕可以恢復(fù)搶答模式,并閃燈提示;
3主程序
//定義LED燈的引腳
const int greenLed = 10;
const int yellowLed = 9;
const int redLed = 8;
//定義按鍵開關(guān)引腳
const int greenButton = 2;
const int yellowButton = 3;
const int redButton = 4;
const int startButton = 5;
int r=1,y=1,b=1,s=1; //定義三個(gè)變量存儲(chǔ)三個(gè)按鍵開關(guān)的狀態(tài)
bool ready = false; //定義一個(gè)變量用于記錄搶答器是否就緒的狀態(tài)
void setup() {
// put your setup code here, to run once:
// 定義引腳輸入輸出狀態(tài)
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(redButton, INPUT);
pinMode(yellowButton, INPUT);
pinMode(greenLed, INPUT);
pinMode(startButton, INPUT);
//將LED燈的初始化狀態(tài)設(shè)定為熄滅
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
// 讀取四個(gè)按鍵開關(guān)的狀態(tài)
r = digitalRead(redButton);
y = digitalRead(yellowButton);
b = digitalRead(greenButton);
s = digitalRead(startButton);
if(s==0){ //如果主持人按下開始搶答按鈕,選手前面的LED閃爍3次
for(int i=0;i<3;i++){
digitalWrite(redLed, HIGH);
digitalWrite(yellowLed, HIGH);
digitalWrite(greenLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
digitalWrite(yellowLed, LOW);
digitalWrite(greenLed, LOW);
delay(500);
}
ready = true;
}
//當(dāng)搶答器處于就緒狀態(tài)時(shí)
//紅色按鍵按下
if(ready && r==0){
digitalWrite(redLed, HIGH);
ready = false;
}
//黃色按鍵按下
if(ready && y==0){
digitalWrite(yellowLed, HIGH);
ready = false;
}
//藍(lán)色按鍵按下
if(ready && b==0){
digitalWrite(greenLed, HIGH);
ready = false;
}
}
4效果演示
,時(shí)長(zhǎng)00:41
[ ]
5代碼分析
在實(shí)現(xiàn)搶答環(huán)節(jié)中主要用到了if函數(shù),但是有一個(gè)參數(shù)至關(guān)重要,ready
的狀態(tài)直接決定了能否進(jìn)入if循環(huán),所以使用ready = false;
實(shí)現(xiàn)各個(gè)按鍵的互鎖。
判斷條件ready && y==0
用來(lái)判斷是否已經(jīng)準(zhǔn)備就緒,并且其他人還未成功搶到,只有這兩種情況同時(shí)滿足才能進(jìn)入if
,并將ready
的狀態(tài)改為false
,防止進(jìn)入其他if
。
另外有的朋友可能會(huì)說(shuō)if
放置的先后順序會(huì)影響結(jié)果,其實(shí)代碼的運(yùn)行速度是非??斓模⒉粫?huì)出現(xiàn)像大家想想的那種情況,所以在一定程度上還是公平的。
-
搶答器
+關(guān)注
關(guān)注
16文章
243瀏覽量
34464 -
按鈕
+關(guān)注
關(guān)注
0文章
134瀏覽量
12768 -
Arduino
+關(guān)注
關(guān)注
188文章
6468瀏覽量
186951
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論