我有一个快速的问题,我认为更有经验的固件开发人员将可以帮助我。因此,此代码的主要目标是:
运行一个循环(检测),它将“监听”发生的事情,一旦达到该阈值,便增加一个变量(在这种情况下为伏特计数)。一旦在指定时间内两次击中伏特计数,采样循环中的第一个while循环将更加紧密地监听(通过FFT)。
然后,当在特定时间段内(本例中为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。然后将设置为previousMillis
1500,因为millis()
第二次调用。然后,您输入第一个while循环,并在其末尾检查是否currentMillis - previousMillis > 3000
。但这永远都不是正确的,因为previouslMillis
它的价值大于currentMillis
。我想您可以做的是currentmillis
在检查差异是否大于3000之前先阅读正确的内容。
if (millis() - previousMillis > 3000){
voltscount = 0;
break;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句