yyy_zc 发表于 2014-4-14 12:42:53

声控彩灯

本帖最后由 yyy_zc 于 2014-4-14 12:52 编辑

影视作品中土豪们拍拍手,就有人弹奏曲子。我们能做到什么呢,女神驾到时,拍一下亮粉灯,拍两下亮蓝灯哈哈试试下面的小程序吧。

硬件:1.MIC口 1个ARDUINO实验板,其他的灯自己加。
软件主要识别你拍了几下。
http://v.youku.com/v_show/id_XNjk4NjI2MzQw.html

如果你拍拍拍拍拍是什么效果?自己实验一下吧

/*
测试声音响应情况。拟实现口哨控制
*/


int micpin = 2;                   // 麦克风侦测管脚,目前侦测数字信号
unsigned long time,th,tl;
const unsigned long PT=2500;   //波峰的最大间隔时间,判断一次响应
int count;
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the pushbutton's pin an input:
pinMode(micpin, INPUT);
Serial.println("=Sound control version 03-1===");
ledtest();
count = 0;
}

// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
unsigned long duration,dr1,dr2;

//获得一次计数

time = micros();      //重新计时
duration = pulseIn(micpin,LOW,1000000);//1秒钟超时
if (duration > 0)
{   
    //--------越长估计波峰越高-------
    dr1=duration;
    while(1)
    {
      duration = pulseIn(micpin,LOW,PT);//2500micsecond超时

      if (duration > dr1) dr1=duration;      //新的峰值 else 继续听 直到
      if (duration==0) break; //无后续信号接收到
    }
    //---------------------------------
    th = micros()-time;
    tl = dr1;
    Serial.print("1,"); //前面间断的时间
    Serial.println(th);//包含期间的几个duration
    Serial.print("0,"); //收到声音的声音时长
    Serial.println(tl);

    if (count == 0) //第一个信号 可能等了很久,故th不好引用
      count++;   //一个信号如何结束?
    else            //判断后续信号是否有效
    {
      if ((th>300000)&(th<800000)) //与前一信号间隔为0.3~0.8秒间有效
      count++;
    }
}
else      //超过1秒无信号收到
{
    if (count > 0)   //前面已收到过信息
    {   
      Serial.print("============================");
      Serial.print("I have got singer for times:");
      Serial.println(count);
      ledshow(count);
      count = 0;
    }
}
}
void ledtest()
{
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(7, HIGH);
delay(300);
digitalWrite(8, HIGH);
delay(300);   
digitalWrite(9, HIGH);
delay(300);
digitalWrite(7, LOW);
delay(300);
digitalWrite(8, LOW);
delay(300);   
digitalWrite(9, LOW);
delay(300);   
}
void ledshow(int c)
{
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
if (c == 1) digitalWrite(7, HIGH);
if(c ==2 )
{
    digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
if(c>2)
{
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
}
}
页: [1]
查看完整版本: 声控彩灯