1. 程式人生 > >Arduino 卡片13自制風扇

Arduino 卡片13自制風扇

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來實現這個等待過程的),發現確實是前方發過來的正確訊號,然後執行相關動作。


之所以這麼做的原因是,按鍵在被按下時,會有個抖動的過程,而不是立馬由低變高,或者由高變低。所以這個過程中,可能會產生錯誤訊號,我們通過程式中的這種方法,來解決硬體上的這個問題。