从arduino pin收集特定的时间间隔

时间:2013-06-28 22:21:24

标签: loops time arduino sampling

我想在特定的时间内(例如60秒)运行我的Arduino并收集 来自模拟引脚的数据具有特定的采样率(比如每秒四个采样)。 我在matlab中使用了代码...但我想使用arduino环境。 请帮我转换它。

a_pin = 0;

fs = 4;   % sampling frequency (samplings per second)
mt = 20;  % time for measurements

ind = 1;
nind = 1;
last_beep = 0;
tic;
while toc < mt

    time(ind) = toc;
    v(ind) = a.analogRead(a_pin);

    % wait for appropriate time for next measurement
    while( nind == ind )
        nind = floor(toc*fs) + 1;
    end
    ind = nind;

end

好的,这是我到目前为止的草图。这是否会持续10秒钟 每5个读数?

int sensePin = 0;
unsigned long starttime = 0;
unsigned long endtime = 0;
int i = 0;
int n;
const int sizeofv = 50;
int v[sizeofv];

void setup(){
    pinMode(sensePin, INPUT);
    Serial.begin(9600);
}

void loop() {
    starttime = millis();
    endtime = starttime; 

    while ((endtime - starttime) <= 10000) // do this loop for up to 1000mS
    {
        i = i + 1;
        v[i] = analogRead(sensePin);
        endtime = millis();
        delay(5000);
    }  

    for(n=0; n < sizeofv; n++)
    {
        Serial.print(v[n]);
        Serial.print('\n');
    }
    while(1) { }
}

2 个答案:

答案 0 :(得分:0)

我建议使用SimpleTimer库,它会为您完成所有工作并且经过道路验证。

答案 1 :(得分:0)

  • 您的代码中有一个错误,您在分配第一个值之前递增i。因此,当您循环遍历v[]数组时,您将最终打印v[0],这将具有未定义的值,并且您永远不会打印最后记录的v值(如果你没有最终溢出缓冲区并在其边界外写字。)

  • 你的代码有一个小问题,那就是你需要以10000结束它的条件,并且你做了两次5000的延迟。理论上它看起来不错,但在实践中,你可能会有一个惊喜只有一个值。那是因为代码需要时间来执行,analogRead()特别慢。

我认为在loop()函数中使用循环会使事情变得更复杂,并且几乎没有灵活性。因此,您可以尝试另一种方法,根据一些简单的计算,仅通过跟踪循环的状态来使用loop()

#define TIME_WINDOW 10000
#define NB_STEPS 2

void setup() {
    // ...
    endtime = millis();
}

bool over = false;
void loop() {
    if (!over) {
        curtime = endtime - millis();

        // get in this block for up to 1000mS
        if (curtime <= TIME_WINDOW) {
            v[i] = analogRead(sensePin);
            // increments only once when 5000 has been reached.
            if ((curtime / (TIME_WINDOW/NB_STEPS)) != i)
                i = (curtime / (TIME_WINDOW/NB_STEPS));
        } else {
            for(n=0; n < NB_STEPS; n++)
                Serial.println(v[n]);
            over = true;
        }
    }
}

我没有测试我的代码,所以它可能会失败或有拼写错误,但想法如下:

  • 我们定义时间窗口和度量步骤数
  • ,时间窗口未结束:
    • 以当前索引
    • 将测量值存储在当前数组中
    • 如果time_window上的花费时间的整数除法与当前索引不同
      • 将新值存储到当前索引
      • 例如:i = 4000/(10000/2) <=> i = 4000/5000 <=> i = 0i = 6000/(10000/2) <=> i = 1
  • 时间窗口结束时:
    • 打印出每个结果
    • 设置为true,因此我们不会再次进入循环

但对您而言,更简单(非灵活)的解决方案是:

void setup() {
    int value1, value2, value3, value4;
    value1 = analogRead(sensePin);
    delay(2500);
    value2 = analogRead(sensePin);
    delay(2500);
    value3 = analogRead(sensePin);
    delay(2500);
    value4 = analogRead(sensePin);
    Serial.println("first value: %d", value1);
    Serial.println("second value: %d", value2);
    Serial.println("third value: %d", value3);
    Serial.println("fourth value: %d", value4);
}

你有解决方案!

HTH