If statement else if在第一次迭代时停止[Arduino]
我的代码在phot_val if语句的第一次迭代时停止If statement else if在第一次迭代时停止[Arduino],if-statement,arduino,arduino-uno,If Statement,Arduino,Arduino Uno,我的代码在phot_val if语句的第一次迭代时停止 /////// Code loop void loop() { double sound = MIC(); //Declare variable for obtaining microphone data double phot_val; int nreadings = 100; int song1[N]={CN4, DN4, EN4, FN4, GN4, AN4, BN
/////// Code loop
void loop() {
double sound = MIC(); //Declare variable for obtaining microphone data
double phot_val;
int nreadings = 100;
int song1[N]={CN4, DN4, EN4, FN4, GN4, AN4, BN4, CN5};
int song2[M]= {RT0, RT0, CN4, DN4, CN4, FN4, EN4, RT0,CN4, DN4, CN4, GN4, FN4, RT0, CN4, CN5, AN4, FN4, EN4,DN4, RT0, AS4, AN4, FN4, GN4, FN4, RT0, RT0};
phot_val = read_analogn(2,nreadings);
Serial.print("Sound: ");Serial.println(sound); //Testing purposes, Print out sound/mic value
Serial.print("Light: ");Serial.println(phot_val,5);//Testing purposes, Print out light sensor data
if(phot_val >= .5){play_song(song1,N);} //Stops after first 100???
/// Else If statements to change RBG colors depending on sound
if(MIC() >= 30){ setColor(255, 0, 0); } //Red Color
else if(MIC() >= 35){setColor(0, 255, 0);} //Green Color
else if(MIC() >= 40){setColor(0, 0 , 255);} //Blue Color
else if(MIC() >=25){setColor(255, 255, 255);} //White Color
else if(MIC() >=25){setColor(170, 0, 255);} //White Color
else {setColor(0, 0, 0);}
}
/////// Read light sensor function
float read_analogn(int p, int n){
float sum = 0;
float avg;
int i;
float voltage;
float phot_val;
for(i=0; i<n; i++)
{
phot_val = analogRead(p);
voltage = phot_val*(5.0/1023.0);
sum += voltage;
}
avg = sum/n;
return (avg);
}
/////// Color function for RBG Leds
void setColor(int redV, int greenV, int blueV) {
analogWrite(redP, redV); //Red value for RBG
analogWrite(greenP, greenV); //Green value for RBG
analogWrite(blueP, blueV); //Blue value for RBG
}
/////// Play song function
void play_song(int song[], int n){
int isong; //Define variables
for(isong=0;isong<n;isong++){ //For loop to play the songs
tone(SPKR,song[isong]);
delay(500);
}
noTone(SPKR);
}
}
如果需要,我可以发布更多的代码,但我不知道为什么它会停止
编辑:固定标题,并添加更多的功能代码。
因此,基本上它运行tru,但当ifphot_val>=.5{play_songsong1,N;}成为真时,它会停止,直到整首歌播放完毕,然后它会继续再次读取数据。我没有看到任何for循环,可能是read_模拟;是您声明的包含for循环的函数吗? 在这种情况下,您应该检查函数,以确保for循环不会落入无限循环中,或者在代码的不同部分放置一些串行输出,以查看它是否到达该部分,打印变量以检查代码的不同部分是否正在运行,等等
尽管如此,如果没有看到导致问题的for循环/函数,很难说发生了什么,因此我建议您将函数代码和for循环本身放在问题中。您没有检查for循环中模拟管脚的值,因此它会阻止一切,直到整首歌曲结束。您所需要做的就是更新for循环以检查输入的值 将for循环替换为以下内容:
for(isong=0;isong<n;isong++){
tone(SPKR,song[isong]);
delay(500);
phot_val = read_analogn(2, nreadings);
if(phot_val < .5){break;} //or whatever value you want it to stop at
}
当您的传感器低于阈值时,这将停止乐曲。如果代码中的第一个位置有问题,则:
if(MIC() >= 30){ setColor(255, 0, 0); } //Red Color
else if(MIC() >= 35) {
// comes here only if the first call of MIC() returns less than 30
// and the second one returns 35 or more.
// ???
}
这不是一个答案,但作为评论很难理解。对不起,我对标题感到困惑,这是一个else-if,而不是for循环。我不确定这是否是确切的问题,但前两个else-if从未达到:如果MIC大于30,则会出现if,但下两个else-if永远不会出现,因为这意味着MIC=35或40。另外,接下来的两个else_if具有相同的条件,但具有不同的setColor调用?当使用tone的阻塞模式时,delay500;会大大干扰这首歌的演奏。