1

我想运行我的 Arduino 一段特定的时间(比如 60 秒),并以特定的采样率(比如每秒四个样本)从模拟引脚收集数据。我得到了在 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) { }
}
4

2 回答 2

0

我推荐使用SimpleTimer库,它可以为您完成所有工作,并且经过验证。

于 2013-07-01T14:08:48.087 回答
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);
}

你得到了你的解决方案!

高温高压

于 2013-07-01T15:17:39.307 回答