arduino通過開關控制led燈代碼理解(適合所有開關類型)
方法一 const int LED=13; //聲明變量 LED燈接在13針腳; const int BUTTON=7; //聲明變量,按鈕接在第7針腳; int val=0; //聲明變量,用來存儲按鈕返回值HIGH或者LOW; int val_old=0;//聲明變量,存儲上一次按鈕返回值;比對val和val_old的值,來判斷按鈕是按下還是抬起 //val==LOW && val_old==HIGHT 抬起狀態;val==HIGH && val_old==LOW 按下狀態; int state=0;//0 off,1 on 聲明變量,起到中轉的作用,小技巧; void setup() //初始化; { pinMode(LED,OUTPUT); //定義LED燈輸入模式; pinMode(BUTTON,INPUT);//定義BUTTON為輸出模式; } void loop() { val=digitalRead(BUTTON);//讀取數字針腳的值; if((val==HIGH) && (val_old==LOW))//比較前一次和現在的按鈕返回的值, //只有現在按下按鈕這個狀態下,才改變state的值 { state=1-state; } if((val==LOW && val_old==HIGH)) //去抖的作用,一般10-15ms; { delay(10); } val_old=val;//把現在按鈕返回的值賦予val_old; if(state==1)//控制燈開關; { digitalWrite(LED,HIGH); } else { digitalWrite(LED,LOW); } } 方法二(使用了內部上拉電阻) // 按鍵控制LED燈開關,使用內部上拉電阻; const int LED = 13; const int BUTTON = 7; boolean state = false;//聲明led燈的狀態,默認是關的; void setup { pinMode(LED,OUTPUT); pinMode(BUTTON,INPUT_PULLUP);//按鈕接內部上拉電阻; } void loop { while(digitalRead(BUTTON) == HIGH){}//模擬:等待開關被按下; //因為使用了上拉電阻,未按下 //之前,按鈕一直保持着高電平。 //直到按鈕被按下,條件為假,跳出 //循環,執行下邊的語句。 if(state = true)//判斷:如果燈的狀態是亮,則熄滅它,然后將狀態 //標記為滅(使用了取反的技巧);否則,如果燈的 //狀態是滅的,則點亮它,然后將狀態標記為亮(使用取反); { digitalWrite(LED,LOW); state = !state;//標記燈的當前狀態 } else { digitalWrite(LED,HIGH); state = !state;//標記燈的當前狀態 } delay(500); } 方法三:這個比較好理解(引自 趙英傑老師教材) const byte LED = 13; const byte SW = 8; boolean lastState = LOW;//記錄上次的開關狀態,初始化為LOW boolean toggle = LOW;//輸出給LED的信號,初始化為LOW byte click = 0;開關信號的改變次數,初始化為0 void setup() { pinMode(LED,OUTPUT); pinMode(SW,INPUT); lastState = digitalRead(SW);//讀取開關的初始值 } void loop() { boolean b1 = digitalRead(SW);//讀取目前的開關狀態 if(b1 != lastState)//如果與以前的開關至不同 { delay(20);//去震動 boolean b2 = digitalRead(SW);//再讀取一次開關狀態 if(b2 == b1)//確認兩次開關狀態是否一致 { lastState = b1;//存儲開關狀態 click++;//次數累計 } } if(click == 2)//如果開關狀態改變2次 { click = 0;//歸零 toggle = !toggle;//取相反值 digitalWrite(LED,toggle); } }
上課實現:
#include <SevenSegmentExtended.h> #include <SevenSegmentTM1637.h> volatile int MINUTE; volatile int SECOND; SevenSegmentExtended display(5,13); void setup(){ MINUTE = 0; SECOND = 0; display.begin(); } void loop(){ display.setBacklight(20); display.printTime(MINUTE,SECOND,HIGH); if (SECOND == 59) { MINUTE = MINUTE + 1; SECOND = 0; } SECOND = SECOND + 1; if (MINUTE == 60) { MINUTE = 0; } delay(1000); }