If statement else if在第一次迭代时停止[Arduino]

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

我的代码在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, 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;会大大干扰这首歌的演奏。