missbear 发表于 2015-5-21 23:37:58

求助用超声波测距做乐器

目的:我要做的是一个用超声波模块或红外模块测距,并将测距结果以声音形式输出(do-ri-mi-fa-so-la-xi),每个音最好都能有渐消效果!如下图所示


以下是我的电路


我自己拼了一段代码,可是效果不对,,,,只响一声就没有然后了……
求解啊
代码如下
const int TrigPin = 8;
const int EchoPin = 9;
float cm;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(4,OUTPUT);
}
void loop()
{
{
if(cm>0 && cm<100.0)
{
    if(cm<=20)
{
    if(digitalRead(4)==LOW)
{
    delay(5);
    if(digitalRead(4)==LOW)
    {
      tone(4,784,1000); //So
      while(digitalRead(4)==LOW)
      {
      delay(1);
      }
    }
}
}
else if(cm>20&&cm<=30)
{
    if(digitalRead(4)==LOW)
{
    delay(5);
    if(digitalRead(4)==LOW)
    {
      tone(4,698,1000); //So
      while(digitalRead(4)==LOW)
      {
      delay(1);
      }
    }
}
}
}
}
digitalWrite(4,HIGH);
delay(100);
digitalWrite(4,HIGH);
delay(1000-(100-cm)*12.5);
}

相关资料:
1.        发出do-ri-mi的对应数据
{262,293,329,349,392,440,494} ,//低音
{523,586,658,697,783,879,987} ,//中音
{1045,1171,1316,1393,1563,1755,1971}//高音
2.抄来的渐消音代码:
analogWrite(5,(127+tmp-mus_long)*2);//把音长距离结束的时间兑换成音量控制模拟音量渐弱
            tone(2,tmp1); //如果本光柱无故障则发出由上一句产生的颤音,(hz/100 是振幅)
            delay(7); //本句延迟5毫秒,上一句中传出的模拟量程为0-255,但延时数量最大为100,但此数段应实测
            }else delay(8);//不该发声时应延迟更久一些毫秒数
      tmp=tmp+1;//准备检查下一根光柱
      if (tmp>mus_long) {//如延时完成则
            tmp=0;mus_long=127;//则本光柱清零、音长清零
            noTone(2);//停止发声


   最终目的:测距——距离对应音(d0-ri-mi)且为渐消音



liweisgg 发表于 2015-5-22 15:37:27

首先说下你的程序结构,太繁冗了,没必要if条件语句嵌套使用的,再一个程序尽量写成子函数,void loop{}循环体调用子函数就可以了,tone()函数采用递增递减就可以消音,没必要用延时,延时的那个时间段里其他程序是不执行的,有需要加我Q285944386,我给你细说,论坛看的不及时的。

Ansifa 发表于 2015-5-26 10:31:23

本帖最后由 Ansifa 于 2015-5-26 10:34 编辑

我用vs1053做的,自带128种乐器音色,发串口指令就能控制。。。做了一个钢琴,绿色那块是带光耦的输入板,电位器调音色。。:lol

页: [1]
查看完整版本: 求助用超声波测距做乐器