我使用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() ;'。 –