Arduino 卡片13自制風扇
阿新 • • 發佈:2019-02-03
1、硬體部分
做一個小風扇。同時會接觸兩件新元件——繼電器、直流電機。繼電器,我們可以理解為是用較小的電流去控制較大電流的一種“自動開關”。在這裡,繼電器是用來控制電機轉動的。
按下圖進行連線,按鈕連線到數字2。按鈕一端連線5V,另一端連線GND,並用一個220Ω的電阻作為下拉電阻,以防引腳懸空干擾。繼電器有6個引腳,分別標有序號。1,2引腳為繼電器的輸入訊號,分別接Arduino的數字引腳和GND。3,4,5,6為繼電器輸出的控制引腳,這裡只使用4,6兩個引腳。我們把繼電器想成一個開關,開關也只要用到兩個引腳。
2、程式碼部分
//通過按鍵,可以控制電機和LED的開和關。 int buttonPin = 2; //按鈕接在2腳中斷 int relayPin = 3; //繼電器接在3腳中斷 int relayState = HIGH; //繼電器預設狀態為HIGH int buttonState; //記錄button的當前狀態; int lastButtonState = LOW; //記錄Button前一個狀態值。 long lastDebounceTime = 0; long debounceDelay = 50; //去除抖動時間 void setup() { pinMode(buttonPin,INPUT); pinMode(relayPin,OUTPUT); digitalWrite(relayPin,relayState); //設定繼電器的初始狀態 } void loop() { int reading = digitalRead(buttonPin); // 一旦檢測到資料發生變化,記錄當前時間 if(reading != lastButtonState){ lastDebounceTime = millis(); } // 等待50ms,再進行一次判斷,是否和當前button狀態相同 // 如果和當前狀態不相同,改變button狀態 // 同時,如果button狀態為高(也就是被按下),那麼就改變繼電器的狀態 if((millis() - lastDebounceTime) > debounceDelay){ if(reading != buttonState){ buttonState = reading; if(buttonState == HIGH){ relayState = !relayState; } } } digitalWrite(relayPin,relayState); lastButtonState = reading; }
3、核心回顧
按鍵去抖問題:
f(reading != lastButtonState){ lastDebounceTime = millis(); } // 等待50ms,再進行一次判斷,是否和當前button狀態相同 // 如果和當前狀態不相同,改變button狀態 // 同時,如果button狀態為高(也就是被按下),那麼就改變繼電器的狀態 if((millis() - lastDebounceTime) > debounceDelay){ if(reading != buttonState){ ....... } } }
reading有變化之後,不是立馬就採取相應的行動,而是先“按兵不動”,先看看這個訊號是不是“錯誤訊號”,所以再等待一陣,(也就是通過millis來實現這個等待過程的),發現確實是前方發過來的正確訊號,然後執行相關動作。
之所以這麼做的原因是,按鍵在被按下時,會有個抖動的過程,而不是立馬由低變高,或者由高變低。所以這個過程中,可能會產生錯誤訊號,我們通過程式中的這種方法,來解決硬體上的這個問題。