我使用Arduino Uno和CD通过将传感器连接到读取的CD的顶部和底部来模拟装配线进入Arduino模拟端口并在每次样品通过时计数。它使用模拟输入来记录信号变高,并在信号变低时计数,如计数数字信号的后沿。我想每小时显示一次结果,然后重置计数器,同时将旧值存储在数组中。这些值非常大,所以我将数组和数字声明为无符号长整数。我麻烦我的代码,除了以特定的时间间隔显示结果并存储数组的适当值之外,其他所有工作都是有效的。下面是我写的测试程序的这个特定部分的代码:在特定时间打印串行打印变量间隔即使未使用阵列打印阵列大小
unsigned long spins[200];
unsigned long positives[200];
unsigned long counter=0;
unsigned long greenCounter=0;
int numberofhours=0;
int timer=0;
int hour=3000;
void setup() {
Serial.begin(115200);
}
void loop() {
timer==millis();
if (timer%hour==0){ //if the timer reaches 1 hour, it will print the results, store old and clear values for positive tests and CD spins, and print old values
numberofhours++;
spins[numberofhours]=counter;
positives[numberofhours]=greenCounter;
Serial.print("\n Number of Hours");
Serial.print(" ");
Serial.print(numberofhours);
/* for(int i=0; i<numberofhours; i++){
Serial.print("\n Number of Spins, Hour");
Serial.print(" ");
Serial.print(i);
Serial.print(";");
Serial.print(spins[i]);
Serial.print("\n Number of Postives, Hour");
Serial.print(" ");
Serial.print(i);
Serial.print(";");
Serial.print(positives[i]);
} */
}
counter=0;
greenCounter=0;
}
在for循环注释掉,我得到这些结果来自serial.print监控每3000毫秒:
小时数1张 小时数的2 小时数3 的......以此类推,直到这个: 小时数198 标记O
注:第199实际打印这样的。
随着串行监控这个样子的for循环活性,结果:
小时1周 数旋转时,第0小时的的数量; 0 Postives,小时数0; 0 小时2数 数旋转时,第0小时的0 Postives,小时数0; 0 旋转,小时数1; 0 Postives,小时数1; 0 小时3 旋转,小时数0的数量; 0 小时数,小时0; 0 转数,小时1; 0 Postives,小时1的数; 0 旋转,小时2的数; 0 Postives数,小时2; 0 小时数4
除了这持续到每小时200一路,这花费更长的时间超过300毫秒。然后暂停,然后重新开始。如何修复numberofhours counting问题,以便我可以将计数器和greenCounter的所有结果存储在数组中与numberofhours变量相对应的适当位置?
问题很简单,当'numberofhours'大于199时,你试图写出'unsigned long spin [200]'并生成一个异常。如果你想继续,最好的办法可能是通过'spins [(numberofhours%200)] = counter;'('positives []')来替换'spins [numberofhours] = counter;'来管理循环访问。 –
谢谢你的回复。我试着用for循环提示的编辑仍然被注释掉,输出是“Number If Hours x”,其中x似乎随着永恒时钟或某物增加。在不到1分钟的时间内,该值就高于10,000。这似乎是一旦if语句被输入,它不会退出,而不是按照预期每3000ms增加一次数字 –
错误肯定是由于错误的赋值'timer == millis();'而不是'timer = millis() ;'。 –