Audio arduino音调命令的问题

Audio arduino音调命令的问题,audio,if-statement,arduino,Audio,If Statement,Arduino,我正在尝试制作一架带有模拟传感器的Arduino钢琴。但是,所有按键都产生相同的音调,所产生的音调不会出现在程序中的任何地方。同时按下多个键时,音调在两个预期音调之间交替,不会产生未定义的音调。我检查了哪些if-else命令在按键时被激活,并且它们只有在按下相应的按键时才被激活 #define Note_C 65.41 //Hz #define Note_D 73.42 //Hz #define Note_E 82.41 //Hz #define Note_F 87.31

我正在尝试制作一架带有模拟传感器的Arduino钢琴。但是,所有按键都产生相同的音调,所产生的音调不会出现在程序中的任何地方。同时按下多个键时,音调在两个预期音调之间交替,不会产生未定义的音调。我检查了哪些if-else命令在按键时被激活,并且它们只有在按下相应的按键时才被激活

#define Note_C 65.41   //Hz   
#define Note_D 73.42   //Hz   
#define Note_E 82.41   //Hz
#define Note_F 87.31   //Hz
#define Note_G 98      //Hz
#define Note_A 110     //Hz  
#define threshold 1000  


const int speaker=3;  
const int B_1=A0;    // pins A0-A5 have sensors attatched to them 
const int B_2=A1;    // pins 13-8 are being used to power each sensor
const int B_3=A2;     
const int B_4=A3;     
const int B_5=A4;
const int B_6=A5;
const int P_1=13;
const int P_2=12;
const int P_3=11;
const int P_4=10;
const int P_5=9;
const int P_6=8;


int val_1=0;
int val_2=0;
int val_3=0;
int val_4=0;
int val_5=0;
int val_6=0; 


void setup()
{   
Serial.begin(9600);
pinMode(P_1, OUTPUT);      
digitalWrite(P_1, HIGH);
pinMode(P_2, OUTPUT);
digitalWrite(P_2, HIGH);
pinMode(P_3, OUTPUT);
digitalWrite(P_3, HIGH);
pinMode(P_4, OUTPUT);
digitalWrite(P_4, HIGH);
pinMode(P_5, OUTPUT);
digitalWrite(P_5, HIGH);
pinMode(P_6, OUTPUT);
digitalWrite(P_6, HIGH);
}


void loop()
{
  analogRead(B_1); // checks each sensor value and stores it
  delay(1);              // each value must be checked twice with a 
  val_1=analogRead(B_1); // delay inbetween to provide consistant values
  analogRead(B_2);
  delay(1);
  val_2=analogRead(B_2);
  analogRead(B_3);
  delay(1);
  val_3=analogRead(B_3);
  analogRead(B_4);
  delay(1);
  val_4=analogRead(B_4);
  analogRead(B_5);
  delay(1);
  val_5=analogRead(B_5);
  analogRead(B_6);
  delay(1);
 val_6=analogRead(B_6);

 if (val_1 < threshold)     
  {
  tone (speaker, Note_C);
  Serial.println("1");
}
    else
   {
     noTone (speaker);   
   }     
 if (val_2 < threshold)     
  {
    Serial.println("2");
  tone (speaker, Note_D);
} 
    else
{ 
  noTone(speaker);
}
 if (val_3 < threshold)     
  {
    Serial.println("3");
  tone (speaker, Note_E);
} 
    else
   { 
     noTone (speaker);
   }
 if (val_4 < threshold) 
  {
  Serial.println("4");
  tone (speaker, Note_F);
}
    else 
    {
      noTone (speaker);
    }
  if (val_5 < threshold)
  {
  Serial.println("5");
  tone (speaker, Note_G);
}
    else
   {
     noTone (speaker);
   }
  if (val_6 < threshold) 
   {
   Serial.println("6");
   tone (speaker, Note_A);
   }
    else
   {
     noTone (speaker);
   }
    noTone(speaker);
  }
#定义注释_c65.41//Hz
#定义注释\u D 73.42//Hz
#定义注释82.41//Hz
#定义注释F 87.31//Hz
#定义注释_g98//Hz
#定义注释A 110//Hz
#定义阈值1000
const int speaker=3;
常数int B_1=A0;//针脚A0-A5上连接有传感器
常数int B_2=A1;//针脚13-8用于为每个传感器供电
常数int B_3=A2;
常数int B_4=A3;
常数int B_5=A4;
常数int B_6=A5;
常数int P_1=13;
常数int P_2=12;
常数int P_3=11;
常数int P_4=10;
常数int P_5=9;
常数int P_6=8;
int val_1=0;
int val_2=0;
int val_3=0;
int val_4=0;
int val_5=0;
int val_6=0;
无效设置()
{   
Serial.begin(9600);
pinMode(P_1,输出);
数字写入(P_1,高);
pinMode(P_2,输出);
数字写入(P_2,高);
pinMode(P_3,输出);
数字写入(P_3,高);
pinMode(P_4,输出);
数字写入(P_4,高);
pinMode(P_5,输出);
数字写入(P_5,高);
pinMode(P_6,输出);
数字写入(P_6,高);
}
void循环()
{
analogRead(B_1);//检查每个传感器值并存储它
延迟(1);//每个值必须用
val_1=analogRead(B_1);//中间延迟以提供一致的值
类比阅读(B_2);
延迟(1);
val_2=模拟读数(B_2);
类比阅读(B_3);
延迟(1);
val_3=模拟读数(B_3);
类比阅读(B_4);
延迟(1);
val_4=模拟读取(B_4);
类比阅读(B_5);
延迟(1);
val_5=模拟读数(B_5);
类比阅读(B_6);
延迟(1);
val_6=模拟读数(B_6);
如果(val_1<阈值)
{
音调(扬声器,音符C);
序列号。打印号(“1”);
}
其他的
{
诺通(发言者);
}     
如果(val_2<阈值)
{
序列号。打印号(“2”);
音调(扬声器,音符D);
} 
其他的
{ 
诺通(发言者);
}
如果(val_3<阈值)
{
序列号。打印号(“3”);
音调(扬声器、音符);
} 
其他的
{ 
诺通(发言者);
}
如果(val_4<阈值)
{
序列号。打印号(“4”);
音调(扬声器,音符F);
}
其他的
{
诺通(发言者);
}
如果(val_5<阈值)
{
序列号。打印号(“5”);
音调(扬声器、音符);
}
其他的
{
诺通(发言者);
}
如果(val_6<阈值)
{
序列号。打印号(“6”);
音调(扬声器,音符A);
}
其他的
{
诺通(发言者);
}
诺通(发言者);
}

我知道阵列效率会更高,但我想先让它工作起来。我也是一名初级程序员,因此任何其他建议都将不胜感激。

我怀疑问题在于每次循环时,您都在不断地激活和禁用音调。我认为更好的方法是在特定输入被激活时启动音调,并一直播放直到输入被禁用。(不能使用
tone()
同时播放多个音符)

您需要将当前播放音调的编号存储在一个变量中。类似的方法可能会奏效:

int currentTone = 0;

void loop()
{
    // (take your analog readings here)


    if (val_1 < threshold)
    {
        if (currentTone == 0)
        {
            tone(speaker, Note_C);
            currentTone = 1;
        }
    }
    else if (currentTone == 1)
    {
        noTone(speaker);
        currentTone = 0;
    }

    if (val_2 < threshold)
    {
        if (currentTone == 0)
        {
            tone(speaker, Note_D);
            currentTone = 2;
        }
    }
    else if (currentTone == 2)
    {
        noTone(speaker);
        currentTone = 0;
    }

    // etc.
}
int currentTone=0;
void循环()
{
//(在此处读取模拟读数)
如果(val_1<阈值)
{
如果(currentTone==0)
{
音调(扬声器,音符C);
currentTone=1;
}
}
否则如果(currentTone==1)
{
诺通(发言者);
currentTone=0;
}
如果(val_2<阈值)
{
如果(currentTone==0)
{
音调(扬声器,音符D);
currentTone=2;
}
}
否则如果(currentTone==2)
{
诺通(发言者);
currentTone=0;
}
//等等。
}

这将通过每个输入来检查它是否已被激活。如果是这样,并且当前没有播放其他音调,则开始播放相应的音符。如果某个输入未激活,但其相应的音符正在播放,则会将其停止。

修复了它,非常感谢。这困扰了我好长时间了