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以
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'smicros()
,以microsecs为单位获取当前时间?您的代码不显示分配了采样周期\u us
的位置。看来采样周期\u us
分配不正确。非常感谢。这就是解决办法。我不知道为什么我认为currentMilllis会更新millis()的所有内容。