2016-11-11 70 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變量實際用於計算相應模擬電壓引腳越過並在設定閾值以下的次數。這段代碼完全按照預期工作,我將問題隔離到了這一部分,因此我僅用時序和陣列線做了一個新的草圖。 –