看到底下這個討論:
- Using a microphone with an Arduino
http://electronics.stackexchange.com/questions/36795/using-a-microphone-with-an-arduino
剛好零件都有,我加了兩顆 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 的狀態,亮的就關掉,不亮的就打開。
還滿好玩的,不過,目前會有使用了一段時間以後,明明沒有拍手或是其它大的聲音,會亂送訊號的情形,還要再研究問題在哪。
不好意思~請問"sensorMin = 90、sensorMax = 100"是指音量大小還是頻率高低??
回覆刪除哈~哈~被您考倒了,我不是專家,那時是參考本文最前面討論串亂玩的 XD
刪除強點好嗎
回覆刪除不知道能不能裝ADC0832
回覆刪除