2016-11-11 6 views
0

私はArduino UnoとCDを使用して、読み取られたCDの上端と下端にセンサーを取り付けてArduinoのアナログポートに接続し、サンプルが通過するたびにカウントします。アナログ入力を使用して信号がハイになり、信号がローになるとカウントします(デジタル信号の立ち下がりエッジをカウントするなど)。私は結果を1時間に1回表示してから、カウンタをリセットして、古い値を配列に格納したいとします。これらの値はかなり大きいので、配列と数値を符号なしlongとして宣言しました。私は自分のコードをトラブルシューティングし、特定の時間間隔で結果を表示し、配列の適切な値を格納する以外はすべて動作します。以下は、私はプログラムのこの特定のセクションをテストするために書いたコードです:forループをコメントアウトして特定の時間間隔でのシリアル印刷変数アレイが使用されていない場合でもアレイのサイズを出力します

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; 

    } 

が、私はすべての3000ミリ秒serial.printモニタから、これらの結果を得る:時間の

数ように時間3 の2 数...この時間までの1つの 数:営業時間の 数は

注O 198 番号:199は、実際にこのように印刷します。このようなシリアルモニタの外観上のループアクティブなため、結果と

時間スピン、時間0の1つの 数の数; Postives、時間0の0 数、時間2の0 数スピン、時間0の 数; Postives、時間0の0 数、スピン、時間1の0 数; Postives、時間1の0 数、時間0 数スピン、時間0の3 数0 ポストの数、時0; 0 スピンの数、時1; 0 Postives、時間1の数、スピン、時間2の0 数; Postives、時間2の0 数、時間の0 数4

これは非常に長い時間がかかり時間200、までのすべての方法を継続除き300ms以上。その後、一時停止してから、もう一度やり直します。 numberofhoursのカウント問題を解決するにはどうすればいいですか?countofhours変数に対応する配列の適切な場所にカウンタとgreenCounterのすべての結果を格納できますか?

+0

問題は本当に簡単です。 'numberofhours'が199より大きい場合、' unsigned long spins [200] 'から書き出して、NA例外を生成しようとしています。続行したいのであれば、 'spins [numberofhours] = counter;を' spins [(numberofhours%200)] = counter; '(positives []'と同じ)に置き換えることで循環アクセスを管理するのが最善の方法です。 –

+0

返信いただきありがとうございます。私はあなたがコメントしたforループを使って提案した編集を試してみました。出力は、xが永遠の時計などで増加しているように見える "Number if Hours x"です。値は1分未満で10,000よりも高くなっています。一度if文が入力されると、3000秒ごとに1回ずつnumberofhoursをインクリメントするのではなく終了します。 –

+0

エラーは確かに 'timer == millis();の代わりに' timer == millis(); ' ; '。 –

答えて

0

カウンターを継続的にリセットしています。 if文の中でリセットを移動します。

コードに何かがないようです。あなたはcounterとgreenCounterをどこで修正していますか?また、numerofhoursは199を超えて増加し、配列の範囲外のインデックスを作成します。 Serial.println()を追加して、出力を読みやすくすることもできます。

+0

お返事ありがとうございます。 counterとgreenCounter変数は実際には、対応するアナログ電圧ピンが設定されたスレッショルドを超えて下回る時間の数をカウントするために使用されます。このセクションは期待どおりに機能し、このセクションで問題を切り分けました。そこで、タイミングと配列のラインだけで新しいスケッチを作成しました。 –

関連する問題