иначе, если остановится на первой итерации [Arduino] - PullRequest
0 голосов
/ 30 ноября 2019

Мой код останавливается на первой итерации для оператора 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);
}

}

Я могу опубликовать больше кода, если это необходимо, но я понятия не имею, почему он останавливается Edit: Fixed title, и добавилбольше кода функций. Так что, в основном, он запускается по-настоящему, но когда «if (phot_val> = .5) {play_song (song1, N);}» становится истинным, он останавливается до тех пор, пока песня не будет воспроизведена полностью, затем он снова продолжит чтение данных.

Ответы [ 3 ]

1 голос
/ 01 декабря 2019

Вы не проверяете значение аналогового вывода в цикле 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
}

Это остановит песню, когда ваш датчик выйдетниже порога

0 голосов
/ 01 декабря 2019

Первый else if в вашем коде находится в этом сомнительном месте:

 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.
       // ???
     }  

Это не ответ, но его трудно прочитать как комментарий.

0 голосов
/ 01 декабря 2019

Я не вижу цикл for, возможно, read_analogn ();это объявленная вами функция, которая содержит цикл for? В этом случае вы должны проверить функцию, чтобы убедиться, что цикл for не попадает в бесконечный цикл, возможно, поместите несколько последовательных выходов в разные части кода, чтобы увидеть, достигает ли он этой части, распечатайте переменные, чтобы проверить, отличаются ли оничасти кода работают и т. д.

Тем не менее, трудно сказать, что происходит, не видя цикл / функцию for, вызывающий проблему, поэтому я предлагаю вам разместить код функции и сам цикл forв вашем вопросе.

...