Audio arduino音调命令的问题
我正在尝试制作一架带有模拟传感器的Arduino钢琴。但是,所有按键都产生相同的音调,所产生的音调不会出现在程序中的任何地方。同时按下多个键时,音调在两个预期音调之间交替,不会产生未定义的音调。我检查了哪些if-else命令在按键时被激活,并且它们只有在按下相应的按键时才被激活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
#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;
}
//等等。
}
这将通过每个输入来检查它是否已被激活。如果是这样,并且当前没有播放其他音调,则开始播放相应的音符。如果某个输入未激活,但其相应的音符正在播放,则会将其停止。修复了它,非常感谢。这困扰了我好长时间了