2013年4月28日 星期日

Arduino : 聲控開關

上週買了一塊 Arduino ,按照網路上的文章,依樣畫葫蘆玩了一下,稍微有一點概念了。前天把一篇如何用紅外線接收器加遙控器來控制 LED ,再結合了另一篇如何將聲音輸出到喇叭的文章,做了一個以遙控器來演奏樂曲的實驗,哈!雖然被我家太座笑說這好像沒什麼啊!(也沒錯啦!) 不過,就是有種莫名的成就感,然後繼續很有動力的研究別的。對於孩子,我們也要隨時營造這樣的感覺。
看到底下這個討論:


剛好零件都有,我加了兩顆 LED ,把它改成連拍兩次手可以控制 LED 的裝置。


材料:

  • 電容式麥克風 x1 
  • 電容 0.1 uF (104) x 2
  • 電阻 100 k歐姆 x 1
  • 電阻 10  k歐姆 x 2
  • 紅色 LED x 1
  • 綠色 LED x 1


程式碼如下:

const int micPin =  0;
const int redLedPin = 12;
const int greenLedPin = 8;
const int sensorMin = 90;
const int sensorMax = 100;
const int clapInterval = 500;
int counter = 0;
int counter2 = 0;
int timer = 0;
boolean isGreenHigh = false;
void setup() {
  //Serial.begin(115200);
  pinMode(redLedPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
  counter = 0;
  counter2 = 0;
  timer = 0;
  isGreenHigh = false;
}
void loop() {
  //Serial.println(analogRead(micPin));
  //delay(100);
  int mic = analogRead(micPin);
  if ( mic >= sensorMin && mic <= sensorMax && counter == 0) {
    counter++;
    counter2++;
    //Serial.println(mic);
    digitalWrite(redLedPin, HIGH);
    delay(100);
    digitalWrite(redLedPin, LOW);
    if(counter2 == 2) {
      counter2 = 0;
      if ( !isGreenHigh ) {
        isGreenHigh = true;
        digitalWrite(greenLedPin, HIGH);
        //delay(100);
      } else {
        isGreenHigh = false;
        digitalWrite(greenLedPin, LOW);
      }
    }
  }
  if(counter2 >= 1 && counter2 <= 2) {
    if(timer < clapInterval*3) {
      timer++;
    } else {
      timer = 0;
      counter2 = 0;
    }
  }
  if(counter > 0) {
    counter++;
    if(counter >= clapInterval) {
      counter = 0;
    }
  }
}


用 Serial.println 那行(暫時註解了)監看麥克風傳回的數值,如果拍手時,會傳回 90~100 左右,因此 sensorMin = 90、sensorMax = 100,可以依需求調整啟動的範圍。另外,拍一次手,會回傳好幾筆資料,為了避免這樣的情形,故意等一下下會處理在啟動範圍內的數值,等多久可以調整 clapInterval = 500 這個設定。
「 if(counter2 == 2)」這行是設了必須連續拍二下才去改變 greenLedPin 的狀態,亮的就關掉,不亮的就打開。

還滿好玩的,不過,目前會有使用了一段時間以後,明明沒有拍手或是其它大的聲音,會亂送訊號的情形,還要再研究問題在哪。


4 則留言:

  1. 不好意思~請問"sensorMin = 90、sensorMax = 100"是指音量大小還是頻率高低??

    回覆刪除
    回覆
    1. 哈~哈~被您考倒了,我不是專家,那時是參考本文最前面討論串亂玩的 XD

      刪除

 
© 2009. Design by Pocket