"揮動手控制音量耳罩式耳機"
原本是打算用伺服馬達來轉可變電阻達到音量調整,後來覺得這方法機構真的很大,而且感覺是個蠢方法........,所以在網路上找了些資料,有些 IC 似乎是可以拿來試試,但沒有時間試了 (一大堆事情......) ,後來找元件的時候突然看到了 "光耦合 IC " ,就這麼突然靈光乍現,想把光敏電阻和 LED 燈結合作成一個元件,上網查查國外有相關的元件可以買,台灣的網站找了很久都沒有人賣,只好自己土炮了!
![]() |
| 圖一、光敏電阻和 LED 結合成的原件 |
| 圖二、電路圖 |
![]() |
| 圖三、成品圖 |
- 元件可以再使用 SMD 可以在更小化。
- 目前是使用 PWM 來控制 LED 測試的時候會有雜音,最後是加上100uF的電容來達到濾波的效果,雜音是不見了 ( 因該是不懂音樂的我聽不出來 ),如果要更完美就要再找方法或試試音量控制 IC 。
- 這次用 Arduino 來做事有點大將砍小兵,可以換用類似8051之類的單晶片來做。
- BOSS說:未來可以改進以上幾點和其他 ( 如:可以改變手勢,更直覺式的手勢 ),查查中華明國專利,若沒有相關專利,可以試試寫專利,趕在9月多的發明展。(第一次被這樣肯定,好怪,不過這很累人啊!)
程式碼:
int brightness=167; //led亮度
int i=4; //初始音量
int level[9]={127,140,147,157,167,177,187,217,255}; //音量分為9個層級
//腳位定名
const int ir1_signal = 22;
const int ir2_signal = 24;
const int led1 = 26;
const int led2 = 28;
int control_led = 9;
int ir1_state ; //ir1狀態
int ir2_state ; //ir2狀態
int r=0; //判斷條件重置
int step1_ir1,step2_ir1,step1_ir2,step2_ir2; //判斷條件
void setup()
{
//IR為輸入
pinMode(ir1_signal,INPUT);
pinMode(ir2_signal,INPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(control_led,OUTPUT);
}
void loop()
{
//ir1和ir2的狀態讀取
ir1_state = digitalRead(ir1_signal);
ir2_state = digitalRead(ir2_signal);
//led目前亮度
brightness=level[i];
analogWrite(control_led, brightness);
//設定時間 重置判斷條件
if(r>=19999){
step1_ir1=0;
step2_ir1=0;
step1_ir2=0;
step2_ir2=0;
r=0;
}else{
r++;
}
/*判斷ir1或ir2哪個先遮斷
如果ir1被遮斷 step1_ir1=1
如果ir2被遮斷 step1_ir2=1*/
if(ir1_state == LOW && ir2_state == HIGH){
step1_ir1=1;
}else if(ir2_state == LOW && ir1_state == HIGH){
step1_ir2=1;
}
/*判斷遮斷物是否已經過ir1或ir2
如果已經過 step2_ir1=1
如果已經過 step2_ir2=1*/
if(ir1_state == HIGH && step1_ir1==1 ){
step2_ir1=1;
step2_ir2=0;
}else if(ir2_state == HIGH && step1_ir2==1){
step2_ir2=1;
step2_ir1=0;
}
/*判斷第2個是否被遮斷
如果有再加上step1和step2條件都成立 則執行音量增減動作*/
if(ir2_state == LOW && step1_ir1==1 && step2_ir1==1){
digitalWrite(led1,HIGH); //測試燈亮
//音量增加控制
if(i<=7){
i++;
}else{
i=8;
}
//判斷條件歸零
step1_ir1=0; step2_ir1=0; step1_ir2=0; step2_ir2=0; r=0;
delay(500);
}else if(ir1_state == LOW && step1_ir2==1 && step2_ir2==1){
digitalWrite(led2,HIGH); //測試燈亮
//音量減少控制
if(i>=1){
i--;
}else{
i=0;
}
//判斷條件歸零
step1_ir1=0; step2_ir1=0; step1_ir2=0; step2_ir2=0; r=0;
delay(500);
}else{
digitalWrite(led2,LOW);
digitalWrite(led1,LOW);
}
}

