問題:當使用"digitalRead(BUT) == 1"控制LED燈時會出現"digitalWrite(LED, ledState);"的值出現跳動。
原因:因為loop會無限循環,當按下按鈕時會一直輸出1,當松開按鈕時會一直輸出0,所以判斷的時候if(digitalRead(BUT) == 1)判斷條件不穩定(這里不穩定的意思是if(digitalRead(BUT) == 1)會重復執行,造成ledState = !ledState的值一直改變)
#define BUT D2 //定義按鈕的針腳 #define LED D9 //定義LED燈的針腳 boolean ledState = LOW; // 初始化LED燈的值 void setup() { pinMode(BUT, INPUT); //設置針腳為輸入 pinMode(LED, OUTPUT); //設置針腳為輸出 Serial.begin(115200); //串口初始化 } void loop() { if(digitalRead(BUT) == 1){ //Serial.println(digitalRead(BUT)); //值為1 ledState = !ledState; Serial.println(ledState); //ledState值不穩定 digitalWrite(LED, ledState); }else{ //Serial.println(digitalRead(BUT));//值為0 } }
解決1:中間值的方式
原理:使用中間值的方式穩定判斷條件,在if(b1 != butState)的執行體中當按下按鈕時control的值會加1,松開按鈕又會加1,所以當control=2的執行if(control == 2)判斷條件穩定(穩定的意思是if(control == 2)只會執行一次,這樣就會解決ledState = !ledState值不穩定的情況。)
#define BUT D2 #define LED D9 boolean butState = LOW; boolean ledState = LOW; byte control = 0; void setup() { pinMode(BUT, INPUT); pinMode(LED, OUTPUT); Serial.begin(115200); //串口初始化 } void loop() { // 死循環--未按下按鈕值0 按下按鈕值1 boolean b1 = digitalRead(BUT); if(b1 != butState){ delay(20);//緩沖震動 // 只執行一次--未按下按鈕值0 按下按鈕值1 boolean b2 = digitalRead(BUT); if(b2 == b1) { // 只執行一次--未按下按鈕值0 按下按鈕值1 butState = b1; // 按一次按鈕執行兩次 control++; } } if(control == 2){ control = 0; // 默認值0 取反值1 ledState = !ledState; Serial.println(ledState); //ledState值穩定 digitalWrite(LED, ledState); } }
ps:開發板信息