2016-11-11 81 views
0

我使用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变量相对应的适当位置?

+0

问题很简单,当'numberofhours'大于199时,你试图写出'unsigned long spin [200]'并生成一个异常。如果你想继续,最好的办法可能是通过'spins [(numberofhours%200)] = counter;'('positives []')来替换'spins [numberofhours] = counter;'来管理循环访问。 –

+0

谢谢你的回复。我试着用for循环提示的编辑仍然被注释掉,输出是“Number If Hours x”,其中x似乎随着永恒时钟或某物增加。在不到1分钟的时间内,该值就高于10,000。这似乎是一旦if语句被输入,它不会退出,而不是按照预期每3000ms增加一次数字 –

+0

错误肯定是由于错误的赋值'timer == millis();'而不是'timer = millis() ;'。 –

回答

0

您不断重置您的计数器。在if语句中移动重置。

您的代码中似乎缺少某些东西。你在哪里修改counter和greenCounter?此外,数字小时将增加到199以上,您将索引数组的边界。您可能还想添加Serial.println()以使输出更易于阅读。

+0

感谢您的回复。计数器和greenCounter变量实际用于计算相应模拟电压引脚越过并在设定阈值以下的次数。这段代码完全按照预期工作,我将问题隔离到了这一部分,因此我仅用时序和阵列线做了一个新的草图。 –