我想在特定的时间内(例如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) { }
}
答案 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;
}
}
}
我没有测试我的代码,所以它可能会失败或有拼写错误,但想法如下:
i = 4000/(10000/2) <=> i = 4000/5000 <=> i = 0
和i = 6000/(10000/2) <=> i = 1
但对您而言,更简单(非灵活)的解决方案是:
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