【发布时间】:2016-11-11 18:50:13
【问题描述】:
我正在使用 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 循环后,我每 3000 毫秒从 serial.print 监视器获得这些结果:
小时数 1 小时数 2 小时数 3 ...依此类推,直到: 小时数 198 号码o
注意:第 199 条实际上是这样打印的。
激活 for 循环后,串行监视器上的结果如下所示:
小时数 1 旋转次数,小时 0;0 正数,小时 0;0 小时数 2 旋转次数,小时 0;0 正数,小时 0;0 旋转次数,小时 1;0 正数,小时 1;0 小时数 3 旋转次数,小时 0;0 正数,小时 0;0 旋转次数,小时 1;0 正数,小时 1;0 旋转次数,小时 2;0 正数,小时 2;0 小时数 4
除非这一直持续到 200 小时,这需要比 300 毫秒长得多的时间。然后它会暂停,然后重新开始。如何解决 numberofhours 计数问题,以便将 counter 和 greenCounter 的所有结果存储在数组中与 numberofhours 变量对应的适当位置?
【问题讨论】:
-
问题其实很简单,当
numberofhours大于199时,你试图写出unsigned long spins[200]并产生na异常。如果您想继续,最好的办法是通过将spins[numberofhours]=counter;替换为spins[(numberofhours % 200)]=counter;(positives[]相同)来管理循环访问。 -
感谢您的回复。我尝试了您建议的编辑,但 for 循环仍然被注释掉,输出是“如果小时数 x 的数字”,其中 x 似乎随着永恒时钟或其他东西的增加而增加。在不到 1 分钟的时间内,该值就超过了 10,000。似乎一旦输入 if 语句,它就不会退出,而是按预期每 3000 毫秒增加一次 numberofhours
-
这个错误肯定是由于分配错误
timer==millis();而不是timer=millis();。 -
非常感谢!像这样的错误让我失去理智。我真的不能感谢你!
标签: c++ arrays for-loop arduino