Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 中断While循环C++;_C++_While Loop_Arduino_Break - Fatal编程技术网

C++ 中断While循环C++;

C++ 中断While循环C++;,c++,while-loop,arduino,break,C++,While Loop,Arduino,Break,我有一个快速的问题,我想一个更有经验的固件开发人员将能够帮助我解决这个问题。因此,我对这段代码的主要目标是: 运行一个循环(detect),该循环将“侦听”将要发生的事情,然后在达到阈值后增加一个变量(在本例中为VoltScont)。一旦在指定时间内两次点击VoltScont,采样环路内的第一个while环路将更仔细地监听(通过FFT) 然后,当检测循环中的阈值在某个时间段(本例中为3秒)内未达到时,我想中断while循环(停止使用FFT侦听) 1号是实现,但2号有问题。在电压阈值保持在4.8以

我有一个快速的问题,我想一个更有经验的固件开发人员将能够帮助我解决这个问题。因此,我对这段代码的主要目标是:

  • 运行一个循环(detect),该循环将“侦听”将要发生的事情,然后在达到阈值后增加一个变量(在本例中为VoltScont)。一旦在指定时间内两次点击VoltScont,采样环路内的第一个while环路将更仔细地监听(通过FFT)

  • 然后,当检测循环中的阈值在某个时间段(本例中为3秒)内未达到时,我想中断while循环(停止使用FFT侦听)

  • 1号是实现,但2号有问题。在电压阈值保持在4.8以下的3秒之后,代码似乎仍保持在采样内部的第一个while循环中(串行窗口保持显示FFT值,而不是0、1或2-voltscount值)

    我没有包括我的空白设置和所有的爵士乐,让我知道如果需要回答我的问题

    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;
      }
    
     }
    
    }
    
    
    
    void循环(){
    检测();
    抽样();
    }
    void detect(){
    unsigned long startMillis=millis();//示例窗口的开始
    无符号int-peakToPeak=0;//峰间电平
    无符号int-signalMax=0;
    无符号int-signalMin=1024;
    //收集50毫秒的数据
    while(millis()-startMillis信号最大值)
    {
    signalMax=sample;//只保存最大级别
    }
    否则如果(样本<信号最小值)
    {
    signalMin=sample;//只保存最小级别
    }
    }
    }
    peakToPeak=signalMax-signalMin;//max-min=峰值振幅
    伏特=(峰值峰值*5.0)/1024;//转换为伏特
    序列号println(voltscont);
    }
    无效采样(){
    无符号长电流毫秒=毫秒();
    如果(电压>=4.8){
    VoltScont++;
    previousMillis=millis();
    }
    而(电压>=2){
    /////取样
    对于(int i=0;i 4000和x<4900和v>80){
    digitalWrite(蓝色发光二极管,高电平);
    数码写入(uvLEDpin,高);
    延迟(blueldelay);
    digitalWrite(蓝色发光二极管,低电平);
    延迟(uvledday);
    数码写入(uvLEDpin,低电平);
    }
    如果(x>1700,x<1800,v>40){
    digitalWrite(蓝色发光二极管,高电平);
    数码写入(uvLEDpin,高);
    延迟(blueldelay);
    digitalWrite(蓝色发光二极管,低电平);
    延迟(uvledday);
    数码写入(uvLEDpin,低电平);
    }
    */
    如果(v>1400){
    digitalWrite(蓝色发光二极管,高电平);
    数码写入(uvLEDpin,高);
    延迟(blueldelay);
    digitalWrite(蓝色发光二极管,低电平);
    延迟(uvledday);
    数码写入(uvLEDpin,低电平);
    }
    如果(当前毫秒-以前的毫秒>3000){
    电压互感器=0;
    打破
    }
    }
    }
    
    假设voltscount为1的状态。您可以输入
    采样()
    。首先将当前磨机设置为当前时间。假设它是1000(假设的,因为我不知道该函数返回什么)。然后,由于您的
    volts
    大于4.8,您将
    voltscount
    增加到2。您将
    previousMillis
    设置为1500左右,因为
    millis()
    是第二次调用的。然后输入第一个while循环,在循环结束时检查
    currentMillis-previousmilis>3000
    。但这从来都不是真的,因为
    previouslMillis
    的值大于
    currentMillis
    。我想你能做的就是在检查差值是否大于3000之前,先阅读
    currentmillis

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

    在Arduino编程中,大多数初学者的while循环都是错误的。 特别是,如果你觉得有必要打破它们。 Arduino环境提供了一个loop()函数原型,您应该正确使用它

    通常,任何
    while(){…}
    都可以替换为
    if(){…}
    ,在下一次循环()运行中再次调用该函数。有时,您需要更多的状态变量,但重要的变化是遵循这样一种范式:loop()不应该花费明显的时间来运行,也不应该通过在loop()中逐个列出它们来描述顺序操作。
    基本的BlinkWithoutDelay示例适用于所有地方,而不仅仅适用于闪烁。重要的部分不仅仅是调用
    millis()
    ,而是将草图的状态保存在适当的变量中(如
    previousmillis

    好吧,如果您的意思是它在
    循环中停留(微秒()<(微秒+采样周期)
    超过3秒,然后该条件在3秒以上为真。What's
    micros()
    ,以microsecs为单位获取当前时间?您的代码不显示分配了
    采样周期\u us
    的位置。看来
    采样周期\u us
    分配不正确。非常感谢。这就是解决办法。我不知道为什么我认为currentMilllis会更新millis()的所有内容。