打破While循环C ++

科迪·菲普斯

我有一个快速的问题,我认为更有经验的固件开发人员将可以帮助我。因此,此代码的主要目标是:

  1. 运行一个循环(检测),它将“监听”发生的事情,一旦达到该阈值,便增加一个变量(在这种情况下为伏特计数)。一旦在指定时间内两次击中伏特计数,采样循环中的第一个while循环将更加紧密地监听(通过FFT)。

  2. 然后,当在特定时间段内(本例中为3秒)未达到检测循环中的阈值时,我想退出while循环(停止使用FFT监听)。

已经实现了1号,但是我遇到了2号的麻烦。该代码似乎保留在采样内部的第一个while循环中(串行窗口不断显示FFT值而不是0或2 -voltscount值),在3之后该电压阈值的秒数保持在4.8以下。

我没有包括无效的设置和所有爵士乐,请让我知道是否需要回答我的问题。

void loop(){
  detect();
  sampling();

}
void detect(){
   unsigned long startMillis= millis();  // Start of sample window

   unsigned int peakToPeak = 0;   // peak-to-peak level

   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;

   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
   volts = (peakToPeak * 5.0) / 1024;  // convert to volts
 Serial.println(voltscount);
}

void sampling(){
unsigned long currentMillis = millis();

if(volts >=4.8){
  voltscount++;

  previousMillis = millis();
}
while(voltscount >= 2){
    /////SAMPLING
    for(int i=0; i<samples; i++)
    {
        microseconds = micros();    /* Overflows after around 70 minutes! */
        vReal[i] = analogRead(0);
        vImag[i] = 0;
        while(micros() < (microseconds + sampling_period_us)){
        }
    }
  double x;
  double v;
  FFT.MajorPeak(vReal, samples, samplingFrequency, &x, &v);
  Serial.print(x, 0);
  Serial.print(", ");
  Serial.println(v, 0);
  delay(10); /* Repeat after delay */ 
/* 
// 3 tests for smoke detector chirps and code to light up the LEDs

    if (x > 4000 and x < 4900 and v > 80) {
        digitalWrite(blueLEDpin, HIGH);
        digitalWrite(uvLEDpin, HIGH);
        delay(blueLEDdelay);
        digitalWrite(blueLEDpin, LOW);
        delay(uvLEDdelay);
        digitalWrite(uvLEDpin, LOW);
    }

    if (x > 1700 and x < 1800 and v > 40) {
        digitalWrite(blueLEDpin, HIGH);
        digitalWrite(uvLEDpin, HIGH);
        delay(blueLEDdelay);
        digitalWrite(blueLEDpin, LOW);
        delay(uvLEDdelay);
        digitalWrite(uvLEDpin, LOW);
    }
*/
    if (v > 1400) {
        digitalWrite(blueLEDpin, HIGH);
        digitalWrite(uvLEDpin, HIGH);
        delay(blueLEDdelay);
        digitalWrite(blueLEDpin, LOW);
        delay(uvLEDdelay);
        digitalWrite(uvLEDpin, LOW);
    }
  if (currentMillis - previousMillis > 3000){
  voltscount = 0;
  break;
  }

 }

}


析构函数

假设voltscount为1的状态。您输入sampling()您首先将当前的工厂设置为当前时间。假设它是1000(假设,因为我不知道该函数返回什么)。然后,由于您volts大于4.8,因此您voltscount将增加到2。然后将设置为previousMillis1500,因为millis()第二次调用。然后,您输入第一个while循环,并在其末尾检查是否currentMillis - previousMillis > 3000但这永远都不是正确的,因为previouslMillis它的价值大于currentMillis我想您可以做的是currentmillis在检查差异是否大于3000之前先阅读正确的内容。

if (millis() - previousMillis > 3000){
  voltscount = 0;
  break;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打破while循环的更好方法?C

来自分类Dev

从while循环中打破

来自分类Dev

如何打破“while”循环

来自分类Dev

打破for循环C ++

来自分类Dev

打破for循环C ++

来自分类Dev

打破FOR LOOP内部的WHILE循环

来自分类Dev

从嵌套的while循环中打破

来自分类Dev

打破Perl中的“ do while”循环

来自分类Dev

如何打破Kivy中的while循环?

来自分类Dev

做while循环不打破正常的java

来自分类Dev

Python打破了while循环+异常

来自分类Dev

尝试打破Java中的while循环

来自分类Dev

如何打破Kivy中的while循环?

来自分类Dev

mpirun 打破了 bash 中的 while 循环

来自分类Dev

无法在函数内打破 python while 循环

来自分类Dev

我无法打破这个 while 循环

来自分类Dev

如何打破C#中的while循环。休息不起作用

来自分类Dev

我该如何打破内部while循环中的for循环

来自分类Dev

尝试打破while循环时陷入无限循环

来自分类Dev

打破循环

来自分类Dev

打破循环

来自分类Dev

C ++ DLL-打破循环依赖

来自分类Dev

用C中的键盘打破FOR循环

来自分类Dev

F#从复杂语句的while循环中打破

来自分类Dev

用布尔值打破嵌套的while循环

来自分类Dev

使用JavaScript如何在设定的时间后打破while循环?

来自分类Dev

尝试在Python中打破while循环时收到错误消息

来自分类Dev

需要两次尝试才能打破我的while循环

来自分类Dev

尝试在Python中打破while循环时收到错误消息